我目前正在做 CUDA 编程的作业,我发现自己被迫同步内核中的所有线程。我已经实现了本文所述的简单同步机制。但是我遇到了奇怪的行为,所以我决定为这种锁编写一个测试程序:
#include <stdio.h>
__device__ int g_mutex = 0;
__device__ void __gpu_sync(int goalVal) {
int tid_in_block = threadIdx.x * blockDim.y + threadIdx.y;
if(tid_in_block == 0) {
atomicAdd(&g_mutex, 1);
while(g_mutex != goalVal) {}
}
__syncthreads();
}
__global__ void deadlock(int *out) {
__gpu_sync(1000);
*out = 42;
}
int main() {
int *dev, local;
cudaMalloc((void**)&dev, sizeof(int));
deadlock<<<1,1>>>(dev);
cudaMemcpy(&local, dev, sizeof(int), cudaMemcpyDeviceToHost);
printf("%d\n", local);
return 0;
}
我希望这个应用程序永远不会终止(因为互斥锁永远不会达到 1000 的值)。然而,应用程序运行时好像没有涉及锁定,并立即打印出 42。你能告诉我我缺少什么吗?我正在运行 CC1.3 系统(GTX 260)、64 位 Windows 7、CUDA 5.5。编译由nvcc -arch compute_12 main.cu
.
谢谢!