簡體   English   中英

CUDA中的3D元素矩陣乘法?

[英]3D Elementwise Matrix Multiplication in CUDA?

我有一個使用以下內核的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矩陣乘法內核,但是我很難找到創建一個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產品,因為它沒有為超矩陣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)等的任何尺寸的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM