Стратегии программирования для нескольких графических процессоров с использованием CUDA

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

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

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

Спасибо,
Саян

РЕДАКТИРОВАТЬ:

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


person Sayan    schedule 01.07.2011    source источник
comment
Я бы пошел с несколькими потоками хоста - (равными) несколькими устройствами, независимыми контекстами, потому что для этого подхода, похоже, как можно меньше обмена данными, чтобы вы могли максимизировать параллелизм. Однако я не занимаюсь GPGPU, так что это просто общее наблюдение.   -  person Roy T.    schedule 01.07.2011


Ответы (2)


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

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

person ArchaeaSoftware    schedule 29.07.2011
comment
как насчет (1) в настройках SLI? - person osgx; 29.07.2011
comment
SLI - это просто частный случай использования нескольких графических процессоров, если вы настроили графические процессоры для отдельного перечисления. По умолчанию SLI делает несколько графических процессоров похожими на один более быстрый графический процессор; но CUDA может использовать только один из графических процессоров, если система настроена таким образом. - person ArchaeaSoftware; 30.07.2011

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

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

person peakxu    schedule 03.07.2011
comment
Система с несколькими графическими процессорами представляет собой приблизительно 1U с 2 процессорами и 4 графическими процессорами. Я хочу протестировать все вышеперечисленные категории и профилировать их ... да, до сих пор я видел лучшие результаты в этой категории и считаю, что такие проблемы идеально подходят для графических процессоров. Хотя у меня есть ощущение, что несколько потоков хоста - одновременное выполнение ядер на одном устройстве - независимый контекст может быть выгодным по сравнению с потребляемой мощностью для определенных размеров проблем. - person Sayan; 04.07.2011