Стратегии программирования нескольких GPU с использованием CUDA - PullRequest
7 голосов
/ 01 июля 2011

Мне нужен совет по проекту, который я собираюсь предпринять. Я планирую запускать простые ядра (пока не принято решение, но я использую смущающе параллельные ядра) на узле с несколькими графическими процессорами, используя CUDA 4.0, следуя приведенным ниже стратегиям. Намерение состоит в том, чтобы профилировать узел, запуская ядра в различных стратегиях, которые CUDA предоставляет в среде с несколькими графическими процессорами.

  1. Один хост-поток - несколько устройств (общий контекст)
  2. Один хост-поток - одновременное выполнение ядер на одном устройстве (общий контекст)
  3. Несколько потоков хоста - (равно) Несколько устройств (независимые контексты)
  4. Один хост-поток - последовательное выполнение ядра на одном устройстве
  5. Несколько потоков хоста - одновременное выполнение ядер на одном устройстве (независимые контексты)
  6. Несколько потоков хоста - последовательное выполнение ядер на одном устройстве (независимые контексты)

Я пропускаю какие-либо категории? Каково ваше мнение о категориях тестов, которые я выбрал, и любые общие советы по программированию нескольких GPU приветствуются.

Спасибо
Саян

EDIT:

Я думал, что предыдущая классификация включала некоторую избыточность, поэтому изменил ее.

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Большинство рабочих нагрузок достаточно легки при работе с процессором, так что вы можете манипулировать несколькими графическими процессорами из одного потока, но это стало легко возможным, начиная с CUDA 4.0.До CUDA 4.0 вы вызывали cuCtxPopCurrent () / cuCtxPushCurrent () , чтобы изменить текущий контекст для данного потока.Но, начиная с CUDA 4.0, вы можете просто вызвать cudaSetDevice () , чтобы установить текущий контекст, соответствующий данному устройству.

Ваш вариант 1) является неправильным, посколькунет «общего контекста» - контексты GPU по-прежнему разделены, а память устройства и объекты, такие как потоки CUDA и события CUDA, связаны с контекстом GPU, в котором они были созданы.

1 голос
/ 03 июля 2011

Несколько потоков хоста - равное нескольким устройствам, независимый контекст - победитель, если вам это сойдет с рук.Это предполагает, что вы можете получить действительно независимые единицы работы.Это должно быть правдой, поскольку ваша проблема смущающе параллельна.

Предостережение: я лично не создавал крупномасштабную систему с несколькими GPU.Я построил успешную систему с одним графическим процессором с ускорением на 3 порядка относительно процессоров.Таким образом, совет - обобщение затрат на синхронизацию, которые я видел, а также обсуждение с моими коллегами, которые создали системы с несколькими GPU.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...