C++ cuda程序崩溃示例

C++ cuda程序崩溃示例,c++,cuda,C++,Cuda,我正在用CUDA样本做一些测试,我们可以在本文中找到 如果我按照文章中的方式执行代码,它就可以正常工作。但是如果我改变主函数中的迭代次数,它就会崩溃。变化如下: int main(int argc, char ** argv) { ... for(int i=0; i<500000; i++) // I have change the number iterations from 100 to 500000 { float dt = (flo

我正在用CUDA样本做一些测试,我们可以在本文中找到

如果我按照文章中的方式执行代码,它就可以正常工作。但是如果我改变主函数中的迭代次数,它就会崩溃。变化如下:

int main(int argc, char ** argv)
{
    ...
    for(int i=0; i<500000; i++) // I have change the number iterations from 100 to 500000
    {
            float dt = (float)rand()/(float) RAND_MAX; // Random distance each step
            advanceParticles<<< 1 +  n/256, 256>>>(dt, devPArray, n);
            cudaDeviceSynchronize();
    }
    ...
}
int main(int argc,char**argv)
{
...
对于(int i=0;i(dt,devPArray,n);
cudaDeviceSynchronize();
}
...
}
我所做的唯一更改是迭代次数从100次更改为500000次。此更改的影响是设备崩溃,我需要重置工作站

那么我有一个问题: -有内核启动限制吗

如果没有限制,为什么程序会崩溃


谢谢。

是的,有一个限制,默认为5s左右。这是一个驱动程序看门狗限制,使主GPU的驱动程序(由于内核计算而无响应)终止程序,有时甚至挂起驱动程序和整个窗口

更多关于这方面的信息,例如:

在过去我使用CUDA进行实验时,我的解决方案是将计算拆分为多个内核调用

或者,您可以尝试增加Windows注册表中的超时时间:(我没有这方面的经验)

第一个链接中提到的另一个(但不是很有用)替代方案是使用一个额外的GPU卡,该卡不用于主显示器,只用于计算(那么看门狗定时器不应适用)


在Linux中,似乎也有一个限制,例如,请参见:

在这里:


编辑 似乎根据这个论坛的帖子:

即使是单独的内核调用也可能以某种方式累积(使GPU驱动程序忙碌)并触发看门狗

他们建议在每个内核调用之间放置
cudaThreadSynchronize()
(请注意,它不同于您的
cudaDeviceSynchronize()
,实际上它们的工作原理应该是一样的,但我发现有报告称代码使用cudaThreadSynchronize而不使用cudaDeviceSynchronize)


如果graphic X Windows没有运行,看门狗也不应该应用-如果是这种情况,您可以尝试重新启动到textmode(
sudo init 3
),然后运行程序,看看它是否可以工作。

是的,有一个限制,默认情况下大约为5秒。这是一个驱动程序看门狗限制,使主GPU的驱动程序(由于内核计算而没有响应)终止程序,有时甚至挂起驱动程序和整个窗口

更多关于这方面的信息,例如:

在过去我使用CUDA进行实验时,我的解决方案是将计算拆分为多个内核调用

或者,您可以尝试增加Windows注册表中的超时时间:(我没有这方面的经验)

第一个链接中提到的另一个(但不是很有用)替代方案是使用一个额外的GPU卡,该卡不用于主显示器,只用于计算(那么看门狗定时器不应适用)


在Linux中,似乎也有一个限制,例如,请参见:

在这里:


编辑 似乎根据这个论坛的帖子:

即使是单独的内核调用也可能以某种方式累积(使GPU驱动程序忙碌)并触发看门狗

他们建议在每个内核调用之间放置
cudaThreadSynchronize()
(请注意,它不同于您的
cudaDeviceSynchronize()
,实际上它们的工作原理应该是一样的,但我发现有报告称代码使用cudaThreadSynchronize而不使用cudaDeviceSynchronize)


如果graphic X Windows未运行,则看门狗也不应应用-若要查看是否存在这种情况,您可以尝试重新启动到文本模式(
sudo init 3
),然后运行程序以查看它是否可以工作。

因为您使用了cudaDeviceSynchronize(),在处理下一次迭代之前,您总是等待内核完成。这样,您永远不会同时启动多个唯一的内核。因此,这不是内核启动限制。因为您使用的是cudaDeviceSynchronize(),在处理下一次迭代之前,您总是在等待内核完成。这样,您永远不会同时启动多个唯一的内核。因此,这不是内核启动限制。是的,我了解了Windows下的看门狗限制。在我的情况下,我在Linux下工作。Linux中有看门狗限制吗?另一个信息是,我在w对于Tesla k20m卡和属性“kernelExecTimeoutEnabled”,我们可以使用“cudaDeviceProp”恢复该属性,该属性为0,这表明内核中没有执行时间限制。您在这里谈论的限制是内核的最大计算时间。如果这是问题,为什么示例会在50万次迭代而不是10次迭代时崩溃0?如果内核持续时间超过5秒,那么无论循环的迭代次数有多大,它都会在第一次迭代时导致崩溃。@Taro:是的,我在代码中遗漏了这一点。但可能是,内核的大小在某种程度上取决于
I
,因为我们没有看到代码(
i
可能决定
devPArray
n
)。嗯,看起来不是这样(在devblogs.nvidia.com上看到了原始代码)。是的,我读过Windows下的看门狗限制。就我而言,我是在Linux下工作的。Linux中有看门狗限制吗?另一个信息是,我使用的是Tesla k20m卡,我们可以使用“cudaDeviceProp”恢复的属性“kernelExecTimeoutEnabled”为0,这表明内核中没有执行时间限制这里所说的限制是内核的最大计算时间。如果这是个问题,为什么示例会在50万次迭代而不是10次迭代中崩溃