我从 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 共享内存相协调?
谢谢