Инструмент автоматического распараллеливания - Automatic parallelization tool

В течение нескольких лет параллельное оборудование было доступно только для распределенных вычислений но в последнее время он стал доступен и для младших компьютеров. Следовательно, для программистов стало неизбежным начинать писать параллельные приложения. Для программистов вполне естественно думать последовательно, и поэтому они менее знакомы с написанием многопоточный или же параллельная обработка Приложения. Параллельное программирование требует решения различных проблем, таких как синхронизация и тупик избегание. Программистам требуются дополнительные знания для написания таких приложений, помимо их опыта в прикладной области. Следовательно, программисты предпочитают писать последовательный код, и большинство популярных языков программирования поддерживают его. Это позволяет им больше сосредоточиться на приложении. Следовательно, существует необходимость преобразовывать такие последовательные приложения в параллельные с помощью автоматизированных средств. Необходимость также нетривиальна, потому что большое количество унаследованного кода, написанного за последние несколько десятилетий, необходимо повторно использовать и распараллеливать.

Необходимость автоматического распараллеливания

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

Общая процедура распараллеливания

1. Процесс начинается с определения участков кода, в которых программист считает возможным параллелизм. Часто эта задача затруднена, поскольку программист, который хочет распараллелить код, изначально не написал рассматриваемый код. Другая возможность состоит в том, что программист новичок в области приложения. Таким образом, хотя этот первый этап процесса распараллеливания и кажется сначала простым, это может быть не так.

2. Следующим этапом является составление короткого списка разделов кода из идентифицированных, которые фактически распараллеливаются. Этот этап снова наиболее важен и сложен, поскольку требует большого количества анализов. Обычно для кодов в C /C ++ там, где используются указатели, трудно анализировать. Многие специальные методы, такие как анализ псевдонимов указателей, анализ побочных эффектов функций, необходимы, чтобы сделать вывод о том, зависит ли часть кода от любого другого кода. Если зависимости в идентифицированных участках кода больше, возможности распараллеливания уменьшаются.

3. Иногда зависимости удаляются путем изменения кода, и это следующий этап распараллеливания. Код трансформируется таким образом, что функциональные возможности и, следовательно, вывод не изменяются, а зависимость, если таковая имеется, от другого раздела кода или другой инструкции удаляется.

4. Последним этапом распараллеливания является генерация параллельного кода. Этот код всегда функционально похож на исходный последовательный код, но имеет дополнительные конструкции или разделы кода, которые при выполнении создают несколько потоков или процессов.

Техника автоматического распараллеливания

См. Также основную статью автоматическое распараллеливание.

Сканировать

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

Анализировать

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

График

В планировщик будет перечислять все задачи и их зависимости друг от друга с точки зрения времени выполнения и запуска. Планировщик создаст оптимальное расписание с точки зрения количества используемых процессоров или общего времени выполнения приложения.

Генерация кода

В планировщик сгенерирует список всех задач и подробную информацию о ядрах, на которых они будут выполняться, а также время, в течение которого они будут выполняться. Генератор кода вставит в код специальные конструкции, которые будут считываться во время выполнения планировщиком. Эти конструкции будут указывать планировщику, на каком ядре будет выполняться конкретная задача, а также время начала и окончания ...

Инструменты распараллеливания

Существует ряд инструментов автоматического распараллеливания для Fortran, C, C ++ и некоторых других языков.

ЮККА

YUCCA - это инструмент автоматического последовательного преобразования кода в параллельный, разработанный КПИТ Технологии ООО Пуна. Он принимает входные данные как исходный код C, который может иметь несколько исходных файлов и файлов заголовков. Он дает результат как преобразованный многопоточный параллельный код с использованием pthreads функции и OpenMP конструкции. Инструмент YUCCA выполняет распараллеливание на уровне задач и циклов.

Par4All

Par4All - это автоматическое распараллеливание и оптимизирующий компилятор (рабочая среда) для последовательных программ на языках C и Fortran. Цель этогокомпилятор исходного кода заключается в адаптации существующих приложений к различным аппаратным задачам, таким как многоядерные системы, высокопроизводительные компьютеры и GPU. Он создает новый исходный код и, таким образом, позволяет исходному исходному коду приложения оставаться без изменений.

Cetus

Cetus - это инфраструктура компилятора для преобразования программного обеспечения из исходного кода в исходный. Этот проект разработан Университет Пердью. Cetus написан на Ява. Он предоставляет базовую инфраструктуру для написания инструментов или компиляторов автоматического распараллеливания. Основные методы распараллеливания, применяемые в настоящее время Cetus: приватизация, распознавание редукционных переменных и индукционная переменная подмена.

Новый графический пользовательский интерфейс (GUI) был добавлен в феврале 2013 года. Ускорение вычисления и отображение графиков были добавлены в мае 2013 года. Удаленный сервер Cetus в клиент-серверная модель был добавлен в мае 2013 года, и пользователи могут при желании преобразовать код C через сервер. Это особенно полезно, когда пользователи запускают Cetus на платформе, отличной от Linux. Экспериментальный Hubzero Версия Cetus также была реализована в мае 2013 года, и пользователи также могут запускать Cetus через веб-браузер.

ПЛУТОН

PLUTO - это инструмент автоматического распараллеливания, основанный на многогранная модель. Модель полиэдра для оптимизации компилятора - это представление программ, которое позволяет удобно выполнять высокоуровневые преобразования, такие как оптимизация гнезда циклов и распараллеливание цикла. Плутотрансформирует программы на C от источника к источнику для одновременного крупномасштабного параллелизма и локализации данных. Основная структура преобразования в основном работает путем поиска аффинных преобразований для эффективного разбиения и слияния, но не ограничивается ими. OpenMP параллельный код для многоядерных процессоров может быть автоматически сгенерирован из последовательных разделов программы C.

Компилятор Polaris

Компилятор Polaris принимает программу Fortran77 в качестве входных данных, преобразует эту программу так, чтобы она эффективно работала на параллельный компьютер, и выводит эту версию программы в одном из нескольких возможных параллельных FORTRAN диалекты. Polaris выполняет свои преобразования за несколько «этапов компиляции». В дополнение ко многим общеизвестным проходам Polaris включает расширенные возможности для выполнения следующих задач: приватизация массива, Зависимость от данных тестирование Индукционная переменная распознавание, межпроцедурный анализ и анализ символьных программ.

Компилятор Intel C ++

Функция автоматического распараллеливания Компилятор Intel C ++ автоматически переводит последовательные части входной программы в семантически эквивалентные многопоточный код. Автоматическое распараллеливание определяет циклы, которые являются подходящими кандидатами для разделения работы, выполняет анализ потока данных для проверки правильности параллельного выполнения и разделяет данные для генерации многопоточного кода, как это необходимо при программировании с помощью OpenMP директивы. В OpenMP Приложения с автоматическим распараллеливанием обеспечивают повышение производительности за счет использования совместно используемой памяти в многопроцессорных системах.

Советник Intel

В Советник Intel 2017 это инструмент оптимизации векторизации и создания прототипов потоков. Он интегрирует в свой рабочий процесс несколько шагов для поиска параллельных сайтов, позволяет пользователям отмечать циклы для векторизации и многопоточности, проверять переносимые циклами зависимости и шаблоны доступа к памяти для отмеченных циклов и вставлять прагмы для векторизации и потоковой передачи.

AutoPar

Рабочий процесс инструмента AutoPar

AutoPar - это инструмент, который может автоматически вставлять прагмы OpenMP во входные последовательные коды C / C ++. Для программ ввода с существующими директивами OpenMP инструмент дважды проверит правильность, если включен правильный параметр. По сравнению с обычными инструментами AutoPar может включать знания (семантику) пользователя, чтобы открыть больше возможностей распараллеливания.

iPat / OMP

Этот инструмент предоставляет пользователям помощь, необходимую для распараллеливания OpenMP последовательной программы. Этот инструмент реализован как набор функций в редакторе Emacs. Все действия, связанные с распараллеливанием программы, такие как выбор целевой части программы, вызов вспомогательной команды и изменение программы на основе вспомогательной информации, показываемой инструментом, могут выполняться в среде редактора исходной программы.[2]

Компилятор Венского Фортрана (VFC)

Это новая система распараллеливания от источника к источнику для HPF + (оптимизированная версия HPF), которая удовлетворяет требованиям нестандартных приложений.

Компилятор SUIF

СУИФ (Стэндфордский Университет Intermediate Format) - это бесплатная инфраструктура, предназначенная для поддержки совместных исследований по оптимизации и распараллеливанию компиляторов. SUIF - это полнофункциональный компилятор, использующий в качестве языков ввода как Fortran, так и C. Распараллеленный код выводится как СПМД (Single Program Multiple Data) параллельная версия программы на C, которая может быть скомпилирована собственными компиляторами C на различных архитектурах.[3]

Компилятор Omni OpenMP

Это переводит C и Фортран программы с OpenMP pragmas в код C, подходящий для компиляции с помощью собственного компилятора, связанного с библиотекой времени выполнения Omni OpenMP. Это сделано для распараллеливания цикла.

Оптимизатор Timing-Architects

Он использует подход на основе моделирования для улучшения распределения задач и распараллеливания задач между несколькими ядрами. С помощью моделирования на основе производительности и анализа в реальном времени различные альтернативы распределения задач сравниваются друг с другом. Учитываются зависимости, а также специфические эффекты процессорной платформы. Оптимизатор ТА используется во встроенных системах.

TRACO

Он использует Iteration Space Slicing и Free Schedule Framework. Ядро основано на арифметике Пресбургера и операции транзитивного замыкания. Циклические зависимости представлены отношениями. TRACO использует калькулятор Omega, библиотеки CLOOG и ISL, а также анализатор зависимости Пети. Компилятор извлекает лучшую локальность с мелким и крупным параллелизмом для приложений C / C ++. Инструмент разработан командой Западно-Поморского технологического университета; (Белецкий, Пальковский, Климек и другие авторы) http://traco.sourceforge.net.

SequenceL

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

Программы, написанные на SequenceL, могут быть скомпилированы в многопоточный код, который выполняется параллельно, без явных указаний программиста о том, как и что распараллеливать. По состоянию на 2015 год версии компилятора SequenceL генерируют параллельный код на C ++ и OpenCL, что позволяет ему работать с большинством популярных языков программирования, включая C, C ++, C #, Fortran, Java и Python. Среда выполнения, зависящая от платформы, безопасно управляет потоками, автоматически обеспечивая параллельную производительность в соответствии с количеством доступных ядер.

OMP2MPI

OMP2MPI[4] Автоматически генерирует MPI исходный код из OpenMP. Это позволяет программе использовать архитектуры без разделяемой памяти, такие как кластер или многопроцессорная система на базе чипа (на основе NoC) (MPSoC). OMP2MPI предлагает решение, которое позволяет специалисту, желающему достичь лучших результатов, провести дальнейшую оптимизацию.

OMP2HMPP

OMP2HMPP,[5] инструмент, который автоматически переводит исходный код высокого уровня на C (OpenMP ) код в HMPP. Сгенерированная версия редко отличается от закодированной вручную HMPP версии, и обеспечит важное ускорение, около 113%, которое позже может быть улучшено с помощью ручной кодировки CUDA.

emmtrix Parallel Studio

emmtrix Parallel Studio это инструмент распараллеливания от исходного кода к исходному в сочетании с интерактивным графическим интерфейсом пользователя, разработанный emmtrix Technologies GmbH. Требуется C, MATLAB, Simulink, Scilab или же Xcos исходный код в качестве ввода и генерирует параллельный код C в качестве вывода. Он полагается на статическое расписание и API передачи сообщений для параллельной программы. Весь процесс распараллеливания контролируется и визуализируется в интерактивном графическом интерфейсе, позволяющем конечному пользователю принимать решения о распараллеливании. Он нацелен на встроенные многоядерные архитектуры в сочетании с ускорителями GPU и FPGA.

Компилятор CLAW

В Компилятор CLAW переводит Фортран программы с прагмами claw в код Fortran, подходящие для конкретной цели суперкомпьютера, дополненные прагмами OpenMP или OpenACC.

Смотрите также

Рекомендации

  1. ^ «Повышение параллелизма на многоядерных процессорах с использованием индуцированного параллелизма», Винай Г. Вайдья, ПушпРадж Агравал, Адити Атавале, Аниш Сане, Судхакар Сах и Прити Ранадив
  2. ^ «Разработка и внедрение интерактивного вспомогательного средства параллелизации для OpenMP: iPat / OMP» Макото Исихара, Хироки Хонда и Мицухиса Сато
  3. ^ «Обзор компилятора SUIF для масштабируемых параллельных машин», в материалах седьмой конференции SIAM по параллельной обработке для научных вычислений, 1993 г. Саман П. Амарасингхе, Дженнифер М. Андерсон, Моника С. Лам, Човен Ценг
  4. ^ Альберт Саа-Гаррига, Дэвид Кастельс-Руфас и Хорди Каррабина. 2015. OMP2MPI: автоматическая генерация кода MPI из OpenMP программы. В высокоэффективных энергосберегающих встроенных системах. ACM.
  5. ^ Альберт Саа-Гаррига, Дэвид Кастельс-Руфас и Хорди Каррабина. 2014. OMP2HMPP: Генерация исходного кода HMPP из программ с расширениями Pragma. В высокоэффективных энергосберегающих встроенных системах. ACM.

внешняя ссылка