0

この投稿について謝罪することから始めましょう。ここと同じ質問をする投稿がいくつかあることは知っていますが、与えられた解決策を試しましたが、CUDA 行列の乗算で正しい結果が得られません。

私が従った例から、カーネル内のアルゴリズムが正しいと確信しています。2D 配列をカーネルに渡すのに問題があるとは思いません。それらは参照によって渡されるため、2D ソリューション配列には、配列がホストで出力されるまでに正しい答えが含まれているはずです。 、しかしそうではありません。

私の dim3 dimGrid(B, B) および dim3 dimThreads(T, T) 変数の問題でしょうか? 私は CUDA フレームワークに不慣れで、まだ頭を抱えようとしています。どんな提案でも大歓迎です。私のコードは次のとおりです。

#include <stdio.h>
#include <cuda.h>
#include <stdlib.h>

__global__ void MatMultiply (int *a, int *b, int *c, int N) {
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;
    int val = 0;

    for (int e = 0; e < N; ++e) {
        val += a[row*N + e] * b[e*N + col];
    }
    c[row*N+col] = val;
}

int main(void) {
    int N, B, T;

    printf("Input integer for matrix dimension size: ");
    scanf("%d", &N);

    printf("Input number of threads in a block: ");
    scanf("%d", &T);

    printf("Input number of blocks in a grid: ");
    scanf("%d", &B);

    int size = N * N * sizeof(int);

    int *a, *b, *c;

    a = (int*)malloc(size);
    b = (int*)malloc(size);
    c = (int*)malloc(size);

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            a[i*N+j] = j + i*N;
            b[i*N+j] = j + i*N;
            c[i*N+j] = j + i*N;
        }
    }

    int *dev_a, *dev_b, *dev_c;

    cudaMalloc((void**)&dev_a, size);
    cudaMalloc((void**)&dev_b, size);
    cudaMalloc((void**)&dev_c, size);

    cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_c, c, size, cudaMemcpyHostToDevice);

    dim3 dimGrid(B, B);
    dim3 dimThreads(T, T);
    MatMultiply<<<B, T>>>(dev_a,dev_b,dev_c, N);

    cudaMemcpy(c, dev_c, size, cudaMemcpyDeviceToHost);


    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d\t", b[i*N + j]);
        }
        printf("\n");
    }

    free(a);
    free(b);
    free(c);

    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);

    return 0;
}

再度、感謝します。

4

2 に答える 2

2

カーネル呼び出しで変数dimGridと変数を使用していません。dimThreads代わりに、1 次元スレッド ブロックの 1 次元グリッドを起動するだけです。

それとは別に、エラーをチェックしていません。

于 2013-04-22T22:35:01.557 に答える