0

我从 matlab 调用 CUDA 内核。

之前有人告诉我(David Kirk 的书),每个线程只能占用 16kb 的共享内存,但我能够消耗的远不止这些:

__global__ void plain(float* arg)
{

    __shared__ float array[12000];
    int k;

    for (k=1;k<12000; k++)
    {
        array[k]=1;
    }   
}

CUDA C 报告浮点数为 4 字节,这意味着总数组大小为 48Kb,大于 12Kb。它运行良好,那怎么可能呢?

我还被告知 GPU 共享内存的大小非常小 - 我该怎么办? 每个块的最大共享内存很重要。我的卡的每个块的最大共享内存为 49152 字节,但我能够以每块 1000 个线程运行上述代码。

似乎每个块会使用 49Kb,这是不对的。是不是 SM 一次只服务一个块并且在 dong 中保留了每个线程块只能有 49Kb 的条件?

每个块 49Kb 共享内存如何与每个线程 16Kb 共享内存相协调?

谢谢

4

2 回答 2

7

每个线程块分配共享内存,每个 SM 最多可使用 48 KB,计算能力为 2.0 及更高版本。因此,在给定的 SM 上,您可能正在运行一个消耗整个 48 KB 的线程块,或者说,三个线程块每个分配 16 KB。每个 SM 16 KB 共享内存的限制适用于计算能力 < 2.0。与每个线程块分配的共享内存相反,本地内存(“本地”意味着“线程本地”)是每个线程分配的。

于 2012-08-23T06:30:10.680 回答
2

线程没有共享内存。您的代码使用“块”共享内存(CUDA 中没有其他共享内存)

于 2012-08-22T19:59:34.467 回答