Coarray Fortran ( CAF ), ранее известный как F-- , начался как расширение Fortran 95/2003 для параллельной обработки, созданное Робертом Нумрихом и Джоном Ридом в 1990-х годах. Стандарт Fortran 2008 (ISO / IEC 1539-1: 2010) теперь включает грубые массивы (пишется без дефиса), как было решено на заседании комитета ISO Fortran в мае 2005 года; синтаксис стандарта Fortran 2008 немного отличается от исходного предложения CAF.
Парадигма | мультипарадигма : параллельная , передача сообщений , императивная ( процедурная , объектно-ориентированная ), структурированная |
---|---|
Разработано | Роберт Нумрих и Джон Рид |
Разработчик | PL22.3 Комитет Fortran |
Стабильный выпуск | Фортран 2008 (ISO / IEC 1539-1: 2010) |
Печатная дисциплина | сильный , статичный |
Операционные системы | Кроссплатформенность |
Основные реализации | |
Cray, g95 , GNU Fortran , компилятор Intel Fortran , Rice (CAF 2.0) , OpenUH , компилятор NAG Fortran | |
Под влиянием | |
Фортран |
CAF Программа интерпретируется как если бы это были воспроизведены несколько раз , и все копии были выполнены асинхронно. Каждая копия имеет свой собственный набор объектов данных и называется изображением . Массива Синтаксис Fortran расширена с дополнительными хвостовыми индексами в квадратных скобках , чтобы обеспечить краткое представление ссылок на данные , которые распределены по изображениям.
Расширение CAF было реализовано в некоторых компиляторах Fortran, например в Cray (начиная с версии 3.1). С момента включения coarrays в стандарт Fortran 2008 количество реализаций растет. G95 - первый компилятор с открытым исходным кодом, который реализовал грубые массивы, как указано в стандарте Fortran 2008 для архитектур Linux . В настоящее время GNU Fortran обеспечивает широкий охват возможностей Fortran coarray в конфигурации с одним и несколькими образами (последняя основана на библиотеке OpenCoarrays). Другая реализация coarrays и связанных параллельных расширений из Fortran 2008 доступна в компиляторе OpenUH (ветвь Open64 ), разработанном в Хьюстонском университете .
Реализация в компиляторах
CAF часто реализуется поверх библиотеки интерфейса передачи сообщений (MPI) для обеспечения переносимости. Некоторые реализации, например, доступные в компиляторах GNU Fortran и OpenUH, могут работать поверх других низкоуровневых уровней (например, GASNet), предназначенных для поддержки языков разделенного глобального адресного пространства .
Примеры
Ниже приводится простой пример. CAF используется в CGPACK, пакете с открытым исходным кодом для моделирования поликристаллических материалов, разработанном в Бристольском университете . [1]
программа Hello_World неявно none integer :: i ! Локальная переменная характер ( LEN = 20 ) :: имя [ * ] ! скалярный массив, одно «имя» для каждого изображения. ! Примечание: «name» - это локальная переменная, а «name []» обращается к ! переменная в конкретном изображении; «name [this_image ()]» - это то же самое, что «name». ! Взаимодействуйте с пользователем на изображении 1; казнь для всех остальных проходят мимо. if ( this_image () == 1 ) then write ( * , '(a)' , advance = 'no' ) 'Введите свое имя:' прочтите ( * , '(a)' ) имя ! Распространение информации на другие изображения do i = 2 , num_images () name [ i ] = name end do end if синхронизировать все ! Барьер, чтобы убедиться, что данные прибыли. ! Ввод-вывод из всех образов выполняется в любом порядке, но каждая записанная запись не повреждена. write ( * , '(3a, i0)' ) 'Hello' , trim ( name ), 'from image' , this_image () конец программы Hello_world
Приведенная выше программа плохо масштабируется, потому что цикл, распределяющий информацию, выполняется последовательно. Написание масштабируемых программ часто требует сложного понимания параллельных алгоритмов, детального знания основных характеристик сети и специальной настройки таких характеристик приложения, как размер передаваемых данных. Для большинства разработчиков приложений, позволяя компилятору или исполняющей библиотеке выбирать лучший алгоритм, оказывается более надежным и высокопроизводительным. Fortran 2018 предложит подпрограммы коллективного взаимодействия, которые позволят командам компиляторов и библиотек времени выполнения инкапсулировать эффективные параллельные алгоритмы для коллективного взаимодействия и распределенных вычислений в набор коллективных подпрограмм. Эти подпрограммы и другие новые функции параллельного программирования кратко изложены в технической спецификации [2], которую комитет по стандартам Fortran проголосовал за включение в Fortran 2018. Они позволяют пользователю написать более эффективную версию вышеуказанного алгоритма.
программа Hello_World неявный символ none ( len = 20 ) :: name [ * ] ! скалярный массив, одно «имя» для каждого изображения. ! Примечание: «name» - это локальная переменная, а «name []» обращается к ! переменная в конкретном изображении; «name [this_image ()]» - это то же самое, что «name». ! Взаимодействуйте с пользователем на изображении 1; казнь для всех остальных проходят мимо. if ( this_image () == 1 ) then write ( * , '(a)' , advance = 'no' ) 'Введите свое имя:' read ( * , '(a)' ) name end if ! Распространение информации на все изображения вызов co_broadcast ( name , source_image = 1 ) ! Ввод-вывод из всех образов выполняется в любом порядке, но каждая записанная запись не повреждена. write ( * , '(3a, i0)' ) 'Hello' , trim ( name ), 'from image' , this_image () конец программы Hello_world
где отсутствие явной синхронизации предлагает потенциал для более высокой производительности из-за меньшей координации между изображениями. Кроме того, TS 18508 гарантирует, что «передача изображения не может произойти до тех пор, пока для этого изображения не будет вызвана коллективная подпрограмма». Это подразумевает некоторую частичную синхронизацию внутри co_broadcast, но может быть более производительной, чем «синхронизировать все» в предыдущем примере. TS 18508 также включает несколько других новых функций, направленных на устранение проблем, связанных с усилиями CAF 2.0, описанными ниже. Примеры включают команды изображений и событий.
Альтернативная перспектива
В 2011 году Университет Райса разработал альтернативное видение грубых расширений для языка Фортран. [3] Их точка зрения такова, что решения комитета по разработке стандартов Fortran 2008 были сформированы больше из желания внести как можно меньше изменений в язык, чем собрать лучший набор расширений для поддержки параллельного программирования . По их мнению, как исходный дизайн Нумрича и Рейда, так и расширения coarray, предложенные для Fortran 2008, страдают следующими недостатками:
- Подмножества процессоров не поддерживаются ; например, грубые лучи должны быть распределены по всем изображениям.
- В расширениях coarray отсутствует какое-либо понятие глобальных указателей, которые необходимы для создания любых связанных структур данных и управления ими.
- Использование именованных критических секций для взаимного исключения препятствует масштабируемому параллелизму, связывая взаимное исключение с областями кода, а не с объектами данных.
- Оператор синхронизации изображений Fortran 2008 не обеспечивает безопасного пространства для синхронизации. В результате операции синхронизации в коде пользователя, ожидающие выполнения при вызове библиотеки, могут мешать синхронизации в вызове библиотеки.
- Не существует механизмов, позволяющих избежать или допустить задержку при работе с данными на удаленных образах.
- Нет поддержки коллективного общения.
Чтобы устранить эти недостатки, группа Университета Райса разрабатывает с чистого листа редизайн модели программирования Coarray Fortran. Новый дизайн Райса для Coarray Fortran, который они называют Coarray Fortran 2.0, представляет собой выразительный набор расширений на основе Coarray для Fortran, разработанных для обеспечения продуктивной модели параллельного программирования. По сравнению с Fortran 2008, новые языковые расширения на основе Coarray включают в себя некоторые дополнительные функции:
- подмножества процессов, известные как группы, которые поддерживают грубые, коллективные коммуникации и относительную индексацию образов процессов для парных операций,
- топологии, которые дополняют команды логической коммуникационной структурой,
- динамическое распределение / освобождение coarrays и других разделяемых данных,
- командное выделение и освобождение массивов,
- глобальные указатели для поддержки динамических структур данных,
- поддержка сокрытия и предотвращения задержки, а также
- асинхронные копии,
- асинхронные коллективные операции и
- функция доставка.
- расширенная поддержка синхронизации для точного управления выполнением программы.
- безопасная и масштабируемая поддержка взаимного исключения, включая замки и наборы замков,
- события, которые обеспечивают безопасное пространство для двухточечной синхронизации,
- cofence, который заставляет локальное завершение асинхронных операций,
- finish, похожая на барьер конструкция SPMD, которая принудительно завершает асинхронные операции в команде,
Смотрите также
- Программирование массива
- Часовня
- Крепость
- Параллельные вычисления
- Разделенное глобальное адресное пространство
- Унифицированный параллельный C
- X10
Рекомендации
- ^ А. Штеренлихт, Библиотека Fortran coarray для моделирования микроструктуры трехмерных клеточных автоматов. Архивировано 4 марта 2016 г. в Wayback Machine , (2013) In Proc. 7-я конференция PGAS, ред. М. Вейланд, А. Джексон, Н. Джонсон, изданный Эдинбургским университетом, ISBN 978-0-9926615-0-2
- ^ TS 18508 Дополнительные параллельные функции в Fortran
- ^ «CoArray Fortran 2.0» .
Общий
- Домашняя страница Co-Array Fortran (больше не работает)
- Комитет ISO Fortran
- Комитет ANSI / INCITS Fortran
- Обучающие видеоролики по CAF в стандарте Fortran от Джона Рида (см. Приложение B)
- Coarray в GNU Fortran
- CoarrayLib в GNU Fortran
- Библиотека OpenCoarrays
- Компилятор NAG Fortran