样本cuda程序崩溃

时间:2016-12-16 14:28:52

标签: c++ cuda

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

如果我按照文章的原样执行代码就行了。但是如果我改变主函数中的迭代次数就会崩溃。更改如下:

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的迭代次数。此更改的影响是设备崩溃,我需要重置工作站。

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

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

谢谢。

1 个答案:

答案 0 :(得分:2)

是的,有一个限制,默认情况下是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)并运行程序以查看它是否可以运行