私は現在、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
。
ありがとうございました!