我的理解是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;
}
}
}
我认为我做的事非常愚蠢,因为它是非常基本的设置,应该没有任何问题。
答案 0 :(得分:1)
如果您的cuda设备是您的主显示设备,则cuda运行时受此特定于Windows的驱动程序规则的约束。如果显示驱动程序2秒没有响应,它将重新启动并且所有正在运行的内核都将被终止。解决问题的唯一方法是拆分您的电话或使用第二张显卡进行可视化,这样第一台cuda设备就可以不受限制。
当然,拆分意味着内核调用和同步会产生一些开销。
答案 1 :(得分:1)
可以通过添加注册表项来修改超时值。
HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\ GraphicsDrivers
名称:TdrDelay
键入:REG_DWORD
值:第二个所需的超时
请记住,如果您的内核以某种方式进入无限循环,您的屏幕将锁定,直到达到超时,然后驱动程序将重置。