Несколько графических процессоров в Cuda - рабочий код раньше, но не больше - PullRequest
0 голосов
/ 28 августа 2018

Недавно я столкнулся с проблемой работы с несколькими графическими процессорами NVidia в приложении Cuda. Прикрепленный код способен последовательно воспроизвести проблему в моей системе как в Visual Studio 2013, так и в 2015 году (Windows 7, Cuda 9.2, драйвер Nvidia 398.26, 1xGTX1080 и 1xGTX960). Я строю правильные вычислительные возможности для моих карт (5.2 и 6.1).

В частности, после инициализации первого графического процессора я не могу заставить работать какие-либо вызовы функций второго графического процессора. Код ошибки последовательно "CudaErrorMemoryAllocation". Это терпит неудачу в профилировщике Nvidia и в сборках отладки и выпуска. Я могу инициализировать на графических процессорах в любом порядке и воспроизвести проблему.

Эта проблема возникла при попытке масштабировать мое текущее приложение, представляющее собой большой конвейер алгоритмов обработки изображений. Может быть несколько независимых экземпляров этого конвейера, и из-за ограничений памяти потребуется несколько карт. Основная причина, по которой меня так смущает эта проблема, заключается в том, что она работала раньше - у меня был сеанс визуального профиля, который я провел пару лет назад и который показывает, что мои карты работают так, как и ожидалось. Единственное различие, о котором я знаю, это то, что это было в 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;
}

1 Ответ

0 голосов
/ 29 августа 2018

После дня удаления и переустановки программ кажется, что это проблема с драйвером 398.26. Более новая версия, 399.07, работает как положено.

...