Identyfikator - litery, cyfry, pierwszy znak litera, max 6 znaków
Komentarz - zajmuje cały wiersz (C / * / !) W jednym wierszu co najwyżej 1 instrukcj lub deklaracja; brak „;” i innych separatorów
Etykiety - ciąg do pięciu cyfr. Spacje pomijane z wyjątkiem stałych tekstowych
Tekst programu w segmentach:
- segment główny - pr gł
- segment pomocniczy - podprogramy
- koniec segmentu - „end”
Typy danych
integer
real
double precision 1d-5=1e-5
complex
logical
character
Zapis: .true. .false.
Stałe: Parametr(ident=wyr)
Zmienne: Ident.typu lista.id.zmiennych.oddzielona.przecinkami
Tablice: id.typu id.tablicy(zakres,zakres.1….zakres.n) zakr.dolny=1
Np.: real tab(0:10)
Tab1(5)
Zmienne globalne - Common
Np.: common /nazwa strefy 1/ lista zmiennych1
/nazwa strefy 2/ lista zmiennych2
common lista.zmiennych
common // lista zmiennych
Inne
3**2 == 3^2
a.eq.1.or.b.gt.2 == ((a=1) or (b>2))
Read
read f,lista we (f-formatowanie)
read *, lista.we
print f,lista.wy
print *,lista.wy
Struktura
program identyfikator
.
.
end
Procedury
subrontine nazwa.proc(lista.par.formalnych) (<= moze być bez par, bez nawiasow)
deklaracje
return (<= koniec procedury)
end
Funkcje
id.typu function nazwa.f-cj(lista.param.formalnych)
.
return
end
Operatory relacji
Fortran 77 g77
= .eq. ==
<> .ne. /=
< .lt. <
> .gt. >
<= .le. <=
>= .ge. >=
Podprogram
wywołanie
call nazwa_procedury (lista parametrów)
parametry
są przekazywane prze zmienne
Fazy tworzenia programu równoległego
co program ma realizować
opracowanie algorytmu - jak wykonać zadania, jak rozdzielić prace między wiele procesorów = zrównoleglanie
implementacja w języku wysokiego poziomu
OpenMP - 1) zbiór dyrektyw kompilacji opisujących równoległość w kodzie źródłowym (Fortran 77, C/C++) 2) biblioteki podprogramów dostępnych dla równoległych aplikacji
Wątek (thrend)
Wątek główny (master thrend)
Wątek głowny
1 2 3 4
wątki poboczne (slave thrends)
sekcja krytyczna
S.K
S.K S.K
S.K
Redukcja - operacja w której zmienna za pomocą operatora dwuargumentowego wiąże się iteracyjnie z inną wartością i wynik jest zapisywany z powrotem w tej samej zmiennej
z=z+w
ZALEŻNOŚĆ DANYCH
zależność sterowania
S1: if (A>B) then S1 S2
S2: X=Y
endif
zależnośc danych
odwołanie do zmiennej programu
odczytanie jej aktualnej wartości
nadanie jej nowej wartości
występuje między dwiema instrukcjami wtedy gdy w obu instr. Następuje odwołanie do tej samej zmiennej i wynikiem wykonania przynajmniej jednej z nich jest nadanie tej zmiennej nowej wartości
w konsekwencji wykonanie instr. Odwołującej się do zmiennej może nastapić dopiero po zakończeniu wykonywanej instr. Która odwoływała się do tej zmiennej wcześniej
S1: A=B+C przemianowanie zmiennych
S2: D=A*2
Podział zależności danych
a) zależność przepływu
zapis do zmiennej S1: A=B+C
odczyt zmiennej S2: D=A*2
b) przeciwzależność
odczyt zmiennej S1: A=X+1
zapis do zmiennej S2: X=Y*Z
c) zależnośc wyjść
S1: P=P+Q+R
S2: S=P/2
S3: P=T*T
S1: A=X+Y
S2: B=C*A przeciwzależności
S3: X=W-V
S4: A=X-Y
Po zmianie
S1: A1=X+Y
S2: B=C*A1
S3: X1=W-V
S4: A=X1-Y
Pętla
- zależności wewnątrzitracyjne - źródło I ujście w tej samej iteracji
- zależności międzyiteracyjne - źródło i ujście w różnych iteracjach
do I=1,10
A(I)=X(I)
Y(I)=A(I)
enddo
it 1: A(1)=X(1)
Y(1)=A(1)
It 2 A(2)=X(2)
Y(2)=A(2)
It 10 A(10)=X(10)
Y(10)=A(10)
do I=2,10
A(I)=X(I)
Y(I)=A(I-!)
enddo
it 1: A(2)=X(2)
Y(2)=A(1)
It 2 A(3)=X(3)
Y(3)=A(2)
It 10 A(10)=X(10)
Y(10)=A(9)
do I=2,100
S1: a(i)=b(I*2)+x(i)
S2: c(i)=a(i)/2,0
S3: f(i)=C(i+1)-a(i)
S4: d(i+1)=c(i)*c(i)
S5: x(i)=d(i)+c(i-1)
S6: x(i+2)=e(i)+f(i)
enddo
zależność |
tablica |
typ |
rodzaj |
S1 S2 |
A |
przepływu |
wewnątrziteracyjna |
S1 S3 |
A |
przepływu |
wewnątrziteracyjna |
S1 S5 |
X |
przeciwzależność |
wewnątrziteracyjna |
S2 S4 |
C |
przepływu |
wewnątrziteracyjna |
S2 S5 |
C |
przepływu |
międzyiteracyjna |
S3 S2 |
C |
przeciwzależność |
międzyiteracyjna |
S3 S6 |
F |
przepływu |
wewnątrziteracyjna |
S4 S5 |
D |
przepływu |
międzyiteracyjna |
S6 S1 |
X |
przepływu |
międzyiteracyjna |
S6 S5 |
X |
wyjść |
międzyiteracyjna |
INNE
pause
stop
end = stop -segment gł
= return - sedment pomocniczy