Coarray Фортран

Расширение параллельного программирования Fortran
Coarray Фортран
Парадигмамультипарадигмальный : параллельный , передача сообщений , императивный ( процедурный , объектно-ориентированный ), структурированный
РазработаноРоберт Нумрих и Джон Рид
РазработчикPL22.3 Комитет Фортрана
Стабильный релиз
Фортран 2008 (ИСО/МЭК 1539-1:2010)
Дисциплина набора текстасильный , статичный
ОСКроссплатформенный
Основные внедрения
Cray, g95 , GNU Fortran , компилятор Intel Fortran , Rice CAF 2.0, OpenUH, компилятор NAG Fortran
Под влиянием
Фортран

Coarray Fortran ( CAF ), ранее известный как F-- , начинался как расширение Fortran 95/2003 для параллельной обработки, созданное Робертом Нумрихом и Джоном Ридом в 1990-х годах. Стандарт Fortran 2008 (ISO/IEC 1539-1:2010) теперь включает coarrays (пишется без дефиса), как было решено на заседании Комитета ISO Fortran в мае 2005 года; синтаксис в стандарте Fortran 2008 немного отличается от первоначального предложения CAF.

Программа CAF интерпретируется так, как будто она была реплицирована несколько раз, и все копии были выполнены асинхронно. Каждая копия имеет свой собственный набор объектов данных и называется образом . Синтаксис массива Fortran расширен дополнительными конечными индексами в квадратных скобках, чтобы обеспечить краткое представление ссылок на данные, которые распределены по изображениям.

Расширение CAF было реализовано в некоторых компиляторах Fortran, таких как компиляторы Cray (начиная с версии 3.1). С момента включения coarrays в стандарт Fortran 2008 число реализаций растет. Первым компилятором с открытым исходным кодом , который реализовал coarrays, как указано в стандарте Fortran 2008 для архитектур Linux, является G95 . В настоящее время GNU Fortran предоставляет широкий охват возможностей coarray Fortran в одно- и многообразной конфигурации (последняя основана на библиотеке OpenCoarrays). Другая реализация coarrays и связанных параллельных расширений из Fortran 2008 доступна в компиляторе OpenUH (ветвь Open64 ), разработанном в Университете Хьюстона .

Реализация в компиляторах

CAF часто реализуется поверх библиотеки Message Passing Interface (MPI) для переносимости. Некоторые реализации, такие как доступные в компиляторах GNU Fortran и OpenUH, могут работать поверх других низкоуровневых слоев (например, GASNet), разработанных для поддержки языков с разделенным глобальным адресным пространством .

Примеры

Ниже приведен простой пример. CAF используется в CGPACK, пакете с открытым исходным кодом для моделирования поликристаллических материалов, разработанном в Университете Бристоля . [1]

program Hello_World implicit none integer :: i ! Локальная переменная character ( len = 20 ) :: name [ * ] ! скалярный coarray, одно "name" для каждого изображения. ! Примечание: "name" — это локальная переменная, в то время как "name[<index>]" обращается к переменной ! в определенном изображении; "name[this_image()]" — то же самое, что и "name".            ! Взаимодействуйте с пользователем на изображении 1; выполнение для всех остальных пропускается. if ( this_image () == 1 ) then  write ( * , '(a)' , advance = 'no' ) 'Введите свое имя: ' read ( * , '(a)' ) name         ! Распространить информацию на другие изображения do i = 2 , num_images () name [ i ] = name end do  end if         синхронизировать все ! Барьер, чтобы убедиться, что данные получены.  ! Ввод-вывод из всех изображений, выполняется в любом порядке, но каждая записанная запись остается нетронутой. write ( * , '(3a,i0)' ) 'Hello ' , trim ( name ), ' from image ' , this_image () end program Hello_world   

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

программа Hello_World неявный none символ ( len = 20 ) :: name [ * ] ! скалярный комассив, одно "name" для каждого изображения. ! Примечание: "name" является локальной переменной, в то время как "name[<index>]" обращается к переменной ! в определенном изображении; "name[this_image()]" то же самое, что и "name".        ! Взаимодействовать с пользователем на изображении 1; выполнение для всех остальных пропускается. if ( this_image () == 1 ) then  write ( * , '(a)' , advance = 'no' ) 'Введите свое имя: ' read ( * , '(a)' ) name end if ! Распространить информацию на все изображения call co_broadcast ( name , source_image = 1 )            ! Ввод-вывод из всех изображений, выполняется в любом порядке, но каждая записанная запись остается нетронутой. write ( * , '(3a,i0)' ) 'Hello ' , trim ( name ), ' from image ' , this_image () end program Hello_world   

где отсутствие явной синхронизации дает потенциал для более высокой производительности из-за меньшей координации между изображениями. Кроме того, TS 18508 гарантирует, что «передача из изображения не может произойти до того, как коллективная подпрограмма будет вызвана для этого изображения». Это подразумевает некоторую частичную синхронизацию внутри co_broadcast, но может быть более производительной, чем «sync all» в предыдущем примере. TS 18508 также включает несколько других новых функций, которые решают проблемы, на которые нацелены усилия CAF 2.0, описанные ниже. Примерами являются группы изображений и событий.

Альтернативная точка зрения

В 2011 году Университет Райса предложил альтернативное видение расширений coarray для языка Fortran. [3] По их мнению, выбор дизайна комитета по стандарту Fortran 2008 был обусловлен скорее желанием внести как можно меньше изменений в язык, чем собрать лучший набор расширений для поддержки параллельного программирования . По их мнению, как оригинальный дизайн Нумриха и Рида, так и расширения coarray, предложенные для Fortran 2008, страдают от следующих недостатков:

  • Подсистемы процессоров не поддерживаются ; например, комассивы должны быть распределены по всем изображениям.
  • Расширения coarray не имеют понятия о глобальных указателях, которые необходимы для создания и управления любыми типами связанных структур данных.
  • Использование именованных критических секций для взаимного исключения затрудняет масштабируемый параллелизм, связывая взаимное исключение с областями кода, а не с объектами данных.
  • Оператор sync images в Fortran 2008 не обеспечивает безопасного пространства синхронизации. В результате операции синхронизации в коде пользователя, ожидающие выполнения при вызове библиотеки, могут помешать синхронизации в вызове библиотеки.
  • Не существует механизмов, позволяющих избежать или допустить задержку при манипулировании данными на удаленных изображениях.
  • Коллективное общение не поддерживается.

Для устранения этих недостатков группа из Университета Райса разрабатывает перепроектирование с чистого листа модели программирования Coarray Fortran. Новый проект Райса для Coarray Fortran, который они называют Coarray Fortran 2.0, представляет собой выразительный набор расширений Fortran на основе coarray, разработанный для предоставления продуктивной модели параллельного программирования. По сравнению с Fortran 2008, новые языковые расширения Райса на основе coarray включают некоторые дополнительные функции:

  • подмножества процессов, известные как команды, которые поддерживают комассивы, коллективную коммуникацию и относительную индексацию образов процессов для парных операций,
  • топологии, которые дополняют команды логической структурой коммуникации,
  • динамическое выделение/освобождение комассивов и других общих данных,
  • выделение и освобождение массива на основе команды,
  • глобальные указатели для поддержки динамических структур данных,
  • поддержка сокрытия и избегания задержек, а также
    • асинхронные копии,
    • асинхронные коллективные операции и
    • функция доставки.
  • улучшенная поддержка синхронизации для точного контроля над выполнением программы.
    • безопасная и масштабируемая поддержка взаимного исключения, включая блокировки и наборы блокировок,
    • события, которые обеспечивают безопасное пространство для синхронизации точка-точка,
    • cofence, который принудительно завершает асинхронные операции локально,
    • finish, барьероподобная конструкция SPMD, которая заставляет завершать асинхронные операции в команде,

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

Ссылки

  1. ^ А. Штеренлихт, Библиотека Fortran coarray для моделирования микроструктуры 3D клеточных автоматов. Архивировано 04.03.2016 в Wayback Machine , (2013) в Трудах 7-й конференции PGAS, под ред. М. Вейланда, А. Джексона, Н. Джонсона, опубликовано Эдинбургским университетом, ISBN  978-0-9926615-0-2
  2. ^ TS 18508 Дополнительные параллельные возможности в Fortran
  3. ^ "CoArray Fortran 2.0".

Общий

  • Комитет ISO Fortran Архивировано 23.04.2011 на Wayback Machine
  • Комитет ANSI/INCITS по Фортрану
  • Обучающие видео по CAF в стандарте Fortran от Джона Рида (см. Приложение B)
  • Coarray в GNU Fortran
  • CoarrayLib в GNU Fortran
  • Библиотека OpenCoarrays
  • Компилятор NAG Fortran
Retrieved from "https://en.wikipedia.org/w/index.php?title=Coarray_Fortran&oldid=1189925735"