cuda 线程索引
Posted
技术标签:
【中文标题】cuda 线程索引【英文标题】:cuda thread indexing 【发布时间】:2012-04-09 05:00:33 【问题描述】:这是矩阵索引的正确表达式吗(dim3 threadBlock = (A, B, 1), dim3 blockGrid = (C, D, 1),其中 A, B, C, D 是一些数字)?
int i = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x;
int j = (blockIdx.x * gridDim.y + blockIdx.y) * blockDim.y + threadIdx.y;
【问题讨论】:
【参考方案1】:这在我看来并不正确。二维 CUDA 网格中任何线程的(i,j)
索引是
int idx_i = blockIdx.x * blockDim.x + threadIdx.x;
int idx_j = blockIdx.y * blockDim.y + threadIdx.y;
如果您正在访问存储在线性内存中的数组,则等效的(i,j)
索引是
int mindex_colmajor = idx_i + idx_j * LDA;
或
int mindex_rowmajor = idx_j + idy_i * LDA;
取决于数组是否存储在row major or column major order 中,内存中的第一维(或等效间距)等于LDA
。然后你访问内存作为
value = array[mindex]
其中mindex
是上面计算的列主索引或行主索引。
【讨论】:
感谢您的回复。但没有关于网格的信息。我很困惑,因为在 nvidia 论坛上我找到了二维块和网格的示例,例如: UniqueBlockIndex = blockIdx.y * gridDim.x + blockIdx.x; UniqueThreadIndex =UniqueBlockIndex * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;但我需要两个索引(idx_i 和 idx_j) “但是没有关于网格的信息”是什么意思?我给你的信息都是正确的,在CUDA编程指南中很容易找到,如果你愿意寻找的话......【参考方案2】:这是从线程索引到矩阵的一种方法,但不是唯一的方法。例如,我可以更改内核,以便每个线程处理多个矩阵项。
【讨论】:
user1281071:您没有在问题中要求最快的方法 :-) 无论如何,最快的索引不是速度的唯一因素,它还取决于您打算计算什么内核。 ok, sry :) 我想要这样的系统:一个线程 = 一个矩阵项,但我不知道上面写的表达式对于二维块和网格是否正确。跨度>以上是关于cuda 线程索引的主要内容,如果未能解决你的问题,请参考以下文章