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 线程索引的主要内容,如果未能解决你的问题,请参考以下文章

编写一个有许多线程写入同一索引的 CUDA 内核?

CUDA 计算线程索引的一般公式

用于图像过滤的 3d CUDA 内核索引?

CUDA 索引无法按预期工作

CUDA笔记(一)线程与数据量的关系

CUDA编程之线程模型