我使用这段(简化后的)代码时,遇到了Cuda错误6(也称为cudaErrorLaunchTimeout
和CUDA_ERROR_LAUNCH_TIMEOUT
):
for(int i = 0; i < 650; ++i)
{
int param = foo(i); //some CPU computation here, but no memory copy
MyKernel<<<dimGrid, dimBlock>>>(&data, param);
}
Cuda错误6表示内核花费的时间过长。尽管单个MyKernel持续时间仅约为60毫秒,块大小为经典的16×16。现在,当我每隔50次迭代调用cudaDeviceSynchronize()时,错误就不会发生了。
for(int i = 0; i < 650; ++i)
{
int param = foo(i); //some CPU computation here, but no memory copy
MyKernel<<<dimGrid, dimBlock>>>(&data, param);
if(i % 50 == 0) cudaDeviceSynchronize();
}
我希望避免这种同步方式,因为它会严重降低程序的速度。由于内核启动是异步的,我猜测错误发生是因为看门狗测量了内核从异步启动到实际开始执行所用的时间。我对Cuda还不熟悉。这种错误6是否经常出现?有没有一种方法可以避免这种错误而不影响性能?