后续:CUDA:停止所有其他线程 https://stackoverflow.com/questions/3735786/cuda-stop-all-other-threads
我正在寻找一种在发生“不良情况”时退出内核的方法。
编程手册说 NVCC 不支持异常处理。我想知道是否有用户定义的 cuda 错误代码。换句话说,如果发生“坏”,则以该用户错误代码终止。我怀疑是否存在这种情况,所以我的另一个想法是引起一种情况。
比如,如果发生“坏事”,则除以零。但我不确定一个线程是否除以零,是否足以使整个内核崩溃,或者只是该线程崩溃?
有没有更好的方法来终止内核?
你应该首先阅读这个问题以及 harrism 和 tera 的回答 https://stackoverflow.com/questions/12505750/how-can-a-global-function-return-a-value-or-break-out-like-c-c-does(昨天问/回答)。
您可能会想使用类似的东西
if (there_is_an_error) {
*status = MY_ERROR_CODE; // store to device pointer
__threadfence(); // ensure store issued before trap
asm("trap;"); // kill kernel with error
}
在我看来,这并不能完全满足你“优雅”的条件。 Trap导致内核退出并运行时报告cudaErrorUnknown
。但是由于内核执行是异步的,因此您需要同步您的流/设备才能捕获此错误,这意味着在每次内核调用后进行同步,除非您可以接受不精确的错误(即您可能直到之后才捕获错误代码)调用后续 CUDA API 调用)。
但这正是 CUDA 中内核错误处理的方式,编写良好的代码应该在调试版本中同步以检查内核错误,并在发布版本中解决不精确的错误消息。不幸的是,我认为没有比这更优雅的方法了。
edit:在计算能力 2.0 及更高版本中,您可以使用assert() 来退出并在调试版本中出现错误。但尚不清楚这是否是您想要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)