0

我正在尝试使用来自多个 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。

4

1 回答 1

0

只是为了解决这个问题,这个问题是我在内核启动后使用 cudaGetLastError 尝试检查错误的结果,但没有检查前一次调用的错误返回值。因此,它在内核启动后从对 cudaGetDeviceInfo 的调用中返回错误代码,我错误地推断它来自启动本身。如果您看到此错误,我建议您确保检查所有先前对 CUDA API 的调用返回的错误值。

于 2012-11-09T17:40:25.540 回答