【问题标题】:Sample cuda program crash示例 cuda 程序崩溃
【发布时间】:2023-03-31 08:30:01
【问题描述】:

我正在使用本文https://devblogs.nvidia.com/parallelforall/separate-compilation-linking-cuda-device-code/中可以找到的 CUDA 示例进行一些测试

如果我按照文章中的代码执行代码,它就可以正常工作。但是,如果我更改主函数中的迭代次数,它就会崩溃。变化如下:

int main(int argc, char ** argv)
{
    ...
    for(int i=0; i<500000; i++) // I have change the number iterations from 100 to 500000
    {
            float dt = (float)rand()/(float) RAND_MAX; // Random distance each step
            advanceParticles<<< 1 +  n/256, 256>>>(dt, devPArray, n);
            cudaDeviceSynchronize();
    }
    ...
}

我所做的唯一更改是从 100 到 500000 的迭代次数。此更改的影响是设备崩溃,我需要重置工作站。

然后我有一个问题: - 有内核启动限制吗?

如果没有限制,程序为什么会崩溃?

谢谢。

【问题讨论】:

  • 由于您使用 cudaDeviceSynchronize(),您总是在等待内核完成后再处理下一次迭代。这样您就不会一次启动多个独特的内核。所以这不是内核启动限制。

标签: c++ cuda


【解决方案1】:

是的,有一个限制,默认为 5 秒左右。这是一个驱动看门狗限制,使主GPU的驱动(由于内核计算而无响应)终止程序,有时甚至挂起驱动和整个Windows。

有关此的更多信息,例如这里:How can I override the CUDA kernel execution time limit on Windows with a secondary GPUs?

过去我在试验 CUDA 时也遇到过这种情况,当时我的解决方案是将计算拆分为多个内核调用。

或者,您可以尝试增加 Windows 注册表中的超时时间:Modifying registry to increase GPU timeout, windows 7(我没有这方面的经验)。

第一个链接中还提到的另一个(但不是那么有用)替代方案是使用额外的 GPU 卡,它不会为主显示器提供服务,而只会用于计算(那么看门狗计时器不应该适用于它)。


在 Linux 中,似乎也有一个限制,参见例如这里:https://askubuntu.com/questions/348756/disable-cuda-run-time-limit-on-kernels

在这里:How to disable or change the timeout limit for the GPU under linux?


编辑

好像根据这个论坛帖子:https://devtalk.nvidia.com/default/topic/414479/the-cuda-5-second-execution-time-limit-finding-a-the-way-to-work-around-the-gdi-timeout/

即使是单独的内核调用也可能会以某种方式累积(保持 GPU 驱动程序忙碌)并触发看门狗。

他们建议在每个内核调用之间放置 cudaThreadSynchronize()(注意它与您那里的 cudaDeviceSynchronize() 不同 - 实际上它们应该工作相同,但我发现代码与 cudaThreadSynchronize 一起工作但不工作的报告与 cudaDeviceSynchronize)。

如果图形 X Windows 没有运行,看门狗也不应该应用 - 要查看是否是这种情况,您可以尝试重新启动到 textmode (sudo init 3) 并运行程序以查看它是否可以工作。

【讨论】:

  • 是的,我读到了 Windows 下的看门狗限制。就我而言,我在 Linux 下工作。 Linux 中有看门狗限制吗?
  • 另一个信息是我正在使用 Tesla k20m 卡,我们可以使用 'cudaDeviceProp' 恢复的属性 'kernelExecTimeoutEnabled' 为 0,这表明内核中没有执行时间限制。
  • 您在这里谈论的限制是内核的最大计算时间。如果这是问题所在,为什么样本会在 500'000 次迭代而不是 100 次时崩溃?如果内核持续时间超过 5 秒,无论循环的迭代次数如何,它都会在第一次迭代时导致崩溃。
  • @Taro:没错,我在代码中错过了这一点。但它可能是,内核的大小在某种程度上取决于i,因为我们看不到代码(i 可能决定devPArrayn)。
  • 哼,好像不是这样(在devblogs.nvidia.com上看到了原始代码)。
猜你喜欢
  • 2018-12-23
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2019-07-07
相关资源
最近更新 更多