Appendix 15. Co-Array Fortran (Fält-Fortran)

Co-Array Fortran ingår i Fortran 2010, men inte på exakt det sätt som beskriv nedan.

Co-Array Fortran, CAF, eller möjligen Fält-Fortran på svenska, är en liten utvidgning av Fortran 95 för parallell bearbetning. Ett CAF program tolkas som om det vore upprepat ett antal gånger och som om alla kopiorna exekverades asynkront. Varje kopia har sina egna data och kallas på engelska en "image", jag försöker med "bild" på svenska. Den fält-syntax som finns i Fortran 95 har kompletterats med extra index inom kvadratiska parenteser [ ] för att ge en klar specifikation av om data tillhörigt en annan bild avses. Avsikten är naturligtvis att varje bild exekveras på en egen processor, men genom att kalla det för bild och ej processor behöver antalet ej nödvändigtvis stämma överens.

Referenser utan raka parenteser avser lokala data (aktuell bild), så kod som bara avser aktuell processor blir enkel. Bara där det finns raka parenteser, eller där det finns ett proceduranrop till en procedur som innehåller raka parenteser, är kommunikation mellan bilder (processorer) aktuell.

Det finns inbyggda procedurer för att synkronisera bilder, ge antalet bilder, och ge index för aktuell bild. Utvidgningen är enkel, kraftfull och flexibel. För en fullständig beskrivning hänvisas till R. W. Numrich och J. K Reid (1998), Co-Array Fortran for parallel programming. Finns som Report RAL-TR-1998-060 och i ACM Fortran Forum, Volym 17, Nummer 2, augusti 1998, sid. 1-31.

Cray har ett subset av Co-Array Fortran i sitt Fortran-system för T3E, vilket användes med

	f90 -Z program.f90
Ett enkelt exempel är analogt med den summation av de första naturliga talens inverterade kvadrater som behandlades i Appendix A7, för DEC respektive Sun. Programmet återges nedan, där dock programmet wtime.f90 för tidsmätning saknas. Programmet uppvisar, p. g. a. det nästan obefintliga kommunikationsbehovet, en helt perfekt parallellisering!

PROGRAM SUM_CAF
! Summation baklänges med CAF
IMPLICIT NONE
REAL, DIMENSION[*] :: PART_SUM, TIME1, TIME2
REAL, EXTERNAL     :: WTIME
REAL               :: WHOLE_SUM, TIME_SUM, TIME3, TIME4
Integer            :: NUMBER, I, N

call sync_images()
N = num_images()   ! = antal processorer

NUMBER = 1000000   ! = totala antalet element som skall summeras
PART_SUM = 0.0
call sync_images()

TIME3 = WTIME()      ! Väggtid vid programstart
call cpu_time(TIME1) ! CPU-tid vid programstart

do I = NUMBER + 1 - this_image(), 1, -N ! Backwards
!  Summation av varje, vart annat, vart tredje, ..., element 
!  pä respektive processor om N = 1, 2, 3, ... 
   PART_SUM = PART_SUM + 1.0/REAL(I)**2
end do

call cpu_time(TIME2) ! CPU-tid vid programslut
TIME4 = WTIME()      ! Väggtid vid programslut

call sync_images()
! Sammanställ resultaten pä processor 1
if ( this_image() == 1 ) then
   WHOLE_SUM = 0.0
   TIME_SUM  = 0.0
   do I = 1, N
      WHOLE_SUM = WHOLE_SUM + PART_SUM[I]
      TIME_SUM  = TIME_SUM + TIME2[I] - TIME1[I]
   end do
   write(*,10) N, WHOLE_SUM, TIME_SUM, TIME4 - TIME3
10 FORMAT(2X,'NUMBER OF PROCESSORS',5X,'WHOLE_SUM',9X, &
&  'TOTAL CPU TIME',5X, 'WALL CLOCK TIME',/ &
&  5X,I5,15X,F16.12,F12.6,7X,F12.6)
end if

end

Datormiljöer Innehåll Marknadsföring


Senast modifierad: 27 maj 2014
boein@nsc.liu.se