У меня есть компьютер с 2 графическими процессорами; Я написал программу CUDA C, и мне нужно как-то сказать, что я хочу запустить ее только на 1 из 2 графических карт; Какую команду мне нужно вводить и как ее использовать? Я считаю, что это связано с cudaSetDevice, но я не могу понять, как его использовать.Как выбрать GPU с CUDA?
ответ
Это должно быть довольно ясно из 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
до требуемого значения.
Так что я должен переписать эти строки в своей основной программе, а затем ввести «cudaSetDevice» перед вызовом ядра? –
@FedericoGentile см. Раздел ** EDIT ** моего ответа, он должен решить вашу ситуацию. –
Это действительно сработало!спасибо –
Более внимательный поиск в Интернете Я нашел эти строки кода, которые выбирают графический процессор с большим количеством ядер среди всех устройств, установленных на ПК.
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);
}
- 1. как выбрать назначенный GPU для запуска программы CUDA?
- 2. Как определить производительность CUDA gpu?
- 3. Расчет нескольких GPU Cuda
- 4. CUDA: GPU Working
- 5. CUDA: Передает данные от GPU к GPU
- 6. Multi-gpu CUDA Thrust
- 7. cuda gpu: разъяснение терминологии
- 8. Cuda массив заполнение GPU
- 9. Как выполнить ядро CUDA на данном GPU?
- 10. Таймеры CUDA - процессор против GPU?
- 11. CUDA Kernel Scheduler на GPU
- 12. Параллельность в GPU - CUDA/OpenCL
- 13. CUDA мульти - GPU функции добавить
- 14. Компиляция ядра CUDA Multi-GPU
- 15. эффективно передавать многомерный массив с CUDA GPU
- 16. Tensorflow с GPU и CUDA v5.5
- 17. CUDA GPU медленнее, чем CPU
- 18. CUDA: Копирование массивов в GPU
- 19. Несколько потоков CUDA сбой GPU
- 20. сборка opencv с поддержкой gpu cuda
- 21. nVidia CUDA на GPU с интерфейсом PCI
- 22. Как выбрать не занятое устройство CUDA?
- 23. Программирование с несколькими GPU с использованием CUDA на машине NUMA
- 24. CUDA - Мой GPU (Quadro M2000M) указан как совместимый с CUDA, но установка CUDA не работает?
- 25. Как выбрать gpu среди нескольких nvidia gpu в ffmpeg 3.2.0?
- 26. Есть ли тесты для CUDA-GPU или для MPI-CPU + CUDA-GPU?
- 27. GPU/CUDA: память повторного заказа памяти
- 28. ffmpeg status & quality/cuda (CPU/GPU)
- 29. CUDA GPU Integer/Float Size Constraint
- 30. Драйвер CUDA слишком стар для GPU Matlab?
Что вы попробовали? – Azrael3000
Вопрос может быть немного неясным, действительно ли вы хотите запустить его только на 1 из 2 графических карт или «хотите запустить его на первой из двух графических карт»? Поскольку первое требование выполняется уже, если вы не создаете приложение, которое _forces_ использует все доступные графические процессоры. –
Что я хочу сделать, просто выберите графическую карту, которую я хочу: в моем случае вторая. –