Longish CUDA叫杀了司机

时间:2015-12-09 17:27:01

标签: cuda

我的理解是CUDA应仅用于计算扩展代码,因为呼叫设置具有显着的开销。但是在我的情况下,每当内核调用超过大约2秒左右时,我从Windows任务栏收到一条消息,告知驱动程序崩溃并被恢复。我找到了两种方法来打败这个。 1在注册表中的某处禁用监视程序计时器,我不愿意这样做。 2.将长调用分成较短的调用,这会带来一个/ m的开销,而我的CPU代码实际运行得更快。

代码本身非常简单,所以我不认为崩溃发生在代码中。

extern "C" __global__ void add( double *x, double *y, double *z,  double *d, double * n ) {
 size_t idx = blockIdx.x * blockDim.x + threadIdx.x;
 if (idx < n[0])
 {
   double thisX = x[idx];
   double thisY = y[idx];
   double thisZ = z[idx];

   //int i = tid;
   for(int i = 0; i < n[0]; i++)
   {
       double distance = sqrt((thisX-x[i])*(thisX-x[i]) + (thisY-y[i])*(thisY-y[i]) + (thisZ-z[i])*(thisZ-z[i]));
       d[idx] = distance;
   }
 }
}

我认为我做的事非常愚蠢,因为它是非常基本的设置,应该没有任何问题。

2 个答案:

答案 0 :(得分:1)

如果您的cuda设备是您的主显示设备,则cuda运行时受此特定于Windows的驱动程序规则的约束。如果显示驱动程序2秒没有响应,它将重新启动并且所有正在运行的内核都将被终止。解决问题的唯一方法是拆分您的电话或使用第二张显卡进行可视化,这样第一台cuda设备就可以不受限制。

当然,拆分意味着内核调用和同步会产生一些开销。

答案 1 :(得分:1)

可以通过添加注册表项来修改超时值。

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\ GraphicsDrivers

名称:TdrDelay
键入:REG_DWORD
值:第二个所需的超时

请记住,如果您的内核以某种方式进入无限循环,您的屏幕将锁定,直到达到超时,然后驱动程序将重置。