【问题标题】:Crashing a kernel gracefully优雅地崩溃内核
【发布时间】:2012-09-23 10:00:13
【问题描述】:

跟进:CUDA: Stop all other threads

我正在寻找一种在“坏情况”发生时退出内核的方法。 prog 手册说 NVCC 不支持异常处理。我想知道是否有用户定义的 cuda-error-code。换句话说,如果发生“错误”,则使用此用户错误代码终止。我怀疑有一个,所以我的另一个想法是引起一个。

类似的事情,如果“坏”发生,除以零。但是我不确定一个线程是否会被零除,是否足以使整个内核崩溃,或者只是那个线程?

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

【问题讨论】:

  • 如果您的主要用途是调试,CUDA 对 Fermi 和 Kepler 有断言支持。它会杀死您的上下文,但会在退出时提供有用的断言消息,或者将您放入断言失败的代码中,即您在调试器中运行应用程序

标签: cuda


【解决方案1】:

您应该先阅读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
}

在我看来,这并不完全满足您“优雅”的条件。 Trap 导致内核退出并且运行时报告cudaErrorUnknown。但是由于内核执行是异步的,您需要同步您的流/设备以捕获此错误,这意味着在每次内核调用之后进行同步,除非您可以接受不精确的错误(即您可能无法捕获错误代码直到之后调用后续 CUDA API 调用)。

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

编辑: 在计算能力 2.0 及更高版本上,您可以使用 assert() 在调试构建中退出并出现错误。但不清楚这是否是您想要的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 2014-06-01
      • 2011-09-30
      • 1970-01-01
      • 2018-06-16
      • 2016-01-17
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多