CUDA编程快速入门
来源:互联网 发布:步步高9688软件下载 编辑:程序博客网 时间:2024/05/15 23:49
1.架构理解
1).包括grid,block,(warp),thread这几个层次,
这就是我们所说的SM;
即:grid对应整个GPU,block数量代表SM数量,每个block的thread数量对应ALU数量
2.编写规范
1)核函数前缀__global__,而且必须是void类型。
2)<<<N,M>>>,N个block,每个block有M个线程。
3)GPU的核函数的执行与CPU的函数执行是异步的,即在核函数入口处调用后,不等运行结束,继续运行下一条命令。
4)block内部的线程可以通过share memory通信,效率近似于寄存器register,但是block之间则没有通信机制,即不同block之间的thread不能通信。
5)线程索引和快索引计算:
6)数据交互
Md和M,已经P和Pd的数据类型应该是一样的。
7)CUDA计时
de >///测试时间 de> de > float elapsedTime = 0.0f; de> de > cudaEvent_t start, stop; de> de > cudaEventCreate(&start); de> de > cudaEventCreate(&stop); de> de > cudaEventRecord(start, 0); de> de >kernel<<<>>>() de> de > ///时间结束 de> de > cudaEventRecord(stop, 0); de> de > cudaEventSynchronize(stop); de> de > cudaEventElapsedTime(&elapsedTime, start, stop); de> de > printf("the time on gpu is %f\n ms", elapsedTime); de>
8)help_cuda.h
9)
de >C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\1_Utilities\deviceQuery\../../bin/win64/Debug/deviceQuery.exe Starting... de> de > de> de > CUDA Device Query (Runtime API) version (CUDART static linking) de> de > de> de >Detected 1 CUDA Capable device(s) de> de > de> de >Device 0: "GeForce GTX 960M" de> de > CUDA Driver Version / Runtime Version 7.5 / 7.5 de> de > CUDA Capability Major/Minor version number: 5.0 de> de > Total amount of global memory: 4096 MBytes (4294967296 bytes) de> de > ( 5) Multiprocessors, (128) CUDA Cores/MP: 640 CUDA Cores de> de > GPU Max Clock rate: 1176 MHz (1.18 GHz) de> de > Memory Clock rate: 2505 Mhz de> de > Memory Bus Width: 128-bit de> de > L2 Cache Size: 2097152 bytes de> de > Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) de> de > Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers de> de > Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers de> de > Total amount of constant memory: 65536 bytes de> de > Total amount of shared memory per block: 49152 bytes de> de > Total number of registers available per block: 65536 de> de > Warp size: 32 de> de > Maximum number of threads per multiprocessor: 2048 de> de > Maximum number of threads per block: 1024 de> de > Max dimension size of a thread block (x,y,z): (1024, 1024, 64) de> de > Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) de> de > Maximum memory pitch: 2147483647 bytes de> de > Texture alignment: 512 bytes de> de > Concurrent copy and kernel execution: Yes with 1 copy engine(s) de> de > Run time limit on kernels: Yes de> de > Integrated GPU sharing Host Memory: No de> de > Support host page-locked memory mapping: Yes de> de > Alignment requirement for Surfaces: Yes de> de > Device has ECC support: Disabled de> de > CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model) de> de > Device supports Unified Addressing (UVA): Yes de> de > Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0 de> de > Compute Mode: de> de > < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > de> de > de> de >deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 7.5, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce GTX 960M de> de >Result = PASS de> de >请按任意键继续. . . de>
SM数 5 每个SM的核心数128
总共核心数 640
内存频率和带宽
constant memory 64 k
48k
寄存器
每个SM的最大线程2048
每个block的最大线程1024
每个block维度最大值,(三个相乘不能大于1024)
每个grid维度最大值21亿
3.优化
1)global memory
2)share memory 速度=寄存器,
最小单位是bank,是32bit,因此最好存储int,float等,不要存储char,否则ban冲突
另外,多线程同时访问一个bank,也导致bank冲突,除非half-warp同时访问一个(广播)
举例:
即读的时候,half-warp只需要读一次,但是写却需要16次(不连续,分段,不支持合并)
此时,则利用share memory进行中转优化,因为share memory没有分段(合并)的要求,即:
横着读global,横着写share,然后纵着读share,横着写global
举例
share memory 访问冲突(参见 cuda sample的transport)
4)texture
即,如果global存在位移,将导致不能合并访问,这时候通过将texture绑定到对应global,则可以实现快速访问
总结:
5)
即:
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尺寸)的倍数
即:访问时候,调度的单元是half warp,所以block的最小值最好是16*16=256,最大是32*32=1024
即:寄存器的个数增加,将导致可用block的减少,因为总的寄存器是一定的,每个block用的越多,则可以分的block越少
总结:
总共可以分配的线程数量受以上四个因素同时影响,最小值为最后实际启动的线程数。
指令运算量的计算如下:
来自为知笔记(Wiz)
0 0
- CUDA编程快速入门
- CUDA编程入门
- CUDA编程入门资源
- CUDA 编程入门
- cuda 编程入门
- CUDA编程入门指南
- CUDA并行编程入门
- CUDA编程入门资料
- CUDA编程入门
- CUDA编程入门笔记
- CUDA编程入门
- CUDA编程->CUDA入门了解(一)
- cuda编程入门示例10
- cuda编程入门示例14
- cuda编程入门示例23
- CUDA下的GPU编程入门--第一个CUDA程序
- cuda编程入门示例2---CUDA environment initialization
- CUDA编程入门----Thrust库简介
- Intel Parameter-Framework简介(不定期更新)
- 二维矩阵相乘——cpu&&gpu
- 多人多车求距离——cpu&gpu
- 二维矩阵实现矩阵相乘
- 二维矩阵实现的多人多车求距离
- CUDA编程快速入门
- 欢迎使用CSDN-markdown编辑器
- 无人驾驶(一)——探测设备比较
- linux中使用pthread和opencv多线程编程
- 【转载】景深 (Depth of field)
- Windows利用Github创建共享库
- 菜鸟跑通caffe(三)——编译NVIDIA/caffe-0.13/0.14+digist
- 菜鸟跑通caffe(四)——fast-cnn编译记录
- 实战深度学习(一)——利用digits训练road模型