【问题标题】:cuda thread indexingcuda 线程索引
【发布时间】: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;

【问题讨论】:

    标签: c cuda


    【解决方案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 :) 我想要这样的系统:一个线程 = 一个矩阵项,但我不知道上面写的表达式对于二维块和网格是否正确。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2014-10-13
    • 2017-04-20
    • 2019-09-24
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多