CUDA中的三维元素矩阵乘法?

时间:2013-12-09 21:40:54

标签: c++ matrix cuda matrix-multiplication

我有一个使用以下内核的2D矩阵乘法程序:

__global__ void multKernel(int *a, int *b, int *c, int N)
{
    int column  = threadIdx.x + blockDim.x * blockIdx.x;
    int row     = threadIdx.y + blockDim.y * blockIdx.y;

    int index = row * N + column;

    if(column < N && row < N)
    {
        c[index] = a[index] * b[index];
    }
}

现在,我想创建一个3D矩阵乘法内核,但是我很难找到如何创建一个的例子(同样,我在阅读数学公式时很糟糕,这是我需要改进的东西)

我知道GPU示例将涉及使用

threadIdx.z

等等,但我对如何去做有点迷失。

有人能指出我正确的方向,或者某些公式或示例代码?甚至提供一个基本的例子?我想有一个应该工作的CPU示例。

void matrixMult3D(int *a, int *b, int *c, int *z, int N)
{
    int index;

    for(int column = 0; column < N; column++)
    {
        for(int row = 0; row < N; row++)
        {
            for (int z = 0; z < N; z++)
            {
                index = row * N + column + z;
                c[index] = a[index] * b[index] * z[index];
            }
        }
    }
}

我至少在正确的轨道上?

1 个答案:

答案 0 :(得分:3)

因为你实际所做的只是一个元素方面的产品(我不愿称之为Hadamard Product,因为没有为超矩阵AFAIK定义),你不需要做任何不同的事情。最简单的内核代码1D版本。像这样:

template<int ndim>
__global__ void multKernel(int *a, int *b, int *c, int *z, int N)
{
    int idx  = threadIdx.x + blockDim.x * blockIdx.x;
    int stride = blockDim.x * gridDim.x;

    int idxmax = 1;
    #pragma unroll
    for(int i=0; i < ndim; i++) {
        idxmax *= N;
    }
    for(; idx < idxmax; idx+=stride) {
       c[index] = a[index] * b[index] * z[index];
    }
}

[免责声明:用浏览器编写的代码,从未编译或运行。自担风险使用]

适用于尺寸为N(ndim = 1),N * N(ndim = 2),N * N * N(ndim = 3)等的任何数组维数。