Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Новиков. Магистерская диссертация.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
523.12 Кб
Скачать

8.6 Взаимодействие между несколькими gpu

До этого речь шла о расчётах только на одном графическом ускорителе, однако разработанное средство способно производить решение и на нескольких GPU.

Для этого используется технология CUDA Unified Virtual Addressing. Начиная с версии 4.0 в CUDA появилась возможность создавать общее адресное пространство для всех вычислительных устройств в системе, то есть для того, чтобы скопировать данные с одного устройства на другое не нужно хранить информацию о том, что это за устройства, достаточно лишь знать указатели на источник и приемник данных, а функций cudaMemcpy сама понимает, как производить копирование. Более того, начиная с CUDA 6.0 и поколения Kepler, cudaMemcpy научилась при возможности автоматически использовать режим Peer-to-peer для прямого копирования данных с одного GPU на другой, избегая передачи данных через центральный процессор. Для активации этой возможности достаточно лишь включить в коде режим Peer-to-peer для каждого из используемых GPU. Именно этот механизм использован в данной работе.

Все данные равномерно распределяются между графическими ускорителями, при этом часть данных перекрывается двумя соседними GPU – у каждой пары соседних карт есть по два общих слоя данных (Рисунок 8). В сглаживателе каждый из ускорителей сначала производит вычисление тех значений, которые потребуются соседним ускорителям на следующих итерациях. Затем все невыколотые узлы упаковываются в буфер, размер которого равен максимально возможной длине пересылаемых данных. Так как маски общих узлов доступны каждому из соседних ускорителей, при обмене данным сосед легко может распаковать полученные данные.

Рисунок 8: Распределение данных между GPU. Синим обозначены данные на GPU0, зелёным - на GPU1, серым – выколотая область, а красным - область в которой постоянно происходит обмен данными между ускорителями.

Выполняется асинхронный обмен данными с помощью функции cudaMemcpyAsync(). Пока происходит обмен данными, ускорители рассчитывают области, выделенные для них монопольно.

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

8.7 Результаты тестирования и валидации

Валидация производилась с использованием модифицированной версии солвера, в которую кроме условий Дирихле так же передавались условия Неймана, что позволило численно решить задачу с существующим аналитическим решением.

В кубе

Аналитическое решение такой задачи находится с точностью до константы:

Однако если наложить дополнительное условие на внешние границы:

Получим аналитическое решение:

График 3: Зависимость погрешности решения от номера итерации. Сетка 129х129х129

Эту задачу удалось решить с помощью разработанного солвера. Зависимость погрешности решения от номера V-цикла отображена на графике 3.

Также была проверена работоспособность программы на системе с двумя графическими ускорителями: Nvidia Tesla K20c и Nvidia Tesla K40c - и замерена производительность.

На двух картах было получено более чем полуторакратное ускорение решения.

График 4: Время решения задачи в зависимости от невязки на GPU. Сетка 257x257x257

Так же удалось полностью промоделировать решение системы Навье-Стокса, а затем произвести рендеринг итогового изображения с использованием Blender Cycles. Результат представлен на рисунке 9.

Рисунок 9: Рендер симуляции дыма.