«Автоматическое отображение Фортран-программ на графический процессор»


Особенности графических ускорителей



бет2/7
Дата19.07.2016
өлшемі1.18 Mb.
#209881
түріДипломная работа
1   2   3   4   5   6   7

1.2 Особенности графических ускорителей




Архитектура графического ускорителя.
Графические процессоры не рассчитаны на исполнение сложного потока инструкций с большим количеством ветвлений, переходов, вызовов функций и подпрограмм; графические процессоры нацелены на обработку больших объёмов независимых данных. Изначально графический процессор создавался как многоядерная структура, в которой количество ядер может достигать сотен. Каждое ядро способно выполнять арифметические операции и обращаться к памяти. Набор команд ограничен по сравнению с традиционными процессорами, что компенсируется возможностью быстрого переключения между потоками инструкций. Это применялось при обработке массивов пикселей в задачах компьютерной графики, однако, архитектура графических ускорителей была доработана: в настоящее время поддерживаются массивы данных всех основных типов.

Рисунок 1. Схема структуры графического ускорителя.

GPU состоит из 16 потоковых мультипроцессоров (здесь и далее цифры будут приводиться для архитектуры Fermi, compute capability 2.0), каждый из которых содержит 32 скалярных процессорных ядра, четыре специальных функциональных блока (SFU), два планировщика варпов (warp scheduler), кэш первого уровня, совмещённый с разделяемой памятью, два текстурных блока (TEX) и набор 32-битных регистров (register file). Кэш-память второго уровня размером 768 Кбайт является общей для всех мультипроцессоров. Обмен с глобальной памятью ускорителя осуществляется через специальный интерфейс. Сохранение результатов вычислений производится в памяти хост-системы, обмен с которой происходит по шине PCI-Express.

Рисунок 2. Структура потокового мультипроцессора.



Программирование на графическом ускорителе.
Из-за своей массивно параллельной архитектуры (потенциально – 512 вычислительных ядер на одном ускорителе для Fermi) GPU наиболее эффективны при решении задач, обладающих параллелизмом по данным, число арифметических операций в которых велико по сравнению с обращениями к памяти.
Основная идея состоит в том, чтобы разделить большие объёмы информации на независимые участки, каждый участок обработать отдельной группой нитей [12]. Все группы реализуют один и тот же алгоритм над входными данными. Отдельные группы нитей образуют блок. Блоки могут быть одномерными, двумерными или трёхмерными. В пределах блока нити используют разделяемую память, но порядок исполнения неизвестен заранее, определяется динамически. Как следствие этого, необходимо обеспечить явную синхронизацию между нитями в блоке. Также следует помнить, что чем больше ресурсов требуется каждой нити, тем меньше их в блоке, так как размер блока ограничен аппаратными возможностями ускорителя. Чтобы покрыть весь объём входных данных, блоки объединяются в решётки блоков. Размер решётки блоков ничем не ограничен, так как не требуется параллельного исполнения всех блоков. Как только ускоритель заканчивает исполнение какого-либо блока, он переключается на следующий. При этом если ресурсов на потоковом мультипроцессоре хватает, то одновременно запускается несколько блоков.

1.3 Автоматизация распараллеливания программ

Альтернативы метода создания параллельной программы – создание новой параллельно программы или распараллеливания старой последовательной. Очевидно, что создание параллельной программы “с нуля” требует от прикладного программиста знания технологии параллельного программирования. С учётом гетерогенности кластеров – нескольких технологий параллельного программирования. Кроме того, часто оказывается полезным иметь последовательный вариант программы, например, для упрощения отладки реализованного алгоритма или метода. Что приводит нас к ситуации распараллеливания последовательной программы. В настоящее время существуют высокоуровневые модели, в которых для отображения на параллельные системы в текст последовательных программ добавляются спецификации. Эти спецификации оформляются либо в виде комментариев особого вида (справедливо для систем, основанных на языке Фортран), либо в виде директив компилятору (для систем, основанных на языках С/С++). Такой моделью для мультипроцессоров является OpenMP, для кластеров - DVM и HPF.


Полностью автоматическое распараллеливание последовательной программы для современных кластеров невозможно [7]. Однако, если ввести некоторую дисциплину при написании программ и позволить вставлять в программу подсказки распараллеливателю, то такие программы могут быть автоматически преобразованы в программы, способные параллельно выполняться на кластере. Необходимо понимать, что использование в узлах кластера графических процессоров вносит дополнительные трудности в оценку возможности преобразования, т.к. не всякая задача может быть эффективно решена с помощью графического ускорителя.

Эффективность графического ускорителя.

На эффективность оказывают влияние следующие факторы:




  • Выбор схемы распределения данных. Как было показано выше, из-за массивно-параллельной архитектуры ускорителя, лучше всего обрабатываются задачи с параллелизмом по данным. А значит, выбор удачной схемы распределения очень важен.

  • Выбор решётки блоков. Из-за технических параметров ускорителя размерности блоков и количество запрашиваемых ресурсов оказывают существенное влияние на производительность вычислений.

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

  • Наличие условных и безусловных переходов в коде. При их наличии нити внутри варпа имеют разные пути исполнения, что приводит повторному выполнению инструкций всем варпом.

  • Проведение коллективных операций, наличие синхронизации.

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



  • разработчик сможет прогнозировать результаты, меняя тем или иным образом схему распределения данных, предполагаемую конфигурацию запуска или алгоритм, который отображается на GPU;

  • такой инструмент может быть использован в системе автоматического распараллеливания для поиска наилучшей схемы распределения данных по вычислительным узлам (разумеется, наилучшей – с точки зрения выполнения вычислений на графическом ускорителе);

  • такой инструмент позволяет получить оценки ещё до построения параллельной программы.





Достарыңызбен бөлісу:
1   2   3   4   5   6   7




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет