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