1、-An introduction to beginnersGPU&CUDA内容n n1 GPU1 GPU高性能计算高性能计算n n2 CUDA2 CUDA架构架构n n3 CUDA3 CUDA环境搭建环境搭建n n4 CUDA4 CUDA简单例子简单例子1.GPU高性能计算n nGPU:GPU:从图形处理到通用计从图形处理到通用计算算nGPU:Graphic GPU:Graphic Processing Processing UnitUnitnGPUGPU为高度并行为高度并行的的实时实时3D3D渲染计算渲染计算而而设计设计,高高GFLOPSGFLOPS,高带宽高带宽n3D3D渲染技术及渲染技术
2、及3D 3D APIAPI的的发展发展,促进促进GPUGPU向通用向通用计算计算处处理器发展理器发展nNVIDIA NVIDIA GPUGPU为通用为通用计算专门优化计算专门优化设计设计,于于20072007年推出年推出CUDACUDAGPU多”核”:SM真正意义的变革通用计算重要突破GPU通用计算开始出现GeForce 8800GeForce 6800GeForce 3GeForce 256世界上第一个GPU1.GPU高性能计算n nGPU GPU VSVS CPU:CPU:计算能力计算能力8x double precisionECCL1,L2 Caches1 TF Single Preci
3、sion4GB MemoryNVIDIA GPUX86 CPU1.GPU高性能计算n nGPUGPU VSVS CPU:CPU:硬件体系硬件体系n目标:最小的指令延迟n巨大的缓存n复杂的控制逻辑n目标:最大吞吐量n更多寄存器、高带宽n通过线程轮换隐藏延迟n多个线程共享控制逻辑1.GPU高性能计算n nGPUGPU应用领域应用领域n用同一计算方法对很大量的数据进行并行计算用同一计算方法对很大量的数据进行并行计算n数据相关度低数据相关度低n计算密度大,计算所花的时间比数据存储的时计算密度大,计算所花的时间比数据存储的时间大得间大得多多1.GPU高性能计算n nGPUGPU关键概念关键概念nSM:S
4、tream MultiprocessorSM:Stream MultiprocessornSP:Stream ProcessorSP:Stream Processorn n每个每个SMSM包含包含8 8个个SPSP,由由SMSM取指取指,解码解码,发射到各个发射到各个SP,SP,n nGPUGPU可看作是一组可看作是一组SMSMnSMEM:shared memory,GPUSMEM:shared memory,GPU片内每个片内每个SMSM所占所占有的高速存储器有的高速存储器nGlobal memory:GPUGlobal memory:GPU板载显存板载显存2.CUDA架构n nCUDA C
5、ompute Unified Device ArchitectureCUDA Compute Unified Device Architecturen由由NVIDIA NVIDIA 20072007年推出年推出的通用并行计算的通用并行计算架构架构n第一种不需要借助图形学第一种不需要借助图形学APIAPI就可以使用类就可以使用类C C语语言极性通用计算的开发环境和软件体系言极性通用计算的开发环境和软件体系n在采用了统一在采用了统一架构的架构的GPUGPU上运行上运行nNVIDIANVIDIA提供完全免费的提供完全免费的CUDACUDA开发工具包和开发工具包和SDKSDKn对标准对标准C C语言的
6、简单语言的简单扩展扩展,以最小的扩展集实现以最小的扩展集实现CUDACUDA架构架构2.CUDA架构n n存储器模型存储器模型nThreadThread私有私有registerregister (RW)(RW)nThreadThread私有私有local local memorymemory (RW)(RW)nBlockBlock的的shared shared memory memory(RW)(RW)nGridGrid的的global global memory memory(RW)(RW)nGridGrid的的constant constant memory memory(RO)(RO)n
7、GridGrid的的texture texture memory memory (RO)(RO)nHostHost可以通过可以通过APIAPI完完成显存成显存与主存交互与主存交互2.CUDA架构n n线程组织模型线程组织模型n每个内核程序每个内核程序 (KernelKernel)包包含非常多的线程含非常多的线程n所有线程执行相同的顺序所有线程执行相同的顺序程序程序n层次结构:层次结构:Grid Grid Block Block ThreadThreadn线程被划分成线程块线程被划分成线程块 (Block)(Block)n同一线程块内的线程可以同一线程块内的线程可以通过共享通过共享SMSM资源相
8、互协作资源相互协作n每个线程和线程块拥有唯每个线程和线程块拥有唯一一IDIDn通过内建变量读取通过内建变量读取2.CUDA架构n n线程映射线程映射nThreadThread SPSPnBlockBlock SM SMnGrid Grid GPU GPUn把把GPUGPU看作一个包含很多个核心的多核处理器看作一个包含很多个核心的多核处理器n有自己的本地存储器有自己的本地存储器n大量的线程并行执行大量的线程并行执行n每个线程拥有私有变量每个线程拥有私有变量/存储区域存储区域n线程之间拥有共享的存储区域线程之间拥有共享的存储区域n与与CPUCPU的的差别差别:GPUGPU的线程是轻量级的(代码少,
9、的线程是轻量级的(代码少,硬件轮换,资源负担小);需要很大量的线程硬件轮换,资源负担小);需要很大量的线程才能使才能使GPUGPU满载满载2.CUDA架构n nCPU/GPUCPU/GPU异构并行模型异构并行模型n由由CPUCPU端端 (主机端主机端)传送传送参数参数及配置及配置KernelKernel的的执行执行 (BlockBlock,ThreadThread数量数量,尺寸等尺寸等)nKernelKernel在在GPUGPU (设备端设备端)上执上执行行n显存显存分配分配,显显存与存与PCPC主存间主存间的交互通过的交互通过APIAPI完成完成2.CUDA架构n nCUDA CCUDA C
10、扩展扩展:编译器编译器nvccnvccnCUDACUDA源程序源程序 -CU-CU文件文件n编译器驱动编译器驱动n分离主机端源代码和设备端源代码分离主机端源代码和设备端源代码n编译设备端源代码到编译设备端源代码到GPUGPU汇编代码(汇编代码(PTXPTX)或)或GPUGPU二进制代码(二进制代码(CUBINCUBIN)n把最终把最终GPUGPU代码包裹在主机端源代码中代码包裹在主机端源代码中n nCUDA CCUDA C扩展扩展:API:APInDriver Driver API API 调用调用KernelKernel较繁琐较繁琐nRuntime Runtime API API 较方便较方
11、便2.CUDA架构n nCUDA CCUDA C扩展扩展:函数限定符函数限定符n_global_global_ GPU _ GPU KernelKernel代码代码,由由CPUCPU发起发起,返回返回voidvoid,不能不能由由其它其它KernelKernel调用调用n_device_device_ _ 由由GPU KernelGPU Kernel调用的调用的函数函数,不能不能由由CPUCPU发起发起n_host_host_ _ 在在CPUCPU上执行的上执行的函数函数n nCUDA CCUDA C扩展扩展:变量限定符变量限定符n_constant_ _constant_ 变量位于常数存储器
12、变量位于常数存储器n_shared_ _shared_ 变量位于共享存储器变量位于共享存储器2.CUDA架构n nCUDA CCUDA C扩展扩展:内建变量内建变量n无需定义无需定义/声明声明,直接在直接在kernelkernel中调用中调用ndim3 dim3 gridDimgridDim;/Grid;/Grid尺寸尺寸ndim3 dim3 blockDimblockDim;/Block;/Block尺寸尺寸ndim3 dim3 blockIdxblockIdx;/Block ID;/Block IDndim3 dim3 threadIdxthreadIdx;/Thread;/Thread
13、点点n nCUDA CCUDA C扩展扩展:执行配置执行配置n调用调用:my_kernel :my_kernel (.);(.);n实际是为实际是为gridDimgridDim和和blockDimblockDim赋值赋值n决定当前线程需要处理的数据和结果存储的位决定当前线程需要处理的数据和结果存储的位置置2.CUDA架构n nCUDACUDA存储器管理存储器管理nGPUGPU与与CPUCPU独立编址独立编址nGPUGPU与与CPUCPU数据交互通过数据交互通过PCIePCIe总线总线n在主机端通过在主机端通过APIAPI去分配去分配/复制复制/销毁销毁GPUGPU上的存上的存储器储器空间空间n
14、GPUGPU存储器操作存储器操作APIAPI(详见详见CUDACUDA参考手册参考手册)n n存储空间开辟存储空间开辟:cudaMalloccudaMalloc等等n n存储空间初始化存储空间初始化:cudaMemsetcudaMemset等等 n n存储空间存储空间:cudaFreecudaFree等等n n存储空间拷贝存储空间拷贝cudaMemcpycudaMemcpy等等2.CUDA架构n nCUDACUDA程序结构程序结构内存/显存开辟主机端准备数据数据导入GPU调用kernel函数计算取回计算结果主机端后期处理主机端代码(串行)设备端代码(并行)主机设备通信3.CUDA环境搭建n n
15、所需组件所需组件nCUDACUDA完全免费完全免费,各种操作系统下的各种操作系统下的CUDACUDA安装安装包均可以在包均可以在http:/ n1.Windows1.Windowsn环境要求环境要求:Microsoft Visual Stadio 2005 Microsoft Visual Stadio 2005 及其以及其以后版本后版本n(1)(1)依次安装依次安装:显卡驱动显卡驱动ToolkitToolkitSDKSDKn(2)(2)语法高亮语法高亮n n到到SDKSDK安装目录下安装目录下,doc,doc syntax_highlighting syntax_highlighting v
16、isual_studio_8,visual_studio_8,将将其中的其中的usertype.datusertype.dat文件复制到文件复制到Microsoft Visual Studio Microsoft Visual Studio 8Common7IDE8Common7IDE下下.n n启动启动VS2005,VS2005,工具工具选项选项文本编辑器文本编辑器文件扩展名文件扩展名.在右边的在右边的“扩展扩展名名”对应的栏里输入对应的栏里输入“cu”;“cu”;“编辑器编辑器”选择选择 “Microsoft Visual C+”,“Microsoft Visual C+”,“添加添加”“
17、确定确定”重重启启VS2005VS2005n(3)(3)设置设置VS2005VS2005环境环境n n打开打开VS2005VS2005,工具,工具选项选项项目和解决方案项目和解决方案VC+VC+目录目录“显示以显示以下内容的目录下内容的目录”n n “包含文件包含文件”:”:分别添加分别添加ToolkitToolkit和和SDKSDK的文件包含目录的文件包含目录n n“库文件库文件”:”:分别添加分别添加ToolkitToolkit和和SDKSDK的库目录的库目录n n“源文件源文件”:”:添加添加SDKSDK源文件目录源文件目录3.CUDA环境搭建n n1.Windows1.Windowsn
18、(4)(4)编译定义编译定义n n工程源文件工程源文件 属性属性 常规常规 工具工具 自定义生产工具自定义生产工具,在以下项添加在以下项添加相应内容相应内容:n n“命令行命令行”:$(CUDA_BIN_PATH)nvcc.exe-ccbin$(VCInstallDir)bin”:$(CUDA_BIN_PATH)nvcc.exe-ccbin$(VCInstallDir)bin-c-D_DEBUG-DWIN32-D_CONSOLE-D_MBCS-Xcompiler-c-D_DEBUG-DWIN32-D_CONSOLE-D_MBCS-Xcompiler/EHsc,/W3,/nologo,/Wp64
19、,/Od,/Zi,/RTC1,/MTd-/EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd-I$(CUDA_INC_PATH)-o$(ConfigurationName)$(InputName).obj I$(CUDA_INC_PATH)-o$(ConfigurationName)$(InputName).obj$(InputFileName)$(InputFileName)n n“输出输出”:$(ConfigurationName)$(InputName).obj”:$(ConfigurationName)$(InputName).objn n“附加依赖项附
20、加依赖项”:$(InputName)_kernel.cu”:$(InputName)_kernel.cun n右键工程名右键工程名 属性属性,打开链接器打开链接器,在以下项做相应修改在以下项做相应修改n n“启用增量链接启用增量链接”:”:否否(/INCREMENTAL:NO(/INCREMENTAL:NO)n n“附加库目录附加库目录”:”:改为改为 “$(CUDA_LIB_PATH“$(CUDA_LIB_PATH)”)”n n “链接器链接器”子项子项 “输入输入”:“”:“附加依赖项附加依赖项”中输入中输入cudart.libcudart.lib3.CUDA环境搭建n n2.Linux
21、(Fedora,Redhat,Ubuntu)2.Linux (Fedora,Redhat,Ubuntu)n环境要求环境要求:gcc:gcc编译器编译器n(1)(1)进入进入LinuxLinux文本界面文本界面n(2)(2)安装三个组件安装三个组件(具体版本具体输入具体版本具体输入)n nsh NVIDIA-Linux-x86_64-180.22-pkg2.runsh NVIDIA-Linux-x86_64-180.22-pkg2.runn nsh cudatoolkit_2.1_linux64_rhel5.2.runsh cudatoolkit_2.1_linux64_rhel5.2.runn
22、 nsh cuda-sdk-linux-2.10.1215.2015-3233425.runsh cuda-sdk-linux-2.10.1215.2015-3233425.runn(3)(3)在在.bash_profile.bash_profile中添加中添加:n nPATH=$PATH:/binPATH=$PATH:/binn nLD_LIBRARY_PATH=$LD_LIBRARY_PATH:CUDA_INSTALL_PATLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64H/lib64n nexport PATH export PATH n nexport
23、LD_LIBRARY_PATH export LD_LIBRARY_PATH n n其中其中:为实际安装路径为实际安装路径4.例子GPU并行矢量求和n n算法描述算法描述n将两个将两个N N维矢量相加维矢量相加,即对应元素相加即对应元素相加:c ci i=a=ai i+b+bi i i i0,N)0,N)n n并行算法设计并行算法设计n每个每个GPUGPU线程负责一个维度的相加线程负责一个维度的相加nGPUGPU线程数目线程数目 M M N Na0b0c0Th0aN-1bN-1cN-1ThN-1a1b1c1Th1a2b2c2Th0abcThThThMabc4.例子GPU并行矢量求和n n预处理
24、部分预处理部分n ncuda_runtime.h:CUDAcuda_runtime.h:CUDA运行时库运行时库4.例子GPU并行矢量求和n n内核函数内核函数n返回值类型必须包括返回值类型必须包括 _global_ void_global_ voidn内核函数定义的是每一个线程的行为内核函数定义的是每一个线程的行为,所有线程所有线程并发执行并发执行n操作操作目标通过当前线程在线程结构中的位置而目标通过当前线程在线程结构中的位置而确定确定n该问题中所有线程均只执行一次加法该问题中所有线程均只执行一次加法,总计算时总计算时间为执行间为执行67706770行代码一次所需时间行代码一次所需时间4.例
25、子GPU并行矢量求和n n主函数主函数(part-1)(part-1)使用线程结构的x维度,88一共64个线程h_前缀表示变量位于Host端存储器d_前缀表示变量位于Device端存储器还有多种其他开辟方式4.例子GPU并行矢量求和n n主函数主函数(part-2)(part-2)推荐参考n n书籍书籍/资料资料:nNVIDIA CUDA Programming GuideNVIDIA CUDA Programming GuidenThe CUDA Compiler Driver NVCCThe CUDA Compiler Driver NVCCnGet Started NVIDIA CUDA C Installation and Get Started NVIDIA CUDA C Installation and Verification on LinuxVerification on LinuxnCUDA by exampleCUDA by examplenGPUGPU高性能计算之高性能计算之CUDACUDAn深入浅出谈深入浅出谈CUDACUDAn n网站网站/论坛论坛n http:/ http:/