【发布时间】:2012-10-16 20:24:23
【问题描述】:
我正在尝试使用来自多个 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。
【问题讨论】:
-
从我的角度来看,这个问题中没有足够的信息来说明问题所在。是的,它应该工作。您在内核启动之前所做的事情并不完全正确。您可能需要检查每个 cudaSetDevice 调用实际使用的设备序号,这些调用应该在每个线程中的内核调用之前。如果您试图让代码与 2 台以上的设备一起使用,请先尝试 2 台设备。您可能想与cuda openMP sample code 进行比较。
-
您好罗伯特,感谢您的回复。是的,我非常愿意承认这是程序员错误:)(尽管我已经检查了 cudaSetDevice 的参数),我只是想看看是否有人遇到过类似的事情。对我来说奇怪的是,在执行内核之前,我在设备上的线程中执行了大量非内核操作(cudaMemcpy、cudaMemset),但它不会抱怨任何这些操作。据我了解,无效的设备序号表示问题应该由使用该设备的任何东西触发,而不仅仅是内核启动。
-
同意。如果您可以发布一个小型复制器,我很乐意看看。但正如我所说,没有任何内核启动之前的代码可供查看,我只是在猜测自己。也许其他人会有更好的想法。