【发布时间】:2021-03-08 01:28:52
【问题描述】:
我是cuda的新手,我尝试在内核函数中执行互斥锁。
我阅读了一些教程并编写了我的函数,但在某些情况下,发生了死锁。
这是我的代码,内核函数非常简单,可以计算由 main 函数启动的正在运行的线程数。
#include <iostream>
#include <cuda_runtime.h>
__global__ void countThreads(int* sum, int* mutex) {
while(atomicCAS(mutex, 0, 1) != 0); // lock
*sum += 1;
__threadfence();
atomicExch(mutex, 0); // unlock
}
int main() {
int* mutex = nullptr;
cudaMalloc(&mutex, sizeof(int));
cudaMemset(&mutex, 0, sizeof(int));
int* sum = nullptr;
cudaMalloc(&sum, sizeof(int));
cudaMemset(&mutex, 0, sizeof(int));
int ret = 0;
// pass, result is 1024
countThreads<<<1024, 1>>>(sum, mutex);
cudaMemcpy(&ret, sum, sizeof(int), cudaMemcpyDeviceToHost);
std::cout << ret << std::endl;
// deadlock, why?
countThreads<<<1, 2>>>(sum, mutex);
cudaMemcpy(&ret, sum, sizeof(int), cudaMemcpyDeviceToHost);
std::cout << ret << std::endl;
return 0;
}
那么,谁能告诉我为什么在调用countThreads>>()时程序死锁,以及如何解决它?我想执行跨块互斥锁,但这可能不是一个好主意。非常感谢。
我试验了一段时间,发现如果在同一个块中使用线程,就会发生死锁,否则一切正常。
【问题讨论】:
-
见docs.nvidia.com/cuda/cuda-c-programming-guide/…在以“Volta之前,...”开头的段落。