【发布时间】:2018-04-02 14:46:10
【问题描述】:
我正在努力学习 CUDA。在this基于GPU的文章的帮助下,我开始尝试矩阵乘法。 我的主要问题是我无法理解如何在内核中访问 2D 数组,因为访问 2D 数组与传统方法(matrix[i][j])有点不同。 这是我卡住的部分:
for (int i = 0; i < N; i++) {
tmpSum += A[ROW * N + i] * B[i * N + COL];
}
C[ROW * N + COL] = tmpSum;
我可以理解 ROW 和 COLUMN 是如何派生的。
int ROW = blockIdx.y*blockDim.y+threadIdx.y;
int COL = blockIdx.x*blockDim.x+threadIdx.x;
非常感谢任何带有示例的解释。谢谢!
【问题讨论】:
-
内核中的单个循环意味着每个工作项都在做一个点积(在 m1 的 1 行和 m2 的 1 列之间)以找到结果矩阵的
(i,j)th 元素。由于它采用一维数组,因此只能将其查找为堆叠的行。这就是为什么ROW * N + i表示第 ROW 行和该行的第 i 个元素,但这是第一个矩阵。第二个矩阵似乎没有在这个内核之前转置,所以它扫描的是单列而不是一行。 -
为什么要将
ROW*N和I*N相乘。这个逻辑似乎很棘手。我无法想象它@huseyintugrulbuyukisik -
2D 到 1D 表示第一行后跟第二行后跟第三行...。然后如果将 ROW 乘以 N,则选择第 ROWth 行的第一个元素,因为 N 是行长,而一维数组是长度为 N*M,其中 M 是列高(或者这意味着每行有 N 个元素的 M 行在 1D 中一个接一个地堆叠)。
-
如果你正在尝试学习 OpenCL,为什么这个问题会被标记为 CUDA,为什么你显示的代码是 CUDA 代码?