《《CUDAGPU入门介绍》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《CUDAGPU入门介绍》PPT课件.ppt(27页珍藏版)》请在金锄头文库上搜索。
1、-An introduction to beginnersGPU & CUDA内容n1 GPU高性能计算n2 CUDA架构n3 CUDA环境搭建n4 CUDA简单例子1. GPU高性能计算nGPU: 从图形处理到通用计算nGPU: Graphic Processing UnitnGPU为高度并行的实时3D渲染计算而设计, 高GFLOPS , 高带宽n3D渲染技术及3D API的发展, 促进GPU向通用计算处理器发展nNVIDIA GPU为通用计算专门优化设计, 于2007年推出CUDAGPU多”核”:SM真正意义的变革通用计算重要突破GPU通用计算开始出现GeForce8800GeForce6
2、800GeForce3GeForce256世界上第一个GPU1. GPU高性能计算nGPU VS CPU: 计算能力8x double precisionECCL1, L2 Caches1 TF Single Precision4GB MemoryNVIDIA GPUX86 CPU1. GPU高性能计算nGPU VS CPU: 硬件体系n目标: 最小的指令延迟n巨大的缓存n复杂的控制逻辑n目标: 最大吞吐量n更多寄存器、高带宽n通过线程轮换隐藏延迟n多个线程共享控制逻辑1. GPU高性能计算nGPU应用领域n用同一计算方法对很大量的数据进行并行计算n数据相关度低n计算密度大,计算所花的时间比数
3、据存储的时间大得多1. GPU高性能计算nGPU关键概念nSM: Stream MultiprocessornSP: Stream Processorn每个SM包含8个SP, 由SM取指, 解码, 发射到各个SP, nGPU可看作是一组SMnSMEM: shared memory, GPU片内每个SM所占有的高速存储器nGlobal memory: GPU板载显存2. CUDA架构nCUDA Compute Unified Device Architecturen由NVIDIA 2007年推出的通用并行计算架构n第一种不需要借助图形学API就可以使用类C语言极性通用计算的开发环境和软件体系n在
4、采用了统一架构的GPU上运行nNVIDIA提供完全免费的CUDA开发工具包和SDKn对标准C语言的简单扩展, 以最小的扩展集实现CUDA架构2. CUDA架构n存储器模型nThread私有register (RW)nThread私有local memory (RW)nBlock的shared memory (RW)nGrid的global memory (RW)nGrid的constant memory (RO)nGrid的texture memory (RO)nHost可以通过API完成显存与主存交互2. CUDA架构n线程组织模型n每个内核程序 (Kernel) 包含非常多的线程n所有线程
5、执行相同的顺序程序n层次结构:Grid Block Threadn线程被划分成线程块 (Block)n同一线程块内的线程可以通过共享SM资源相互协作n每个线程和线程块拥有唯一IDn通过内建变量读取2. CUDA架构n线程映射nThread SPnBlock SMnGrid GPUn把GPU看作一个包含很多个核心的多核处理器n有自己的本地存储器n大量的线程并行执行n每个线程拥有私有变量/存储区域n线程之间拥有共享的存储区域n与CPU的差别: GPU的线程是轻量级的(代码少,硬件轮换,资源负担小);需要很大量的线程才能使GPU满载2. CUDA架构nCPU/GPU异构并行模型n由CPU端 (主机端
6、) 传送参数及配置Kernel的执行 (Block, Thread数量, 尺寸等)nKernel在GPU (设备端) 上执行n显存分配, 显存与PC主存间的交互通过API完成2. CUDA架构nCUDA C扩展: 编译器nvccnCUDA源程序 - CU文件n编译器驱动n分离主机端源代码和设备端源代码n编译设备端源代码到GPU汇编代码(PTX)或GPU二进制代码(CUBIN)n把最终GPU代码包裹在主机端源代码中nCUDA C扩展: APInDriver API 调用Kernel较繁琐nRuntime API 较方便2. CUDA架构nCUDA C扩展: 函数限定符n_global_ GPU
7、Kernel代码, 由CPU发起, 返回void, 不能由其它Kernel调用n_device_ 由GPU Kernel调用的函数, 不能由CPU发起n_host_ 在CPU上执行的函数nCUDA C扩展: 变量限定符n_constant_ 变量位于常数存储器n_shared_ 变量位于共享存储器2. CUDA架构nCUDA C扩展: 内建变量n无需定义/声明, 直接在kernel中调用ndim3 gridDim; / Grid尺寸ndim3 blockDim; / Block尺寸ndim3 blockIdx; / Block IDndim3 threadIdx; / Thread 点nCUD
8、A C扩展: 执行配置n调用: my_kernel (.);n实际是为gridDim和blockDim赋值n决定当前线程需要处理的数据和结果存储的位置2. CUDA架构nCUDA存储器管理nGPU与CPU独立编址nGPU与CPU数据交互通过PCIe总线n在主机端通过API去分配/复制/销毁GPU上的存储器空间nGPU存储器操作API (详见CUDA参考手册)n存储空间开辟: cudaMalloc等n存储空间初始化: cudaMemset等 n存储空间: cudaFree等n存储空间拷贝cudaMemcpy等2. CUDA架构nCUDA程序结构内存/显存开辟主机端准备数据数据导入GPU调用ker
9、nel函数计算取回计算结果主机端后期处理主机端代码(串行)设备端代码(并行)主机设备通信3. CUDA环境搭建n所需组件nCUDA完全免费, 各种操作系统下的CUDA安装包均可以在http:/ CUDA环境搭建n1. Windowsn环境要求: Microsoft Visual Stadio 2005 及其以后版本n(1) 依次安装: 显卡驱动ToolkitSDKn(2) 语法高亮n到SDK安装目录下, doc syntax_highlighting visual_studio_8, 将其中的usertype.dat文件复制到Microsoft Visual Studio 8Common7ID
10、E下.n启动VS2005, 工具选项文本编辑器文件扩展名. 在右边的“扩展名”对应的栏里输入“cu”; “编辑器”选择 “Microsoft Visual C+”, “添加” “确定” 重启VS2005n(3) 设置VS2005环境n打开VS2005,工具选项项目和解决方案VC+ 目录 “显示以下内容的目录” n “包含文件”: 分别添加Toolkit和SDK的文件包含目录n“库文件”: 分别添加Toolkit和SDK的库目录n“源文件”: 添加SDK源文件目录3. CUDA环境搭建n1. Windowsn(4) 编译定义n工程源文件 属性 常规 工具 自定义生产工具, 在以下项添加相应内容:
11、n“命令行”: $(CUDA_BIN_PATH)nvcc.exe -ccbin $(VCInstallDir)bin -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I$(CUDA_INC_PATH) -o $(ConfigurationName)$(InputName).obj $(InputFileName)n“输出”: $(ConfigurationName)$(InputName).objn“附加依赖项”: $(InputName)_kernel.
12、cun右键工程名 属性, 打开链接器, 在以下项做相应修改n“启用增量链接” : 否(/INCREMENTAL:NO)n“附加库目录” :改为 “$(CUDA_LIB_PATH)”n “链接器” 子项 “输入”: “附加依赖项” 中输入cudart.lib3. CUDA环境搭建n2. Linux (Fedora, Redhat, Ubuntu)n环境要求: gcc编译器n(1) 进入Linux文本界面n(2) 安装三个组件(具体版本具体输入)nsh NVIDIA-Linux-x86_64-180.22-pkg2.runnsh cudatoolkit_2.1_linux64_rhel5.2.ru
13、nnsh cuda-sdk-linux-2.10.1215.2015-3233425.runn(3) 在.bash_profile中添加:nPATH=$PATH:/binnLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64nexport PATH nexport LD_LIBRARY_PATH n其中: 为实际安装路径4. 例子GPU并行矢量求和n算法描述n将两个N维矢量相加, 即对应元素相加: ci=ai+bi i0, N)n并行算法设计n每个GPU线程负责一个维度的相加nGPU线程数目 M Na0b0c0Th0aN-1bN-1cN-1ThN-1a1b1c1Th1
14、a2b2c2Th0abcThThThMabc4. 例子GPU并行矢量求和n预处理部分ncuda_runtime.h: CUDA运行时库4. 例子GPU并行矢量求和n内核函数n返回值类型必须包括 _global_ voidn内核函数定义的是每一个线程的行为, 所有线程并发执行n操作目标通过当前线程在线程结构中的位置而确定n该问题中所有线程均只执行一次加法, 总计算时间为执行6770行代码一次所需时间4. 例子GPU并行矢量求和n主函数(part-1)使用线程结构的x维度,88一共64个线程h_前缀表示变量位于Host端存储器d_前缀表示变量位于Device端存储器还有多种其他开辟方式4. 例子GPU并行矢量求和n主函数(part-2)推荐参考n书籍/资料:nNVIDIA CUDA Programming GuidenThe CUDA Compiler Driver NVCCnGet Started NVIDIA CUDA C Installation and Verification on LinuxnCUDA by examplenGPU高性能计算之CUDAn深入浅出谈CUDAn网站/论坛n http:/