长时间的CUDA呼叫杀死司机
我的理解是,CUDA应该只用于计算范围广泛的代码,因为调用设置有很大的开销。然而,在我的例子中,每当内核调用超过大约2秒时,我就会从Windows任务栏收到一条消息,说明驱动程序崩溃并已恢复。我找到了两种方法来解决这个问题。1禁用注册表中某个地方的看门狗计时器,我不愿意这样做。2.将长调用拆分为短调用,这会带来a/m开销,而且我的CPU代码实际上运行得更快 代码本身非常简单,所以我不认为崩溃发生在代码中长时间的CUDA呼叫杀死司机,cuda,Cuda,我的理解是,CUDA应该只用于计算范围广泛的代码,因为调用设置有很大的开销。然而,在我的例子中,每当内核调用超过大约2秒时,我就会从Windows任务栏收到一条消息,说明驱动程序崩溃并已恢复。我找到了两种方法来解决这个问题。1禁用注册表中某个地方的看门狗计时器,我不愿意这样做。2.将长调用拆分为短调用,这会带来a/m开销,而且我的CPU代码实际上运行得更快 代码本身非常简单,所以我不认为崩溃发生在代码中 extern "C" __global__ void add( double *x, dou
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;
}
}
}
extern“C”\uuu全局\uuuu无效添加(双*x,双*y,双*z,双*d,双*n){
size_t idx=blockIdx.x*blockDim.x+threadIdx.x;
if(idx
我假设我正在做一些非常愚蠢的事情,因为这是非常基本的设置,应该可以正常工作。如果cuda设备是主显示设备,则cuda运行时受此windows特定驱动程序规则的约束。如果显示驱动程序在2秒钟内没有响应,它将重新启动,并且所有正在运行的内核都将被杀死。解决问题的唯一方法是分路通话或使用第二个显示卡进行可视化,这样第一个cuda设备将不受限制
当然,拆分会导致内核调用和同步的一些开销。可以通过添加注册表项来修改超时值 HKEY\U LOCAL\U MACHINE\System\CurrentControlSet\Control\GraphicsDrivers 名称:TdrDelay
类型:REG_DWORD
值:以秒为单位的所需超时
请记住,如果内核以某种方式进入无限循环,屏幕将锁定直到达到超时,然后驱动程序将重置。除了您自己回答的问题外,具体的问题是什么?^这也可能是重复的:它是如何重复的?我不想更改或禁用超时。我正试图找到一种发布商业应用程序的方法。到目前为止,我认为这个限制是一个非常严重的阻碍,以至于我们停止了这个方向的发展。