【问题标题】:Longish CUDA calls kill the driver冗长的 CUDA 调用杀死了驱动程序
【发布时间】:2016-03-15 02:24:33
【问题描述】:

我的理解是 CUDA 应该只用于计算广泛的代码,因为调用设置有很大的开销。但是,在我的情况下,每当内核调用超过大约 2 秒左右时,我就会从 Windows 任务栏收到一条消息,说明驱动程序崩溃并已恢复。我找到了两种方法来解决这个问题。 1 在注册表中的某处禁用看门狗计时器,我不愿意这样做。 2.将长调用拆分成更短的调用,这会带来 a/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;
   }
 }
}

我认为我正在做一些非常愚蠢的事情,因为它是非常基本的设置,应该可以正常工作。

【问题讨论】:

  • 除了您自己回答的问题之外,具体的问题是什么?
  • ^this,但也可能重复:stackoverflow.com/questions/17186638/…
  • 怎么是重复的?我不想更改超时或禁用它。我正在尝试找出一种分发商业应用程序的方法。到目前为止,我认为这个限制是一个非常严重的阻碍,以至于我们停止了这个方向的开发。

标签: cuda


【解决方案1】:

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

当然,拆分会在内核调用和同步方面带来一些开销。

【讨论】:

    【解决方案2】:

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

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers

    名称:TdrDelay
    类型:REG_DWORD
    值:期望的超时秒数

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

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多