Cuda::入口函数共享数据

标签 cuda gpu-shared-memory

有人知道为什么下面的函数使用 16,432 B 的共享数据吗? 在我看来应该是:2 x 32 x 32 x 8 B = 16,384 B

__global__ void matrixMulKernel(double *c, const double *a, const double *b, unsigned int size)
{
    __shared__ double as[32][32];
    __shared__ double bs[32][32];
    unsigned int bx = blockIdx.x, by = blockIdx.y;
    unsigned int tx = threadIdx.x, ty = threadIdx.y;
    unsigned int row = bx * TILE_WIDTH + tx;
    unsigned int col = by * TILE_WIDTH + ty;
    double Pval = 0.0;
    for(unsigned int q = 0; q < size / TILE_WIDTH; q++)
    {
        as[tx][ty] = a[row * size + q * TILE_WIDTH + ty];
        bs[ty][tx] = b[(q * TILE_WIDTH + tx) * size + col];
        __syncthreads();
        
        for(unsigned int k = 0; k < TILE_WIDTH; k++)
            Pval += as[tx][k] * bs[k][ty];
        __syncthreads();
    }

    c[row * size + col] = Pval;
}

编译器给出以下错误:

Entry function '_Z15matrixMulKernelPdPKdS1_j' uses too much shared data (0x4030 bytes, 0x4000 max)

我感兴趣的是为什么会这样,而不是作为解决方法:)

最佳答案

您可能正在为 cc 1.x 设备进行编译。 documentation表示 cc 1.x 设备的全局内核参数通过共享内存传递。

因此,您的显式 __shared__ 声明有 16,384 字节。 其余部分来自显式内核参数所需的 28 字节(假设 64 位目标)以及通过共享内存通信的其他开销。

尝试针对 cc 2.x 设备进行编译:

nvcc -arch=sm_20 ...

关于Cuda::入口函数共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21915225/

相关文章:

c++ - CUDA 中的全局内存与共享内存

cuda - GPU Kepler CC3.0 处理器不仅是流水线架构,还是超标量?

Cuda Thrust min_element 崩溃

c++ - 哪个 Nsight 版本可以在 Visual Studio 2010 中使用 CUDA 5.5?

memory - 用short替换int对CUDA的性能有帮助吗

Cuda-memcheck 未报告越界共享内存访问

cuda - Nvidia和AMD硬件上的OpenCL FFT?

CUDA最佳内存访问布局: global memory coalescence and shared memory bank conflicts

c - 启动内核时共享内存和流

cuda - 共享内存库与 char 数组冲突