【问题标题】:understanding Matrix multiplication in CUDA理解 CUDA 中的矩阵乘法
【发布时间】: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*NI*N 相乘。这个逻辑似乎很棘手。我无法想象它@huseyintugrulbuyukisik
  • 2D 到 1D 表示第一行后跟第二行后跟第三行...。然后如果将 ROW 乘以 N,则选择第 ROWth 行的第一个元素,因为 N 是行长,而一维数组是长度为 N*M,其中 M 是列高(或者这意味着每行有 N 个元素的 M 行在 1D 中一个接一个地堆叠)。
  • 如果你正在尝试学习 OpenCL,为什么这个问题会被标记为 CUDA,为什么你显示的代码是 CUDA 代码?

标签: c++ matrix cuda gpu


【解决方案1】:

矩阵是连续存储的,即在连续位置的每一行。您在这里看到的称为平面寻址,即将两个元素索引转换为与第一个元素的偏移量。

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 2011-04-21
    • 2021-06-02
    • 2011-09-07
    • 2012-12-09
    • 1970-01-01
    • 2013-04-16
    • 2011-05-02
    相关资源
    最近更新 更多