Cuda中的多个GPU - 之前的工作代码,但不再是

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cuda中的多个GPU - 之前的工作代码,但不再是相关的知识,希望对你有一定的参考价值。

我最近遇到了在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;
}
答案

卸载并重新安装程序一天后,看起来这是398.26驱动程序的问题。较新版本399.07可按预期工作。

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

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

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

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

GPU 中的并行性 - CUDA / OpenCL

具有多个cuda版本的系统上的tensorflow-gpu安装问题

仅分配第一个 gpu(尽管我在 pytorch cuda 框架中使其他 gpu 可见)