CUDA矩阵乘法:大矩阵输出错误

时间:2018-11-26 15:30:13

标签: c++ cuda visual-studio-2017 matrix-multiplication

我试图使用Cuda 10在我的GPU上使用全局内存进行简单的矩阵乘法。代码对于两个1024 x 1024矩阵工作正常,但是,如果大小增加到2048 x 2048,它将生成零。 。我试图捕获cuda错误,cudaGetErrorString()在以下行报告错误:

cudaStatus = cudaMemcpy(c, d_c, M * N * sizeof(T), cudaMemcpyDeviceToHost); 

似乎在内核函数中以下各行的索引问题:

for (int k = 0; k < S; ++k)
    val += a[row * S + k] * b[k * N + col];

因为如果我将这两行注释掉,代码也可以正常工作。我想知道问题是否是由于显卡功能有限或其他原因(即最大网格尺寸)引起的?我的代码找不到任何错误。

template <typename T>
void __global__ ker_matmul(T *a, T *b, T *c, int M, int S, int N) { 

    //dims_a[0] = M, dims_a[1] = S;
    //dims_b[0] = S, dims_c[1] = N;
    //dims_c[0] = M, dims_c[1] = N;

    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    int row = tid / M;
    int col = tid % M;

    if (row < M && col < N) {
        T val = 0;
        for (int k = 0; k < S; ++k)
             val += a[row * S + k] * b[k * N + col];
        c[tid] = val;
    }
}

template <typename T>
void cuArr<T>::cu_matmul(T *a, int *dims_a, T *b, int *dims_b, T *c) 
{
    if (dims_a[1] != dims_b[0]) return 0;
    fill_n(c, dims_a[0] * dims_b[1], 0);

    T *d_a = 0, *d_b = 0, *d_c = 0;
    int M = dims_a[0], S = dims_a[1], N = dims_b[1];

    cudaError_t cudaStatus;

    cudaStatus = cudaMalloc((void **)&d_a, M * S * sizeof(T)); 
    cudaStatus = cudaMalloc((void **)&d_b, S * N * sizeof(T)); 
    cudaStatus = cudaMalloc((void **)&d_c, M * N * sizeof(T)); 
    cudaStatus = cudaMemcpy(d_a, a, M * S * sizeof(T), cudaMemcpyHostToDevice); 
    cudaStatus = cudaMemcpy(d_b, b, S * N * sizeof(T), cudaMemcpyHostToDevice); 


    int threadsPerBlk = 1024;
    int numBlks = M * N / threadsPerBlk;

    ker_matmul << <numBlks, threadsPerBlk>> > (d_a, d_b,d_c, M, S, N);


    cudaStatus = cudaMemcpy(c, d_c, M * N * sizeof(T), cudaMemcpyDeviceToHost); 
    cudaFree(d_c);
    cudaFree(d_b);
    cudaFree(d_a);

}

GeForce GT 720,开普勒,0.967 GHz

SM | 2 SP(每个SM的SP)| 384(192) 全球记忆| 1 GB const mem | 64 kb 经纱尺寸| 32 regs / blk | 65536 最大线程数/大桶| 1024 最大共享内存/大容量| 48 kb 最大阻光| 1024 x 1024 x 64

最大网格变暗| 2 ^ 21 x 2 ^ 11 x 2 ^ 11

0 个答案:

没有答案