做并行规约时,如何确定共享内存和网格的大小
- 1、为什么要确定共享内存和网格大小
- 2、共享内存大小定义
- 3、网格大小
注:1、这里记录使用笔记,不对cuda的名词做解释,没有详细数学原理和代码。
2、环境:cuda8.0,vs2013,GTX1650
3、理解错误请指出来
1、为什么要确定共享内存和网格大小
做并行规约时,可以使用共享内存和全局内存,如果使用共享内存,写代码之前,有两件事情需要确定一下,一是共享内存要多大,另一个是网格要多大。
在使用共享内存时,需要将全部的数据拷贝到共享内存中,才能进行并行规约,否则求出的结果只是部分数据的结果。
2、共享内存大小定义
个人理解,共享内存一般定义为一个块的大小。1650显卡,一个块有1024个线程,这里假设我们的块大小为32 * 32=1024个线程。
如果图像的大小为512 * 1024,需要512个block,定义块的大小为512 * 1 * 1。
通过运行安装例程,可直接查看设备的情况
进入到安装路径
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\1_Utilities\deviceQuery
运行工程
每个块中共享内存最大为49152个字节,如果数据为float,4*1024=4096,符合。
tid=blockDim.xthreadIdx.y+threadIdx.y,块内ID计算
bid=blockDim.xblockDim.y*blockIdx.x+tid,全局ID计算
每一个块都会有一个共享内存副本,使用全局ID,将数据赋值到整个网格的共享内存中,每个块内的线程共享此块内的数据(整幅图的部分数据)
sdata[tid]=img[bid]
3、网格大小
我们的块数*块的大小应该大于图像的大小,这样在规约的时候,才能保证整幅图所有的像素值都被赋值到共享内存中。