【问题标题】:3D Matrix Multiplication in CUDACUDA 中的 3D 矩阵乘法
【发布时间】:2013-04-16 11:42:23
【问题描述】:

我目前正在尝试在 CUDA 中实现矩阵产品: 第一个矩阵是 3D 矩阵 (N,M,Z),第二个是 2D 矩阵 (M, L)。 我看不出这个乘法的代码有什么问题。 有人可以帮我解决这个问题吗? 谢谢

这是我的内核:

__global__ void matrixMul(float * A, float * B, float * C,int N, int M, int Z, int L) {
int idx = blockIdx.x*blockDim.x + threadIdx.x;
int idy = blockIdx.y*blockDim.y + threadIdx.y;

for(int z=0; z<width; z++){
    C[idx*width+idy] +=  A[idy + idx*width ]*B[idx*width+idy+z*width*height];
}

}

【问题讨论】:

  • 您的问题到底是什么?将内核命名为matrixMult 而不是matrixAdd 不是更好吗?
  • 您正在尝试计算超矩阵乘积?还是别的什么?
  • 您好,我的问题是获得结果的最快方法。我正在尝试运行此产品的并发计算。我对我的索引有些怀疑。我认为 C(i,j,t) = sum i=1 to n ( a (r + it)*B(i,t)... 之前的索引给出了一些奇怪的结果..
  • 你应该阅读共享内存的使用和使用特殊大小的线程块(warp)来优化你的代码。

标签: matrix cuda implementation matrix-multiplication


【解决方案1】:

我看到的问题是行/列编号。

z 应该在A 和B 矩阵索引中。矩阵相乘规则说明:

(AB)ij = sum(k) Aik * Bkj

所以我假设你的例子会是这样的

(AB)ij = sum(k,e) Aik * Bkje

【讨论】:

  • 我通过以下方式更改了我的索引。我知道两者都是正确的,因为我能够取回原始矩阵,但是一旦执行产品,结果就完全错误了。 for(int z=0; zwidth+idy] = A[idy + idxwidth]*B[idy*l + idx];
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 2012-05-06
  • 2011-04-21
  • 2011-09-07
  • 2012-12-09
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多