Coarray Fortran (Co-array Fortran, CAF, раніше також F--) — це модель програмування, започаткована в 1990-х (Robert Numrich та John Reid) у вигляді розширення, а зараз як частина стандарту мови програмуванняFortran для забезпечення розпаралелювання та паралельного виконанняпрограмного коду згідно з парадигмою «одна програма, багато потоків даних» (SPMD) з допомогою явного синтаксису[1][2][3]. Стандарт Fortran 2008 (ISO/IEC 1539-1:2010)[4] зараз містить в собі комасиви (англ.coarrays) у версії, яка була узгоджена на засіданні ISO Fortran Committee в травні 2005 року.
Модель програмування з комасивами складається з двох нових концепцій, доданих до мови, а саме: розширення звичайного синтаксису масиву для представлення та декомпозиції даних і розширення моделі виконання для контролю та синхронізації паралельної роботи. Синтаксис комасивів в стандарті відрізняється в деталях від оригінального запропонованого проекту CAF.
Програма, що використовує CAF інтерпретується так, ніби у процесі виконання створюється багато копій програми (зображень, англ.image) і кожне зображення має свій набір об'єктів з даними та виконується асинхронно. Синтаксис комасивів додає до поняття масивів в Фортрані ще одну додаткову розмірність — так званий ковимір (англ.codimension) з допомогою задніх індексів в квадратних дужках і дозволяє маніпуляцію посиланнями на дані, котрі розподілені по різних зображеннях.
Історія
Комасиви Фортран виникли з внутрішніх технічних звітів на Cray Research на початку 1990-х років, і еволюціонували з простої моделі програмування для Cray-T3D в перше неофіційне
визначення (Numrich 1997) для мови Fortran 77, де використовувався інший синтаксис представлення комасивів. На Fortran 90 комасиви були розширені Numrich і Steidel в 1997 і уточнені Numrich і Reid у вигляді неформального розширення для Fortran 95 в 1998 році. Оригінальне розширення CAF від Cray доступно протягом тривалого часу і було реалізовано виробником компіляторів Fortran, а саме Cray (починаючи з версії 3.1). Після внесення комасивів в стандарт Fortran 2008, число реалізацій значно зросло. Перший з відкритих компіляторів був G95[5][6] для архітектур GNU Linux, що підтримував комасиви. Після цього Intel додав підтримку комасивів в своєму компіляторі ifort. GNU Fortran також забезпечує більшість можливостей комасивів в конфігурації одного і декількох зображень (на основі бібліотеки з відкритим кодом OpenCoarrays). Ще одна реалізація комасивів і пов'язаних з ними паралельних розширень Fortran 2008 доступна в компіляторі OpenUH (один з форків компілятора Open64), розробленого в Г'юстонському університеті.
Комасиви в стандарті Fortran 2008
Модель програмування з допомогою комасивів була реалізована в стандарті мови Фортран за допомогою мінімізації доповнень і розширень синтаксису та мови Фортран, щоб перетворити її на ефективну мову для паралельного програмування на основі SPMD парадигми. При цьому програма копіюється в зображення фіксоване число разів. Кількість зображень не обмежена кількістю процесорів чи інших фізичних пристроїв. Конкретні реалізації можуть вибирати кількість зображень під час компіляції, чи в процесі виконання програми. Кожне зображення виконується асинхронно з застосуванням звичайних правил мови Fortran. Послідовність виконання може відрізнятися від зображення до зображення, та може бути змінена програмістом за допомогою унікального індексу зображення, що визначає ефективний і звичний для мови Фортран механізм управління та явну синхронізацію. Між синхронізаціями компілятор може вільно використовувати майже всі свої звичайні методи оптимізації.
Альтернативна реалізація і Fortran 2015
Спільнота науковців на чолі з John Mellor-Crummey з університету Райса в Г'юстоні, США не погодились з вибором Комітету стандартизації Fortran 2008 і продовжили розвивати альтернативний варіант розширення комасивів для мови Фортран[7]. На їхню думку, вибір Комітету стандартизації для Fortran 2008 був сформований прагненням ввести якнайменше модифікацій до мови, а не створити кращий набір розширень для підтримки паралельного програмування в Фортран і тому вони не вірили, що набір розширень, узгоджених комітетом, є правильним.
В результаті справедливої критики, в технічній специфікації затвердженій й опублікованій 19 листопада 2015 року «ISO/IEC TS 18508:2015 Information technology — Additional Parallel Features in Fortran» щодо розпаралелювання за допомогою комасивів (TS18508)[8] виправлено і враховано частково критику науковців університету Райса. TS18508 значно розширює паралельну семантику Fortran 2008 (додані підмножини зображень у вигляді командиteam, колективну комунікацію, розширену синхронізацію та подіїevent для легкої односторонньої синхронізації), переробляє деякі паралельні функції та виправляє деякі інші вади попереднього стандарту.
Реалізації в компіляторах
Більшість реалізацій комасивів створено виробниками компіляторів та додаткових бібліотек на основі технології Message Passing Interface MPI. В GNU Fortran використовується бібліотека OpenCoarrays що використовує MPI, але також може працювати поверх інших шарів паралелізації та синхронізації нижчого рівня (наприклад, GASNet), призначених для підтримки розподіленого глобального адресного простору (англ.partitioned global address space, чи PGAS)[9].
ISO/IEC JTC1/SC22. International Standard ISO/IEC 1539-1:2010(E)Information technology — Programming languages — Fortran — Part 1: Base language. ISO/IEC, Geneva, 2010.
John Reid, Coarrays in the next Fortran Standard (2010) ISO/IEC JTC1/SC22/WG5 N1824
J. Reid and R.W. Numrich, Co-arrays in the next Fortran Standard, Scientific Programming 15(1), 9-26 (2007)
R.W. Numrich, A Parallel Numerical Library for Co-Array Fortran, Springer Lecture Notes in Computer Science 3911, 960—969,(2005)
R.W. Numrich, Parallel numerical algorithms based on tensor notation and Co-Array Fortran syntax, Parallel Computing 31, 588—607 (2005)
R.W. Numrich and J.K. Reid, Co-Array Fortran for Parallel Programming, ACM Fortran Forum 17(2):1-31 (1998)
R.W. Numrich et al., Definition of the F−− Extension to Fortran 90, Lectures on Computer Science Series, Number 1366, p.292-306 (1998)
R.W. Numrich, J. Reid and K. Kim, Writing a Multigrid Solver Using Co-Array Fortran, Springer Lecture Notes in Computer Science 1541, 390—399 (1998)