- •1 Обозначения и сокращения
- •Введение
- •3 Обзор существующих работ
- •4 Постановка задачи
- •5 Метод решения
- •5.1 Расщепление
- •5.2 Адвекция
- •5.3 Проекция
- •6 Выбор метода выполнения этапа проекции
- •7 Полный многосеточный метод
- •8 Реализация этапа проекции
- •8.1 Входные данные
- •8.2 Сглаживатель
- •8.3 Расчёт невязки
- •8.4 Расчёт нормы невязки
- •8.5 Операторы огрубления и пролонгации
- •8.6 Взаимодействие между несколькими gpu
- •8.7 Результаты тестирования и валидации
- •9 Результаты
- •10 Список литературы
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: Рендер симуляции дыма.
