我正在尝试使用多个OpenMP线程中的多个CUDA设备。从主线程初始化设备(即在它们上分配内存),然后我使用来自不同线程的cudaSetDevice
,然后在不同的设备上启动内核。线程不共享设备,每个线程都有对其设备的独占访问权。
根据我的理解,这应该可以正常工作。但是,只要我从一个不是主要的OpenMP线程(即omp_get_thread_num()!= 0)在设备上启动内核,我就会收到来自CUDA的“无效设备序号错误”:
kernel<<<...>>>(...);
error = cudaDeviceSynchronize(); // returns cudaSuccess
error = cudaGetLastError(); // returns invalid device ordinal error
我错过了什么吗?以前有人见过这样的东西吗?我正在使用CUDA 5.0。
答案 0 :(得分:0)
为了解决这个问题,这个问题是由于我使用cudaGetLastError尝试在内核启动后检查错误,但没有检查前一个调用的错误返回值。因此,它在内核启动后从cudaGetDeviceInfo调用返回错误代码,我错误地推断它来自启动本身。如果您看到此错误,我建议您确保检查之前所有CUDA API调用返回的错误值。