CUDA编程(1)周斌@NVIDIA&USTC2014年10月致谢某些幻灯片来自DavidKirk和Wen-meiHwu’sUIUC课件大部分幻灯片来自PatrickCozziUniversityofPennsylvaniaCIS565GPU架构概览GPU特别适用于密集计算,高度可并行计算图形学晶体管主要被用于:执行计算而不是:缓存数据控制指令流GPU架构概览晶体管用途Imagefrom:让我们开始用CUDA来编程!GPU计算的历史2001/2002–研究人员把GPU当做数据并行协处理器GPGPU这个新领域从此诞生2007–NVIDIA发布CUDACUDA–全称ComputeUniformDeviceArchitecture统一计算设备架构GPGPU发展成GPUComputing2008–Khronos发布OpenCL规范CUDA的一些信息层次化线程集合Ahierarchyofthreadgroups共享存储Sharedmemories同步BarriersynchronizationCUDA术语Host–即主机端通常指CPU采用ANSI标准C语言编程Device–即设备端通常指GPU(数据可并行)采用ANSI标准C的扩展语言编程Host和Device拥有各自的存储器CUDA编程包括主机端和设备端两部分代码CUDA术语Kernel–数据并行处理函数通过调用kernel函数在设备端创建轻量级线程线程由硬件负责创建并调度类似于OpenGL的shader?CUDA核函数(Kernels)在N个不同的CUDA线程上并行执行ThreadIDExecutionConfigurationDeclarationSpecifierCUDA程序的执行Imagefrom:线程层次ThreadHierarchiesGrid–一维或多维线程块(block)一维或二维Block–一组线程一维,二维或三维一个Grid里面的每个Block的线程数是一样的block内部的每个线程可以:同步synchronize访问共享存储器sharedmemory线程层次ThreadHierarchiesImagefrom:线程层次ThreadHierarchiesBlock–一维,二维或三维例如:索引数组,矩阵,体线程层次ThreadHierarchiesThreadID:Scalarthreadidentifier线程索引:threadIdx一维Block:ThreadID==ThreadIndex二维Block(Dx,Dy)ThreadIDofindex(x,y)==x+yDy三维Block(Dx,Dy,Dz)ThreadIDofindex(x,y,z)==x+yDy+zDxDy线程层次ThreadHierarchies1ThreadBlock2DBlock2DIndex线程层次ThreadHierarchiesThreadBlock线程块线程的集合G80andGT200:多达512个线程Fermi:多达1024个线程位于相同的处理器核共享所在核的存储器线程层次ThreadHierarchiesThreadBlock线程块线程的集合G80andGT200:多达512个线程Fermi:多达1024个线程位于相同的处理器核心(SM)共享所在核心的存储器Imagefrom:线程层次ThreadHierarchies块索引:blockIdx维度:blockDim一维或二维或三维2DThreadBlock16x16Threadsperblock线程层次ThreadHierarchies例如:N=32每个块有16x16个线程(跟N无关)threadIdx([0,15],[0,15])Grid里面有2x2个线程块BlockblockIdx([0,1],[0,1])blockDim=16i=[0,1]*16+[0,15]线程层次ThreadHierarchies线程块之间彼此独立执行任意顺序:并行或串行被任意数量的处理器以任意顺序调度处理器的数量具有可扩展性线程层次ThreadHierarchiesImagefrom:线程层次ThreadHierarchies一个块内部的线程共享容量有限的低延迟存储器同步执行合并访存__syncThreads()Barrier–块内线程一起等待所有线程执行都某处语句轻量级Imagefrom:线程层次ThreadHierarchiesCUDA内存传输Imagefrom:Host可以从device往返传输数据Globalmemory全局存储器Constantmemory常量存储器Imagefrom:内存传输cudaMalloc()在设备端分配globalmemorycudaFree()释放存储空间Imagefrom:内存传输Codefrom:内存传输Codefrom:内存传输Codefrom:内存传输cudaMemcpy()内存传输HosttohostHosttodeviceDevicetohostDevicetodeviceHostDeviceGlobalMemoryCUDA内存传输Codefrom:内存传输Codefrom:(host)Destination(device)CUDA内存传输Codefrom:内存传输MatrixMultiply矩阵相乘算法提示向量点乘行优先或列优先?每次点乘结果输出一个元素MatrixMultiply矩阵相乘样例Imagefrom:P=M*N假定MandN是方阵1,000x1,000矩阵1,000,000点乘Each1,000multiplesand1,000addsMatrixMultiply矩阵相乘样例MatrixMultiply:CPU实现Codefrom:(float*M,float*N,float*P,intwidth){for(inti=0;iwidth;++i)for(intj=0;jwidth;++j){floatsum=0;for(intk=0;kwidth;++k){floata=M[i*width+k];floatb=N[k*width+j];sum+=a*b;}P[i*width+j]=sum;}}MatrixMultiply:CUDA算法框架Codefrom:::CUDA算法框架Codefrom::CUDA算法框架第1步在算法框架中添加CUDAmemorytransfersMatrixMultiply:CUDA算法框架MatrixMultiply:数据传输Codefrom:分配输入MatrixMultiply:数据传输Codefrom:分配输出MatrixMultiply:数据传输Codefrom: