stringtranslate.com

Coarray Фортран

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 Fortran. Новый проект Райса для Coarray Fortran, который они называют Coarray Fortran 2.0, представляет собой выразительный набор расширений Fortran на основе coarray, разработанный для предоставления продуктивной модели параллельного программирования. По сравнению с Fortran 2008, новые языковые расширения Райса на основе coarray включают некоторые дополнительные функции:

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

Ссылки

  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".

Общий