Standard Introduction to CUDA C Programming(2020年整理).ppt

上传人:摩西的****12 文档编号:133023075 上传时间:2020-05-23 格式:PPT 页数:63 大小:6.51MB
返回 下载 相关 举报
Standard Introduction to CUDA C Programming(2020年整理).ppt_第1页
第1页 / 共63页
Standard Introduction to CUDA C Programming(2020年整理).ppt_第2页
第2页 / 共63页
Standard Introduction to CUDA C Programming(2020年整理).ppt_第3页
第3页 / 共63页
Standard Introduction to CUDA C Programming(2020年整理).ppt_第4页
第4页 / 共63页
Standard Introduction to CUDA C Programming(2020年整理).ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《Standard Introduction to CUDA C Programming(2020年整理).ppt》由会员分享,可在线阅读,更多相关《Standard Introduction to CUDA C Programming(2020年整理).ppt(63页珍藏版)》请在金锄头文库上搜索。

1、CUDAC C 编程介绍 chengyi 易成InstituteofHighEnergyPhysics CUDAC C 编程介绍 今天介绍的内容 基本概念异构计算 主机和设备 global device host 线程的两层组织结构 Grid和Block内存组织架构Sharedmemory Globalmemory RegisterGlobalmemory Constantmemory TexturememoryCache内存管理cudaMalloc cudaFree cudaMemcpyAsync cudaMemcpy CUDA CUDA ComputeUnifiedDeviceArchit

2、ecture 使用GPU大量计算单元和高带宽实现通用计算的计算平台提出了对硬件和软件要求支持CUDA的GPU 异构计算 线程块 线程 索引 内存组织 线程同步 异步执行 基本概念 术语 一个简单的例子 Hello World 内容框架 一个实际的例子 矢量点乘 CUDA编程演示 GPU硬件架构 总结 HeterogeneousComputing 异构计算 术语 Host 主机 CPU和它的内存 hostmemory Device 设备 GPU和它的内存 devicememory Host Device 低延迟VS高吞吐量 CPU通过复杂的缓存体系结构 减小指令延迟大量的晶体管处理逻辑任务 GP

3、U集成大量计算单元 获得高吞吐量更多的晶体管用于数学计算 HeterogeneousComputing include includeusingnamespacestd defineN1024 defineRADIUS3 defineBLOCK SIZE16 global voidstencil 1d int in int out shared inttemp BLOCK SIZE 2 RADIUS intgindex threadIdx x blockIdx x blockDim x intlindex threadIdx x RADIUS Readinputelementsintoshar

4、edmemorytemp lindex in gindex if threadIdx x d in RADIUS d out RADIUS CopyresultbacktohostcudaMemcpy out d out size cudaMemcpyDeviceToHost Cleanupfree in free out cudaFree d in cudaFree d out return0 serialcode parallelcode serialcode parallelfn CUDA编程的 三部曲 申请GPU内存 将数据从CPU内存拷贝到GPU内存 PCIBus CUDA编程的 三

5、部曲 申请GPU内存 将数据从CPU内存拷贝到GPU内存加载GPU程序 kernel 完成GPU上的并行计算 PCIBus CUDA编程的 三部曲 申请GPU内存 将数据从CPU内存拷贝到GPU内存加载GPU程序 kernel 完成GPU上的并行计算 默认为异步执行模式将结果从GPU内存拷回CPU内存 释放GPU内存 PCIBus GPU内存组织 Pascal L2 GlobalMemory Registers SM 0 Registers SM 1 Registers SM N GPU内存组织 GlobalMemory位于片外 延迟 100时钟周期 所有线程可见SharedMemory位于片

6、上 延迟 10时钟周期 以线程块为单位分配 线程块内所有线程共享Register位于片上 延迟 1时钟周期 以线程为单位分配 线程独享Global Constant TextureMemory都位于片外经过不同的L1cacheL1 constant TextureCacheConatant Texture Read OnlyMemory GPUP100SM StreamingMultiprocessor GPUV100SM StreamingMultiprocessor GPUCUDA编程模型 Software GPU Threadsareexecutedbycudacore Thread C

7、UDACore ThreadBlock SM Grid Device Akernelislaunchedasagridofthreadblocks ThreadblocksareexecutedonSM 第一个例子 HELLOWORLD HelloWorld C代码 intmain void printf HelloWorld n return0 标准的纯C代码 在CPU上执行 HelloWorld CUDAC代码 global voidmykernel void printf HelloWorld n intmain void mykernel return0 两个新的语法 global g

8、lobal voidmykernel void printf HelloWorld n CUDAC C 关键字 global 修饰的函数从主机端调用 CC3 x 也可以从设备端调用 在设备端执行PascalGPU CC6 X P100 CC6 0 P40 CC6 1 其它的函数修饰符 device 设备端调用 设备端执行 host 主机端调用 主机端执行 device 和 host 可同时使用 同时编译主机端和设备端两个版本 mykernel 标记从主机端调用设备端函数以及相应的并行配置也叫做 kernellaunch kernel启动 X1和X2分别为kernel的grid 栅格 和bloc

9、k 线程块 的设置完成了在主机端调用 设备端执行一个 global 函数过程 HelloWorld CUDAC代码 global voidmykernel void printf HelloWorld n intmain void mykernel return0 mykernel执行的任务很简单 三部曲 只有 一部曲 Output nvcchello cu a outHelloWorld 一个实际的例子 矢量点乘 a b c 归约求和sum 一个实际的例子 矢量点乘 只有一个分量 GPU上实现两个数相乘 global voidmul int a int b int c c a b globa

10、l 修饰的mul函数mul 在主机端调用mul 在设备端执行 一个实际的例子 矢量点乘 只有一个分量 a b c都是指针 global voidmul int a int b int c c a b mul 在设备端执行 因此a b和c必须指向设备内存因此 事先需要在设备端分配内存 内存管理 主机内存和设备内存位于不同的物理空间设备指针只能指向设备内存可以在设备与主机之间传递不能在主机端引用 不能取地址里的内容 主机指针只能指向主机内存可以在主机与设备之间传递不能在设备端引用 不能取地址里的内容 内存管理的CUDAAPIcudaMalloc cudaFree cudaMemcpy 与主机端的m

11、alloc free memcpy 类似 矢量点乘 只有一个分量 kernel 回到mul kernel global voidmul int a int b int c c a b 设备端内存的申请在main 完成 矢量点乘 只有一个分量 main intmain void inta b c hostcopiesofa b cint d a d b d c devicecopiesofa b cintsize sizeof int inbytes Allocatespacefordevicecopiesofa b ccudaMalloc void 矢量点乘 只有一个分量 main Launc

12、hmul kernelonGPUmul d a d b d c CopyresultbacktohostcudaMemcpy 并行执行 矢量点乘 多分量 N 512 kernel GPU的计算适合大量并发的任务如何在GPU上实现并发执行呢 mul mul 在GPU上执行N次如何确保每次执行的是不同的数据呢 矢量点乘 多分量 N 512 block grid 并发执行kernelmulN次术语 在此 每次并发调用的kernel称为一个block所有block的集合称为grid 中的X1设置grid的大小每个block都有一个唯一标记的IDblockIdx x可以用blockIdx x去数组中索引

13、对应的元素 以确保对应的数据参与计算 global voidmul int a int b int c c blockIdx x a blockIdx x b blockIdx x 矢量点乘 多分量 N 512 kernel global voidmul int a int b int c c blockIdx x a blockIdx x b blockIdx x 设备端 所有的block并行执行 c 0 a 0 b 0 c 1 a 1 b 1 c 2 a 2 b 2 c 3 a 3 b 3 Block0 Block1 Block2 Block3 矢量点乘 多分量 N 512 不能完成归约

14、在设备端完成了相应分量的乘积 block之间无法共享数据 不能在设备端完成归约求和操作 global voidmul int a int b int c c blockIdx x a blockIdx x b blockIdx x 最终的归约求和在主机端完成 完整的main函数 矢量点乘 多分量 N 512 main defineN512intmain void int a b c sum 0 hostcopiesofa b cint d a d b d c devicecopiesofa b cintsize N sizeof int Allocspacefordevicecopiesofa

15、 b ccudaMalloc void 矢量点乘 多分量 N 512 main CopyinputstodevicecudaMemcpy d a a size cudaMemcpyHostToDevice cudaMemcpy d b b size cudaMemcpyHostToDevice Launchmul kernelonGPUwithNblocksmul d a d b d c CopyresultbacktohostcudaMemcpy c d c size cudaMemcpyDeviceToHost for inti 0 i N i sum c i ReduceonHost C

16、leanupfree a free b free c cudaFree d a cudaFree d b cudaFree d c return0 矢量点乘 多分量 N 512 设备端归约 能不能在设备端完成归约呢 X1 设置kernel的block数目 block之间不能通信X2 设置kernel的block内thread 线程 数 block内线程间可以通过sharedmemory 共享内存 实现数据共享mul mul block内不同的线程用线程ID区分threadIdx x shared 声明共享内存 设备端归约 kernel global voidmul int a int b int sum shared intc N c threadIdx x a threadIdx x b threadIdx x Reducecode 设备端 所有的thread并行执行 c 0 a 0 b 0 c 1 a 1 b 1 c 2 a 2 b 2 c 3 a 3 b 3 thread0 thread1 thread2 thread3 设备端归约实现 threadID threadID thr

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 总结/计划/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号