tugrulGtx
Если вы можете распараллелить алгоритм и сопоставить его с графическим процессором, то вы можете легко выполнить аналогичную задачу, чтобы сопоставить его с несколькими графическими процессорами.
Вы можете просто сделать это, распределив половину работы на GPU1, а другую половину-на GPU2. Просто нужно использовать потоки для перекрытия двух графических процессоров рабочей временной шкалы. Таким образом, вы можете сократить общее время вычислений на 50%, если графические процессоры одинаково эффективны.
Если графические процессоры разные, то вам нужно будет решить, какой графический процессор получает какой процент проблемы, и его не так уж трудно решить.
В зависимости от выбранного вами способа "разделяй и властвуй" ядра графических процессоров могут выглядеть по-разному или одинаково. Входные данные могут быть одинаковыми, выходные-разными. Кроме того, видимость памяти может быть проще при использовании единой памяти.
Например, я написал ядро nbody с грубой силой (для 64k частиц) для работы на двух графических процессорах Quadro-K420(cc3.0) и имел производительность 405 GFLOPS (60% от пика) из них.
Вещи, которые могут вам помочь:
- кооперативные ядра
- единая память
- явный выбор устройства по потокам на ядрах и буферных копиях
Если у вас есть Kepler cc3.0, как у меня, то вы можете попробовать старый способ (разделение ядер и буферов на каждое устройство и явное управление ими).
Что это за частицы такие? Жидкие частицы с низким диапазоном сил? Гравитационно взаимодействующие частицы, обладающие дальнодействующими силами? Совершенно другой сценарий? Требуется ли каждому "обновлению" сотни вызовов ядра с глобальной синхронизацией данных или всего несколько ядер с 1 синхронизацией данных между всеми рабочими элементами? Для некоторых алгоритмов увеличение числа графических процессоров не может линейно расти в производительности, в то время как некоторые имеют хорошее масштабирование. Сколько вычислений на байт вы делаете в ядре? Не использовать атомные бомбы?