c++ - CUDA 中的 3D 元素矩阵乘法?

标签 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];
            }
        }
    }
}

我至少走在正确的轨道上吗?

最佳答案

因为您实际上所做的只是一个元素级乘积(我犹豫将其称为 Hadamard Product 因为它不是为超矩阵 AFAIK 定义的),所以您不需要做任何与最简单的不同的事情内核代码的一维版本。像这样的事情:

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) 等。

关于c++ - CUDA 中的 3D 元素矩阵乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481390/

相关文章:

c++ - 如何将 python 类包装到 C++ 类中?

c++ - 模板基类 typedef 成员不可见

cuda - Thrust 设备管理和内核

c++ - 未知的 nvlink 错误

C++ 在方程式中使用变量;错误 : expression must have integral or unscoped enum type & others

matlab - 如何使用 matlab 根据索引数组创建 k 矩阵?

opencv - findHomography后如何知道透视变换矩阵

java - 如何打印给定数字 n 的魔术矩阵最多 n 方

tensorflow - 使用旧版本的 CUDA 和 cuDNN 安装 GPU 版本的 Tensorflow

c++ - 我收到有关枚举的错误(我认为)