CUDA编程快速入门

来源:互联网 发布:步步高9688软件下载 编辑:程序博客网 时间:2024/05/15 23:49
1.架构理解
1).包括grid,block,(warp),thread这几个层次,
CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
 这就是我们所说的SM;
即:grid对应整个GPU,block数量代表SM数量,每个block的thread数量对应ALU数量
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 2.编写规范
 
CUDA编程快速入门 - IMAX - IMAX 的博客
  CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
 1)核函数前缀__global__,而且必须是void类型。
CUDA编程快速入门 - IMAX - IMAX 的博客
 2)<<<N,M>>>,N个block,每个block有M个线程。
3)GPU的核函数的执行与CPU的函数执行是异步的,即在核函数入口处调用后,不等运行结束,继续运行下一条命令。
4)block内部的线程可以通过share memory通信,效率近似于寄存器register,但是block之间则没有通信机制,即不同block之间的thread不能通信。
5)线程索引和快索引计算:
CUDA编程快速入门 - IMAX - IMAX 的博客
 
 CUDA编程快速入门 - IMAX - IMAX 的博客
CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 6)数据交互
CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
 Md和M,已经P和Pd的数据类型应该是一样的。
7)CUDA计时
  1. de >///测试时间de>
  2. de > float elapsedTime = 0.0f;de>
  3. de > cudaEvent_t start, stop;de>
  4. de > cudaEventCreate(&start);de>
  5. de > cudaEventCreate(&stop);de>
  6. de > cudaEventRecord(start, 0); de>
  7. de >kernel<<<>>>()de>
  8. de > ///时间结束de>
  9. de > cudaEventRecord(stop, 0);de>
  10. de > cudaEventSynchronize(stop); de>
  11. de > cudaEventElapsedTime(&elapsedTime, start, stop);de>
  12. de > printf("the time on gpu is %f\n ms", elapsedTime);de>

8)help_cuda.h
9)
CUDA编程快速入门 - IMAX - IMAX 的博客
 
  1. de >C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\1_Utilities\deviceQuery\../../bin/win64/Debug/deviceQuery.exe Starting...de>
  2. de >de>
  3. de > CUDA Device Query (Runtime API) version (CUDART static linking)de>
  4. de >de>
  5. de >Detected 1 CUDA Capable device(s)de>
  6. de >de>
  7. de >Device 0: "GeForce GTX 960M"de>
  8. de > CUDA Driver Version / Runtime Version 7.5 / 7.5de>
  9. de > CUDA Capability Major/Minor version number: 5.0de>
  10. de > Total amount of global memory: 4096 MBytes (4294967296 bytes)de>
  11. de > ( 5) Multiprocessors, (128) CUDA Cores/MP: 640 CUDA Coresde>
  12. de > GPU Max Clock rate: 1176 MHz (1.18 GHz)de>
  13. de > Memory Clock rate: 2505 Mhzde>
  14. de > Memory Bus Width: 128-bitde>
  15. de > L2 Cache Size: 2097152 bytesde>
  16. de > Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)de>
  17. de > Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layersde>
  18. de > Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layersde>
  19. de > Total amount of constant memory: 65536 bytesde>
  20. de > Total amount of shared memory per block: 49152 bytesde>
  21. de > Total number of registers available per block: 65536de>
  22. de > Warp size: 32de>
  23. de > Maximum number of threads per multiprocessor: 2048de>
  24. de > Maximum number of threads per block: 1024de>
  25. de > Max dimension size of a thread block (x,y,z): (1024, 1024, 64)de>
  26. de > Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)de>
  27. de > Maximum memory pitch: 2147483647 bytesde>
  28. de > Texture alignment: 512 bytesde>
  29. de > Concurrent copy and kernel execution: Yes with 1 copy engine(s)de>
  30. de > Run time limit on kernels: Yesde>
  31. de > Integrated GPU sharing Host Memory: Node>
  32. de > Support host page-locked memory mapping: Yesde>
  33. de > Alignment requirement for Surfaces: Yesde>
  34. de > Device has ECC support: Disabledde>
  35. de > CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model)de>
  36. de > Device supports Unified Addressing (UVA): Yesde>
  37. de > Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0de>
  38. de > Compute Mode:de>
  39. de > < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >de>
  40. de >de>
  41. de >deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 7.5, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce GTX 960Mde>
  42. de >Result = PASSde>
  43. de >请按任意键继续. . .de>
SM数 5 每个SM的核心数128
总共核心数 640
内存频率和带宽
constant memory 64    k
48k
寄存器
每个SM的最大线程2048
每个block的最大线程1024
每个block维度最大值,(三个相乘不能大于1024)
每个grid维度最大值21亿
3.优化
1)global memory

CUDA编程快速入门 - IMAX - IMAX 的博客
 
 

2)share memory 速度=寄存器,
CUDA编程快速入门 - IMAX - IMAX 的博客
 
 
CUDA编程快速入门 - IMAX - IMAX 的博客
 最小单位是bank,是32bit,因此最好存储int,float等,不要存储char,否则ban冲突
CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
另外,多线程同时访问一个bank,也导致bank冲突,除非half-warp同时访问一个(广播)
 举例:
 即读的时候,half-warp只需要读一次,但是写却需要16次(不连续,分段,不支持合并)
此时,则利用share memory进行中转优化,因为share memory没有分段(合并)的要求,即:
CUDA编程快速入门 - IMAX - IMAX 的博客
 
CUDA编程快速入门 - IMAX - IMAX 的博客
  
横着读global,横着写share,然后纵着读share,横着写global
举例
share memory 访问冲突(参见 cuda sample的transport)
CUDA编程快速入门 - IMAX - IMAX 的博客
 
4)texture
CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 即,如果global存在位移,将导致不能合并访问,这时候通过将texture绑定到对应global,则可以实现快速访问
总结:
CUDA编程快速入门 - IMAX - IMAX 的博客
 5)CUDA编程快速入门 - IMAX - IMAX 的博客
 CUDA编程快速入门 - IMAX - IMAX 的博客
 
CUDA编程快速入门 - IMAX - IMAX 的博客
  
即:
SM:5
core/SM:128
global:4G
constant :64K
share/block:48K
register/SM:64K
thread/block::1024
thread/sm:2048
warp:32
 每个SM最大并发2048线程,所以如果每个block是1024线程,则最多并发2个block。
块大小尽量是32(warp尺寸)的倍数
CUDA编程快速入门 - IMAX - IMAX 的博客
 即:访问时候,调度的单元是half warp,所以block的最小值最好是16*16=256,最大是32*32=1024
CUDA编程快速入门 - IMAX - IMAX 的博客
 
即:寄存器的个数增加,将导致可用block的减少,因为总的寄存器是一定的,每个block用的越多,则可以分的block越少
总结:
CUDA编程快速入门 - IMAX - IMAX 的博客
 总共可以分配的线程数量受以上四个因素同时影响,最小值为最后实际启动的线程数。
CUDA编程快速入门 - IMAX - IMAX 的博客
 
 指令运算量的计算如下:
 



来自为知笔记(Wiz)
0 0
原创粉丝点击