Coarray Fortran - Coarray Fortran

Coarray Fortran
Paradigmă multi-paradigmă : paralelă , de transmitere a mesajelor , imperativă ( procedurală , orientată spre obiect ), structurată
Proiectat de Robert Numrich și John Reid
Dezvoltator PL22.3 Comitetul Fortran
Versiune stabila
Fortran 2008 (ISO / IEC 1539-1: 2010)
Disciplinarea tipografiei puternic , static
OS Cross-platform
Implementări majore
Cray, g95 , GNU Fortran , Compilator Intel Fortran , Orez (CAF 2.0) , OpenUH
Influențată de
Fortran

Coarray Fortran ( CAF ), cunoscută anterior ca F-- , a început ca o extensie a Fortran 95/2003 pentru procesarea paralelă creată de Robert Numrich și John Reid în anii 90. Standardul Fortran 2008 (ISO / IEC 1539-1: 2010) include acum coarrays (ortografiate fără cratime), așa cum a fost decis la ședința din mai 2005 a Comitetului ISO Fortran; sintaxa din standardul Fortran 2008 este ușor diferită de propunerea CAF inițială.

Un program CAF este interpretat ca și cum ar fi fost reprodus de mai multe ori și toate copiile au fost executate asincron. Fiecare copie are propriul set de obiecte de date și este denumită imagine . Matrice Sintaxa Fortran este extins cu subscript trailing suplimentare în paranteze pătrate pentru a oferi o reprezentare concisă a referiri la date care sunt răspândite în imagini.

Extensia CAF a fost implementată în unele compilatoare Fortran, cum ar fi cele de la Cray (de la lansarea 3.1). De la includerea coarourilor în standardul Fortran 2008, numărul implementărilor este în creștere. Primul compilator open-source care a implementat coarrays specificat în standardul Fortran 2008 pentru arhitecturi Linux este G95 . În prezent, GNU Fortran oferă o acoperire largă a funcțiilor coarray ale lui Fortran în configurația cu o singură imagine și cu mai multe imagini (aceasta din urmă bazată pe biblioteca OpenCoarrays). O altă implementare de coarrays și extensii paralele aferente din Fortran 2008 este disponibilă în compilatorul OpenUH (o filială a Open64 ) dezvoltată la Universitatea din Houston .

Implementarea în compilatoare

CAF este adesea implementat în partea de sus a unei biblioteci MPI ( Message Passing Interface ) pentru portabilitate. Unele implementări, cum ar fi cele disponibile în compilatoarele GNU Fortran și OpenUH, pot fi rulate pe deasupra altor straturi de nivel scăzut (de exemplu, GASNet), concepute pentru a sprijini limbaje spațiale de adrese globale partiționate .

Exemple

Un exemplu simplu este dat mai jos. CAF este utilizat în CGPACK, un pachet open source pentru simularea materialelor policristaline dezvoltate la Universitatea din Bristol .

program Hello_World
  implicit none
  integer :: i  ! Local variable
  character(len=20) :: name[*] ! scalar coarray, one "name" for each image.
  ! Note: "name" is the local variable while "name[<index>]" accesses the
  ! variable in a specific image; "name[this_image()]" is the same as "name".

  ! Interact with the user on Image 1; execution for all others pass by.
  if (this_image() == 1) then   
    write(*,'(a)',advance='no') 'Enter your name: '
    read(*,'(a)') name

    ! Distribute information to other images
    do i = 2, num_images()
      name[i] = name
    end do
  end if

  sync all ! Barrier to make sure the data have arrived.

  ! I/O from all images, executing in any order, but each record written is intact. 
  write(*,'(3a,i0)') 'Hello ',trim(name),' from image ', this_image()
end program Hello_world

Programul de mai sus se scalează prost deoarece bucla care distribuie informația se execută secvențial. Scrierea programelor scalabile necesită adesea o înțelegere sofisticată a algoritmilor paraleli, o cunoaștere detaliată a caracteristicilor rețelei de bază și o ajustare specială pentru caracteristicile aplicației, cum ar fi dimensiunea transferurilor de date. Pentru majoritatea dezvoltatorilor de aplicații, lăsați compilatorul sau biblioteca de rulare să decidă cel mai bun algoritm se dovedește mai robust și performant. Fortran 2018 va oferi subrutine de comunicare colectivă care împuternesc echipele de compilare și bibliotecă de rulare pentru a încapsula algoritmi eficienți paralel pentru comunicare colectivă și calcul distribuit într-un set de subrutine colective. Aceste subrutine și alte noi funcții de programare paralele sunt rezumate într-o specificație tehnică pe care comitetul de standarde Fortran a votat să o încorporeze în Fortran 2018. Acestea permit utilizatorului să scrie o versiune mai eficientă a algoritmului de mai sus.

program Hello_World
  implicit none
  character(len=20) :: name[*] ! scalar coarray, one "name" for each image.
  ! Note: "name" is the local variable while "name[<index>]" accesses the
  ! variable in a specific image; "name[this_image()]" is the same as "name".

  ! Interact with the user on Image 1; execution for all others pass by.
  if (this_image() == 1) then   
    write(*,'(a)',advance='no') 'Enter your name: '
    read(*,'(a)') name
  end if
  ! Distribute information to all images
  call co_broadcast(name,source_image=1)

  ! I/O from all images, executing in any order, but each record written is intact. 
  write(*,'(3a,i0)') 'Hello ',trim(name),' from image ', this_image()
end program Hello_world

unde lipsa sincronizării explicite oferă potențialul unei performanțe mai mari datorită unei mai mici coordonări între imagini. Mai mult, TS 18508 garantează că "un transfer dintr-o imagine nu poate avea loc înainte de invocarea subrutinelor colective pe această imagine." Aceasta implică o sincronizare parțială în cadrul co_broadcast, dar ar putea fi mai performantă decât „sincronizarea tuturor” din exemplul anterior. TS 18508 încorporează, de asemenea, alte câteva funcții noi care abordează problemele vizate de efortul CAF 2.0 descris mai jos. Exemple includ echipe de imagini și evenimente.

O perspectivă alternativă

În 2011, Universitatea Rice a urmărit o viziune alternativă a extensiilor coarray pentru limba Fortran. Perspectiva lor este că alegerile de proiectare ale comitetului standard Fortran 2008 au fost modelate mai mult din dorința de a introduce cât mai puține modificări în limbaj posibil decât de a reuni cel mai bun set de extensii pentru a sprijini programarea paralelă . În opinia lor, atât designul original al lui Numrich, cât și Reid, precum și extensiile coarray propuse pentru Fortran 2008 suferă de următoarele deficiențe:

  • Nu există suport pentru subseturile procesorului ; de exemplu, coarrays trebuie să fie alocate peste toate imaginile.
  • Extensiile coarray nu au nicio noțiune de indicatori globali, care sunt esențiali pentru crearea și manipularea oricărui tip de structură de date legată.
  • Dependența de secțiunile critice numite pentru excluderea reciprocă împiedică paralelismul scalabil prin asocierea excluderii reciproce cu regiunile de cod, mai degrabă decât cu obiectele de date.
  • Declarația de sincronizare a Fortran 2008 nu oferă un spațiu de sincronizare sigur. Drept urmare, operațiunile de sincronizare în codul utilizatorului care sunt în așteptare la efectuarea unui apel de bibliotecă pot interfera cu sincronizarea în apelul de bibliotecă.
  • Nu există mecanisme care să evite sau să tolereze latența atunci când manipulați datele de pe imagini la distanță.
  • Nu există suport pentru comunicarea colectivă.

Pentru a rezolva aceste neajunsuri, grupul Rice University dezvoltă o reproiectare cu ardezie a modelului de programare Coarray Fortran. Noul design al lui Rice pentru Coarray Fortran, pe care îl numesc Coarray Fortran 2.0, este un set expresiv de extensii bazate pe coarray către Fortran, concepute pentru a oferi un model productiv de programare paralel. În comparație cu Fortran 2008, noile extensii de limbaj bazate pe coarray includ câteva caracteristici suplimentare:

  • subseturi de procese cunoscute sub numele de echipe, care acceptă coarrays, comunicare colectivă și indexare relativă a imaginilor de proces pentru operațiuni înțelepte,
  • topologii, care măresc echipele cu o structură de comunicare logică,
  • alocarea / redistribuirea dinamică a coarourilor și a altor date partajate,
  • alocarea și alocarea coarray bazată pe echipă,
  • indicatoare globale în sprijinul structurilor dinamice de date,
  • sprijin pentru ascunderea și evitarea latenței și
    • copii asincrone,
    • operațiuni colective asincrone și
    • transport de funcții.
  • suport sporit pentru sincronizare pentru controlul cerealelor fine asupra execuției programului.
    • suport sigur și scalabil pentru excluderea reciprocă, inclusiv încuietori și seturi de blocare,
    • evenimente, care oferă un spațiu sigur pentru sincronizarea punct la punct,
    • cofence, care forțează finalizarea locală a operațiunilor asincrone,
    • finisaj, un construct SPMD asemănător unei bariere, care forțează finalizarea operațiunilor asincrone în cadrul unei echipe,

Vezi si

Referințe

General