关于CUDA线程ID

请问一下,有个三维数组
核函数中我该如何对应线程ID和数组下标?
核函数调用时尖括号中的参数该怎么设置?

LZ您好,您问的 kernel中的线程ID和三维数组下标应该如何对应的问题,实际上并无一定的用法,完全取决于您的具体实现。

如果您决定用一个线程处理一个数组元素,那么您可以用多个3维的block去拼成数组的样子,然后一个线程计算一个元素;您也可以用多个2维的block去拼成数组的样子;还可以用一维的block去拼;此外,还可以直接上一维或者二维的block,其尺寸和3维数组尺寸没有直接关系,然后反求出每个线程对应的矩阵坐标,然后计算;以及可以用一维的线程黑上,把3维数组按照优先存储的顺序当做1维数组访问。

如果您决定用一个线程处理多个数组元素,还可以做相应的安排。

如果您设计好了上述线程安排,那么<<<>>>里面的参数就顺理成章了。

大致如上,供您参考,祝您编码顺利~

版主您好。。
今儿天太热有点儿晕
打个比方我有个1024 X 256 X 256的数组,一个线程处理一个元素
我应该怎么对应线程号和这个数组下标呢?

对于楼主1楼的问题,ICE大表示这个没有规定,你可以自由发挥。

既然楼主举出一个1024x256x256的例子,那么我就给你随意发挥个:
Block Shape为(1024,1,1)
Grid Shape为(256,256,1)
那么原来你坐标为x=1,y=2,z=3的元素,现在由:
x为threadIdx.x, y为blockIdx.x, z为blockIdx.y的线程处理。

以及,你可以更好的发挥。这个只是例子,用来引发你思索的。

我给你个最简单的粒子:
假设我用(128,1,1)的BLOCK,也就是一维线程
那么GRID的个数就是:(1024/128,256,256)
dim3 BlockPerGrid(1024/128, 256, 256);
dim3 ThreadPerBlock(128, 1, 1);
<<<BlockPerGrid, ThreadPerBlock>>>(…)

内核内部线程索引:
先求出block的ID
int bid = blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockidx.x;
再求出thread索引:
int tid = bid * blockDim.x + threadIdx.x;

田园写道:
我给你个最简单的粒子:
假设我用(128,1,1)的BLOCK,也就是一维线程
那么GRID的个数就是:(1024/128,256,256)
dim3 BlockPerGrid(1024/128, 256, 256);
dim3 ThreadPerBlock(128, 1, 1);
<<<BlockPerGrid, ThreadPerBlock>>>(…)

内核内部线程索引:
先求出block的ID
int bid = blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockidx.x;
再求出thread索引:
int tid = bid * blockDim.x + threadIdx.x;

—我的例子明确的说明,我的例子,x下标用threadIdx.x表示,y下表用blockIdx.x表示, z坐标用blockIdx.y表示。

田园你什么意思?跟着我回复这个?
你给出一个线性的tid干嘛?
你还嫌弃不够混乱么!

:lol用法么,多多益善,说不定他啥时候就碰到需要将thread线性化的问题!

前面和你客气说!
你这话我的我就不爱听了,咋了我还不能给个例子了?我在你之前回复的好不好,我觉得说的不完整想重新编辑一下,怎么就成了跟这你回复了?你搞笑是不是?我给你添乱了?难听的话我不想说,你爱咋想咋想!

总版主批评的是。我错了。

讨论了这么多,LZ想明白了么?不妨反馈一下您的做法和心得。

祝LZ学习CUDA一帆风顺~

谢谢各位版主的指点~已解决