【问题标题】:"invalid device ordinal" error on kernel launch内核启动时出现“无效的设备序号”错误
【发布时间】: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),但它不会抱怨任何这些操作。据我了解,无效的设备序号表示问题应该由使用该设备的任何东西触发,而不仅仅是内核启动。
  • 同意。如果您可以发布一个小型复制器,我很乐意看看。但正如我所说,没有任何内核启动之前的代码可供查看,我只是在猜测自己。也许其他人会有更好的想法。

标签: cuda openmp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多