我正在使用我们在本文中找到的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的迭代次数。此更改的影响是设备崩溃,我需要重置工作站。
然后我有一个问题: - 是否有内核启动限制?
如果没有限制,为什么程序会崩溃?
谢谢。
答案 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?
即使是单独的内核调用也可能以某种方式累积(保持GPU驱动程序忙)并触发看门狗。
他们建议将cudaThreadSynchronize()
放在每个内核调用之间(注意它与您在那里的cudaDeviceSynchronize()
不同 - 实际上它们应该工作相同但我已经找到了代码报告使用cudaThreadSynchronize而不使用cudaDeviceSynchronize)。
如果图形X Windows未运行,看门狗也应该不适用 - 要查看是否是这种情况,您可以尝试重新启动到textmode(sudo init 3
)并运行程序以查看它是否可以运行