Cuda 中的多个 GPU - 以前可以工作的代码,但现在不行了

Posted

技术标签:

【中文标题】Cuda 中的多个 GPU - 以前可以工作的代码,但现在不行了【英文标题】:Multiple GPUs in Cuda - Working code before, but not any more 【发布时间】:2019-02-03 13:47:30 【问题描述】:

我最近遇到了在 Cuda 应用程序中使用多个 NVidia GPU 运行的问题。附加的代码能够在我的系统上的 Visual Studio 2013 和 2015(Windows 7、Cuda 9.2、Nvidia 驱动程序 398.26、1xGTX1080 和 1xGTX960)中一致地重现该问题。我正在为我的卡(5.2 和 6.1)构建正确的计算能力。

具体来说,在第一个 GPU 初始化后,我无法在第二个 GPU 上调用任何函数。错误代码始终为“CudaErrorMemoryAllocation”。它在 Nvidia 分析器以及调试和发布版本中都失败了。我可以按任一顺序在 GPU 上初始化并重现问题。

在尝试扩展我当前的应用程序时出现了这个问题,这是一个庞大的图像处理算法管道。此管道可以有多个独立实例,并且由于内存限制,需要多张卡。我对这个问题如此困惑的主要原因是我之前已经让它工作过 - 我有一个几年前运行的 Visual Profile 会话,它显示我的相同卡片的行为符合预期。我知道的唯一区别是它在 Cuda 8.0 中。

有什么想法吗?

#include "cuda_runtime.h"
#include "cuda.h"

#include <thread>
#include <conio.h>
#include <iostream>

// Function for each thread to run
void gpuThread(int gpuIdx, bool* result)

    cudaSetDevice(gpuIdx); // Set gpu index

    // Create an int array on CPU
    int* hostMemory = new int[1000000];
    for (int i = 0; i < 1000000; i++)
        hostMemory[i] = i;

    // Allocate and copy to GPU
    int* gpuMemory;
    cudaMalloc(&gpuMemory, 1000000 * sizeof(int));
    cudaMemcpy(gpuMemory, hostMemory, 1000000 * sizeof(int), cudaMemcpyHostToDevice);

    // Synchronize and check errors
    cudaDeviceSynchronize();
    cudaError_t error = cudaGetLastError();
    if (error != CUDA_SUCCESS)
    
        result[0] = false;
        return;
    

    result[0] =  true;


int main()

    bool result1 = false;
    bool result2 = false;

    std::thread t1(gpuThread, 0, &result1);
    std::thread t2(gpuThread, 1, &result2);

    t1.join();  // Wait for both threads to complete
    t2.join();

    if (!result1 || !result2) // Verify our threads returned success
        std::cout << "Failed\n";
    else
        std::cout << "Passed\n";

    std::cout << "Press a key to exit!\n";
    _getch();

    return 0;

【问题讨论】:

如果您在所有 API 调用上添加竞争错误诅咒,您可能会更清楚地了解可能发生的情况。如果你不使用线程会发生什么?你说唯一的变化是 CUDA 版本,但是如果几年过去了,那么你有一堆操作系统和工具链更新,一个不同的显示驱动程序。您将不得不一一通过所有这些.... 感谢您的回复。我应该在没有线程的情况下发布示例代码;如果它在一个线程上运行,问题是一样的。我确实在整个应用程序中进行了彻底的错误检查,第二个 GPU 上的结果始终是“CudaErrorMemoryAllocation”。幸运的是,代码存在于未联网的 PC 上,并且操作系统根本没有更新。我也知道最后一次使用相同的 VS2013 安装。今天将用于回滚 Cuda 和驱动程序版本,看看我是否可以重现旧行为,但是两年的提交需要筛选很多。 在卸载和重新安装程序一天后,这似乎是 398.26 驱动程序的问题。较新的版本 399.07 可以正常工作。 您想将其添加为答案,以便我们将此问题从未回答列表中删除吗? 抱歉,我是这个网站的新手,现在不知道如何清理它。谢谢! 【参考方案1】:

在卸载和重新安装程序一天后,这似乎是 398.26 驱动程序的问题。较新的版本 399.07 可以正常工作。

【讨论】:

以上是关于Cuda 中的多个 GPU - 以前可以工作的代码,但现在不行了的主要内容,如果未能解决你的问题,请参考以下文章

GPU cuda代码可以在多个GPU卡上运行而无需任何实现吗?

多 GPU 分析(多个 CPU,MPI/CUDA 混合)

来自 CUDA 代码的 100% GPU 使用率导致屏幕滞后

如何在cuda中的不同gpu之间复制内存

CUDA 学习(十六)优化策略1:并行/串行在GPU/ CPU 上的问题分解

如何知道 CAFFE 代码是使用 GPU 还是 CUDA 代码运行?