我正在使用一个包含4个GeForce GTX Titan黑卡的工作站进行CUDA开发。我正在使用Ubuntu 12.04.5,并且这些GPU都不用于显示。我注意到使用cudaGetDeviceProperties启用了内核执行超时。当我不在Windows上而不使用显示器时这是否适用?
我在下面的一个内核中运行以下代码进行测试,这些内核通常运行良好:
__global__ void update1(double *alpha_out, const double *sDotZ, const double *rho, double, *minusAlpha_out, clock_t *global_now)
{
clock_t start = clock();
clock_t now;
for (;;) {
now = clock();
clock_t cycles = now > start ? now - start : now + (0xffffffff - start);
if (cycles >= 50000000000) {
break;
}
}
*global_now = now;
}
内核启动如下:
update1<<<1, 1>>>(d_alpha + idx, d_tmp, d_rho + idx, d_tmp, global_now);
CudaCheckError();
cudaDeviceSynchronize();
如果有足够多的周期等待,我会看到错误:
CudaCheckError() with sync failed at /home/.../xxx.cu:295:
the launch timed out and was terminated
它可以在少量循环中运行良好。如果我在禁用内核执行超时的Tesla K20m GPU上运行相同的代码,我没有看到此错误,程序正常运行。如果我看到这个错误,它是否肯定意味着我正在达到似乎启用的内核时间限制,或者我的代码可能有其他问题?所有提到这个问题似乎是由使用Windows或使用他们的卡进行显示的人,所以我怎么可能看到这个错误?
答案 0 :(得分:3)
Linux也有显示看门狗。在Ubuntu上,根据我的经验,它对于通过xorg.conf
配置的显示设备是活动的(例如/etc/X11/xorg.conf
,但确切的配置方法将因发行版和版本而异)。
所以,是的,可以在Linux上看到内核执行超时错误。
通常,您可以通过多种方式解决此问题,但由于您有多个GPU,因此最好的方法是从显示配置中删除您要执行计算任务的GPU(例如xorg.conf或其他),然后在那些上运行您的计算任务。一旦X未配置为使用特定GPU,该GPU将不会有任何与之关联的监视程序。
其他具体细节见here。
如果要重新安装,另一种通常可以使计算GPU远离显示路径的方法是在未插入系统的GPU中加载Linux操作系统。在按照显示方式配置事物之后,将计算GPU添加到系统并加载linux工具包。您将需要手动加载显示驱动程序而不是让linux工具包执行此操作,并取消选择让Linux显示驱动程序安装程序修改xorg.conf
这同样可以让您的GPU配置为计算使用但保持不变显示路径。