Coarray Fortran - Coarray Fortran

Coarray Fortran
Paradigma multi-paradigma : paralelní , předávání zpráv , imperativní ( procedurální , objektově orientovaný ), strukturovaný
Navrhl Robert Numrich a John Reid
Vývojář PL22.3 Fortranský výbor
Stabilní uvolnění
Fortran 2008 (ISO / IEC 1539-1: 2010)
Psací disciplína silný , statický
OS Cross-platform
Hlavní implementace
Cray, g95 , GNU Fortran , kompilátor Intel Fortran , rýže (CAF 2.0) , OpenUH
Ovlivněno
Fortran

Coarray Fortran ( CAF ), dříve známý jako F-- , začal jako rozšíření Fortran 95/2003 pro paralelní zpracování vytvořené Robertem Numrichem a Johnem Reidem v 90. letech. Standard Fortran 2008 (ISO / IEC 1539-1: 2010) nyní zahrnuje pole (hláskovaná bez pomlček ), jak bylo rozhodnuto na zasedání výboru Fortran ISO v květnu 2005; syntaxe ve standardu Fortran 2008 se mírně liší od původního návrhu CAF.

Kavárně Program je interpretován jako kdyby to byly opakovány mnohokrát a všechny kopie byly provedeny asynchronně. Každá kopie má svou vlastní sadu datových objektů a nazývá se obrázek . Pole Syntaxe Fortran je rozšířen o další vlečných indexy v hranatých závorkách se stručnou reprezentaci odkazy na údaje, které se šíří přes obrazy.

Rozšíření CAF bylo implementováno v některých kompilátorech Fortran , například v Cray (od vydání 3.1). Od zařazení čipů do standardu Fortran 2008 počet implementací roste. První kompilátor s otevřeným zdrojovým kódem, který implementoval coarrays, jak je uvedeno ve standardu Fortran 2008 pro architektury Linuxu, je G95 . V současné době GNU Fortran poskytuje široké pokrytí funkcí Fortran coarray v konfiguraci jednoho a více obrazů (druhý založený na knihovně OpenCoarrays). Další implementace polí a souvisejících paralelních rozšíření z Fortranu 2008 je k dispozici v kompilátoru OpenUH (pobočka Open64 ) vyvinutém na univerzitě v Houstonu .

Implementace v překladačích

CAF se kvůli přenositelnosti často implementuje nad knihovnu MPI ( Message Passing Interface ). Některé implementace, jako jsou ty, které jsou k dispozici v kompilátorech GNU Fortran a OpenUH, mohou běžet na jiných nízkoúrovňových vrstvách (například GASNet) určených pro podporu jazyků děleného globálního prostoru adres .

Příklady

Níže je uveden jednoduchý příklad. CAF se používá v CGPACK, open source balíčku pro simulaci polykrystalických materiálů vyvinutého na univerzitě v Bristolu .

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

Výše uvedený program se špatně mění, protože smyčka, která distribuuje informace, se provádí postupně. Psaní škálovatelných programů často vyžaduje sofistikované porozumění paralelním algoritmům, podrobné znalosti základních charakteristik sítě a speciální vyladění charakteristik aplikace, jako je velikost datových přenosů. U většiny vývojářů aplikací se nechává rozhodování kompilátoru nebo běhové knihovny o nejlepším algoritmu ukázat robustnější a výkonnější. Fortran 2018 nabídne podprogramy kolektivní komunikace, které týmům kompilátorů a runtime knihoven umožní zapouzdřit efektivní paralelní algoritmy pro kolektivní komunikaci a distribuovaný výpočet v sadě kolektivních podprogramů. Tyto podprogramy a další nové funkce paralelního programování jsou shrnuty v technické specifikaci, kterou Výbor pro standardy Fortran hlasoval pro začlenění do Fortranu 2018. Umožňují uživateli napsat efektivnější verzi výše uvedeného algoritmu

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

kde nedostatek explicitní synchronizace nabízí potenciál pro vyšší výkon kvůli menší koordinaci mezi obrázky. TS 18508 dále zaručuje, že „K přenosu z obrázku nemůže dojít, dokud není na tomto obrázku vyvolán kolektivní podprogram.“ To znamená určitou částečnou synchronizaci uvnitř co_broadcast, ale může být výkonnější než „synchronizovat vše“ v předchozím příkladu. TS 18508 také obsahuje několik dalších nových funkcí, které řeší problémy, na které se zaměřuje úsilí CAF 2.0 popsané níže. Mezi příklady patří týmy obrázků a událostí.

Alternativní perspektiva

V roce 2011 sledovala Rice University alternativní vizi rozšíření coarray pro jazyk Fortran. Jejich perspektiva spočívá v tom, že možnosti designu standardní komise Fortran 2008 byly formovány spíše touhou zavést co nejméně úprav jazyka, než sestavit nejlepší sadu rozšíření pro podporu paralelního programování . Podle jejich názoru původní design Numricha i Reida i rozšíření coarray navržené pro Fortran 2008 trpí následujícími nedostatky:

  • Neexistuje žádná podpora pro podmnožiny procesorů ; například pole musí být přidělena všem obrázkům.
  • Rozšíření coarray postrádají jakýkoli pojem globálních ukazatelů, které jsou nezbytné pro vytváření a manipulaci jakéhokoli druhu propojené datové struktury.
  • Spoléhání se na pojmenované kritické sekce pro vzájemné vyloučení brání škálovatelnému paralelismu přidružením vzájemného vyloučení k regionům kódu, nikoli k datovým objektům.
  • Prohlášení synchronizačních obrázků z Fortranu 2008 neposkytuje bezpečný prostor pro synchronizaci. Výsledkem je, že synchronizační operace v uživatelském kódu, které čekají na provedení volání knihovny, mohou interferovat se synchronizací při volání knihovny.
  • Při manipulaci s daty na vzdálených obrázcích neexistují žádné mechanismy, kterými se lze vyhnout nebo tolerovat latenci.
  • Kolektivní komunikace není podporována.

K řešení těchto nedostatků vyvíjí skupina Rice University redesign programovacího modelu Coarray Fortran. Riceův nový design pro Coarray Fortran, kterému říkají Coarray Fortran 2.0, je expresivní sadou rozšíření Fortran založených na coarray navržených tak, aby poskytovaly produktivní model paralelního programování. Ve srovnání s Fortranem 2008 obsahují nová jazyková rozšíření založené na coarray Rice některé další funkce:

  • podmnožiny procesů známé jako týmy, které podporují coarrays, kolektivní komunikaci a relativní indexování obrazů procesů pro operace párů,
  • topologie, které rozšiřují týmy o logickou komunikační strukturu,
  • dynamická alokace / deallocation coarrays a dalších sdílených dat,
  • týmová alokace coarray a deallocation,
  • globální ukazatele na podporu dynamických datových struktur,
  • - podpora skrytí a vyhýbání se latenci a -
    • asynchronní kopie,
    • asynchronní kolektivní operace a
    • funkční doprava.
  • vylepšená podpora synchronizace pro jemnou kontrolu nad prováděním programu.
    • bezpečná a škálovatelná podpora pro vzájemné vyloučení, včetně zámků a sad zámků,
    • události, které poskytují bezpečný prostor pro synchronizaci mezi dvěma body,
    • cofence, která vynutí lokální dokončení asynchronních operací,
    • finish, bariérový konstrukt SPMD, který nutí dokončení asynchronních operací napříč týmem,

Viz také

Reference

Všeobecné