2015-01-23 4 views
0

У меня есть компьютер с 2 графическими процессорами; Я написал программу CUDA C, и мне нужно как-то сказать, что я хочу запустить ее только на 1 из 2 графических карт; Какую команду мне нужно вводить и как ее использовать? Я считаю, что это связано с cudaSetDevice, но я не могу понять, как его использовать.Как выбрать GPU с CUDA?

+0

Что вы попробовали? – Azrael3000

+0

Вопрос может быть немного неясным, действительно ли вы хотите запустить его только на 1 из 2 графических карт или «хотите запустить его на первой из двух графических карт»? Поскольку первое требование выполняется уже, если вы не создаете приложение, которое _forces_ использует все доступные графические процессоры. –

+0

Что я хочу сделать, просто выберите графическую карту, которую я хочу: в моем случае вторая. –

ответ

3

Это должно быть довольно ясно из documentation of cudaSetDevice, но позвольте мне предоставить следующий фрагмент кода.

bool IsGpuAvailable() 
{ 
    int devicesCount; 
    cudaGetDeviceCount(&devicesCount); 
    for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex) 
    { 
     cudaDeviceProp deviceProperties; 
     cudaGetDeviceProperties(&deviceProperties, deviceIndex); 
     if (deviceProperties.major >= 2 
      && deviceProperties.minor >= 0) 
     { 
      cudaSetDevice(deviceIndex); 
      return true; 
     } 
    } 

    return false; 
} 

Это, как я итерация всех доступных графических процессоров (cudaGetDeviceCount) ищет первый из Compute Capability, по меньшей мере, 2,0. Если такое устройство было найдено, то я использовал cudaSetDevice, поэтому все вычисления CUDA были выполнены на этом конкретном устройстве. Без выполнения cudaSetDevice ваше приложение CUDA будет выполняться на первом графическом процессоре, то есть с deviceIndex == 0, но какой конкретный графический процессор зависит от того, какой графический процессор находится в слоте PCIe.

EDIT:

После уточнения свой вопрос в комментариях, мне кажется, что она должна быть подходящей для вас, чтобы выбрать устройство, основанное на его имени. Если вы не знаете о своих реальных именах GPU, а затем запустить этот код, который будет печатать имена всех графических процессоров в консоль:

int devicesCount; 
cudaGetDeviceCount(&devicesCount); 
for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex) 
{ 
    cudaDeviceProp deviceProperties; 
    cudaGetDeviceProperties(&deviceProperties, deviceIndex); 
    cout << deviceProperties.name << endl; 
} 

После этого, выберите имя графического процессора, который вы хотите использовать для вычислений, позволяет скажем, "GTX XYZ". Вызовите следующий метод из вашего метода main, благодаря ему все ядра CUDA будут выполнены на устройстве с именем "GTX XYZ". Вы должны также проверить возвращаемое значение - true, если устройство с таким именем найдено, false иначе:

bool SetGPU() 
{ 
    int devicesCount; 
    cudaGetDeviceCount(&devicesCount); 
    string desiredDeviceName = "GTX XYZ"; 
    for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex) 
    { 
     cudaDeviceProp deviceProperties; 
     cudaGetDeviceProperties(&deviceProperties, deviceIndex); 
     if (deviceProperties.name == desiredDeviceName) 
     { 
      cudaSetDevice(deviceIndex); 
      return true; 
     } 
    } 

    return false; 
} 

Конечно, вы должны изменить значение переменной desiredDeviceName до требуемого значения.

+0

Так что я должен переписать эти строки в своей основной программе, а затем ввести «cudaSetDevice» перед вызовом ядра? –

+0

@FedericoGentile см. Раздел ** EDIT ** моего ответа, он должен решить вашу ситуацию. –

+0

Это действительно сработало!спасибо –

1

Более внимательный поиск в Интернете Я нашел эти строки кода, которые выбирают графический процессор с большим количеством ядер среди всех устройств, установленных на ПК.

int num_devices, device; 
cudaGetDeviceCount(&num_devices); 
if (num_devices > 1) { 
    int max_multiprocessors = 0, max_device = 0; 
    for (device = 0; device < num_devices; device++) { 
      cudaDeviceProp properties; 
      cudaGetDeviceProperties(&properties, device); 
      if (max_multiprocessors < properties.multiProcessorCount) { 
        max_multiprocessors = properties.multiProcessorCount; 
        max_device = device; 
      } 
    } 
    cudaSetDevice(max_device); 
} 
Смежные вопросы