CUDA - 启动超时并被终止 - Ubuntu 并且没有显示



我正在使用一个包含 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

它在少量周期内运行良好。如果我在禁用内核执行超时的情况下在特斯拉 K20m GPU 上运行相同的代码,我看不到此错误,程序正常运行。如果我看到此错误,这是否肯定意味着我达到了似乎已启用的内核时间限制,或者我的代码可能有其他问题?所有提到这个问题的人似乎都是使用 Windows 或使用他们的卡进行显示的,所以我怎么可能看到这个错误?

Linux也有一个显示看门狗。 在 Ubuntu 上,根据我的经验,它对于通过 xorg.conf 配置的显示设备是有效的(例如 /etc/X11/xorg.conf ,但确切的配置方法因发行版版本而异)。

所以是的,有可能在 Linux 上看到内核执行超时错误。

通常,您可以通过多种方式解决它,但由于您有多个 GPU,最好的方法是从显示配置中删除要执行计算任务的 GPU(例如 xorg.conf 或其他),然后在这些配置上运行计算任务。 一旦 X 未配置为使用特定 GPU,该 GPU 将不会有任何与之关联的看门狗。

此处提供了其他具体细节。

如果您要重新安装东西,另一种通常可以使您的计算 GPU 远离显示路径的方法是在未插入系统的 GPU 的情况下加载 Linux 操作系统。 按照您想要的显示方式配置后,将计算 GPU 添加到系统并加载 linux 工具包。 您需要手动加载显示驱动程序,而不是让 linux 工具包执行此操作,并取消选择让 linux 显示驱动程序安装程序修改xorg.conf的选项 这同样会让你的 GPU 配置为使用计算,但将它们排除在显示路径之外。

最新更新