错误在哪里

时间:2019-06-15 20:48:53

标签: matrix cuda int multiplication

我从GPU编程开始,试图实现一个简单的矩阵乘法,但是它失败了,该程序返回一个由0表示的6矩阵。有人可以指出我失败的地方。

非常感谢。

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

// Kernel
const int blocksize = 1;
__global__ void matrixMulti(float *A, float *B, float *C, int N){
    // Threads
    int ROW = blockIdx.y*blockDim.y + threadIdx.y;
    int COL = blockIdx.x*blockDim.x + threadIdx.x;
    // Temp value
    float temp = 0;
    if (COL < N && ROW < N){
        for (int k = 0; k < N; k++){
            temp += A[ROW*N + k]*B[k*N + COL];
        }
        C[ROW*3 + COL] = temp;
    }
}
//Main function
int main(){
    // Create matrix and initialize them
    int K,M,N;
    K = 3;
    M = 3;
    N = 3;
    float A[M*K], B[K*N], C[M*N];
    for (int i = 0; i < M*K; i++) {
        A[i] = 1;
    }
    for (int i = 0; i < K*N; i++) {
        B[i] = 2;
    }
    // Allocating Memory
    const int aSize = M*K*sizeof(float);
    const int bSize = K*N*sizeof(float);
    const int cSize = M*N*sizeof(float);

    float *matrixA, *matrixB, *matrixC;
    cudaMalloc((void**)&matrixA, aSize);
    cudaMalloc((void**)&matrixB, bSize);
    cudaMalloc((void**)&matrixC, cSize);

    //Fill memory
    cudaMemcpy(matrixA, &A, aSize, cudaMemcpyHostToDevice);
    cudaMemcpy(matrixB, &B, bSize, cudaMemcpyHostToDevice);
    cudaMemcpy(matrixC, &C, cSize, cudaMemcpyHostToDevice);

    printf("A[0] : %f \n",A[0]);
    dim3 dimBlock(blocksize,blocksize);
    dim3 dimGrid(3,3);

    // Compute
    matrixMulti<<<dimGrid, dimBlock>>>(matrixA, matrixB, matrixC, 3);
    float* result;
    result = (float *) malloc(9*sizeof(float));
    cudaMemcpy(result, matrixC, cSize, cudaMemcpyDeviceToHost);
    //printing results
    printf("C[0] : %f \n",result[0]);
    printf("C[1] : %f \n",result[1]);
    printf("C[2] : %f \n",result[2]);
    printf("C[3] : %f \n",result[3]);
    printf("C[4] : %f \n",result[4]);
    printf("C[5] : %f \n",result[5]);
    printf("C[6] : %f \n",result[6]);
    printf("C[7] : %f \n",result[7]);
    printf("C[8] : %f \n",result[8]);
    printf("C[9] : %f \n",result[9]);
    // Release Memory
    cudaFree(matrixA);
    cudaFree(matrixB);
    cudaFree(matrixC);


    return EXIT_SUCCESS;
}

您的帖子似乎主要是代码;请添加一些详细信息,这就是为什么我在最后添加这些无用评论的原因,但是经过多次尝试,看来这是应有的。

0 个答案:

没有答案