2012-09-20 59 views
4

的后续行动:CUDA: Stop all other threads崩溃内核优雅

我正在寻找一种方式,如果一个“坏状态”时退出内核。 编程手册说NVCC不支持异常处理。我想知道是否有用户定义的cud​​a错误代码。换句话说,如果“坏”发生,然后用此用户错误代码终止。我怀疑有一个,所以我的另一个想法是导致一个。

类似的,如果“坏”发生,除以零。但是我不确定一个线程是否被零分割,是否足以导致整个内核崩溃,或仅仅是那个线程?

有没有更好的方法来终止内核?

+2

如果您的主要用途是调试,那么CUDA在Fermi和Kepler上表示支持。它会杀死你的上下文,但它会在出路中给出一个有用的断言消息,或者让你进入断言失败的代码是你在调试器中运行你的应用程序 – talonmies

回答

6

你应该先读this question and the answers by harrism and tera(问/昨天回答)。

你可能想使用类似

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 
} 

这并不完全满足你的“正常”状态,在我看来。陷阱导致内核退出并且运行时报告cudaErrorUnknown。但是由于内核执行是异步的,你需要同步你的流/设备才能捕获这个错误,这意味着在每次内核调用后进行同步,除非你确定有不准确的错误(例如,你可能不会捕获错误代码,直到在调用后续的CUDA API调用)。

但是,这只是CUDA内核错误处理的方式,编写良好的代码应该在调试版本中同步以检查内核错误,并在发布版本中解决不精确的错误消息。不幸的是,我认为没有比这更优雅的方式。

编辑:关于Compute capability 2.0及更高版本,您可以使用assert()以调试版本中的错误退出。目前还不清楚这是不是你想要的。

1

断言可能会帮助你。您可以在CUDA C编程指南的B.15中找到它。