【发布时间】:2021-12-13 02:54:11
【问题描述】:
我正在尝试了解共享内存的工作原理,当块大量使用它时。
所以我的 gpu (RTX 2080 ti) 每个 SM 有 48 kb 的共享内存,每个线程块也是如此。在下面的示例中,我在同一个 SM 上强制使用了 2 个块,每个块使用完整的 48 kb 内存。我强制两个块在完成之前进行通信,但由于它们不能并行运行,这应该是一个死锁。然而,无论我运行 2 个块还是 1000 个块,程序都会终止。
这是因为块 1 一旦遇到死锁就暂停,并与块 2 切换?如果是,那么当块 2 处于活动状态时,来自块 1 的 48 kb 数据去哪里了?是否存储在全局内存中?
内核:
__global__ void testKernel(uint8_t* globalmem_message_buffer, int n) {
const uint32_t size = 48000;
__shared__ uint8_t data[size];
for (int i = 0; i < size; i++)
data[i] = 1;
globalmem_message_buffer[blockIdx.x] = 1;
while (globalmem_message_buffer[(blockIdx.x + 1) % n] == 0) {}
printf("ID: %d\n", blockIdx.x);
}
主机代码:
int n = 2; // Still works with n=1000
cudaStream_t astream;
cudaStreamCreate(&astream);
uint8_t* globalmem_message_buffer;
cudaMallocManaged(&globalmem_message_buffer, sizeof(uint8_t) * n);
for (int i = 0; i < n; i++) globalmem_message_buffer[i] = 0;
cudaDeviceSynchronize();
testKernel << <n, 1, 0, astream >> > (globalmem_message_buffer, n);
编辑:将“threadIdx”更改为“blockIdx”
【问题讨论】:
标签: cuda