OpenMP, Fortran és FFTW

Fórumok

Sziasztok!

Core2Duo proc lapul a gépemben és párhuzamosítani szeretnék két fft-t Fortranban (később bonyolultabb számolásról lesz szó, de ez most a modell-feladat hozzá), gfortrannal fordítok -fopenmp paraméterrel. Eddig még sose foglalkoztam párhuzamos programozással, de most alapszinten jól jönne.
A releváns kódrészlet a következő:

!$OMP SECTIONS
!$OMP SECTION
call dfftw_plan_dft_1d(plan,N,in1,out1,FFTW_FORWARD,FFTW_ESTIMATE)
call dfftw_execute(plan)
call dfftw_destroy_plan(plan)
!$OMP SECTION
call dfftw_plan_dft_1d(plan,N,in2,out2,FFTW_FORWARD,FFTW_ESTIMATE)
call dfftw_execute(plan)
call dfftw_destroy_plan(plan)
!$OMP END SECTIONS

Amint látható, a probléma "embarassingly parallel", külön változókkal dolgoznak, tehát elvileg nyernem kéne a párhuzamosítással.
Gnome-system-monitoron lesem a két mag kihasználtságát közben, de vhogy nem akar különbözni attól az esettől, mikor simán végrehajtatok egy fft-t (ami jelenleg kb 3 sec-ig fut).

Hozzászólások


Binding

The binding thread set for a sections region is the current team. A sections
region binds to the innermost enclosing parallel region. Only the threads of the team
executing the binding parallel region participate in the execution of the structured
blocks and (optional) implicit barrier of the sections region.

Tehat kene meg kore egy:


!$omp parallel [clause[[,] clause]...]
   structured-block
!$omp end parallel

forras (azota van ujabb, de en meg ezt nezegettem anno):
http://www.openmp.org/mp-documents/spec25.pdf

Az alábbi címen van egy bevezetés az OpenMP használatába:
https://docs.loni.org/wiki/Introduction_to_OpenMP

Az első mintaprogram pl. megmutatja, hogy hány CPU-n történik a futtatás:

program hello90
use omp_lib
integer:: id, nthreads
!$omp parallel private(id)
id = omp_get_thread_num()
write (*,*) 'Hello World from thread', id
!$omp barrier
if ( id == 0 ) then
nthreads = omp_get_num_threads()
write (*,*) 'There are', nthreads, 'threads'
end if
!$omp end parallel
end program

Fordítás:
gfortran -fopenmp -o hello90 hello90.f90

Futtatás:
./hello90

Eredmény:
Hello World from thread 1
Hello World from thread 0
There are 2 threads

A futtatott szálak számát az OMP_NUM_THREADS nevű környezeti változóval lehet beállítani (=1 soros futtatás, vagy =2 párhuzamos futtatás között illik különbségnek lenni...). Ha OMP_NUM_THREADS nincs megadva, akkor automatikusan a felismert magok/processzorok számának megfelelő számú szál fut.

A beküldött programodból szerintem hiányzik az !$OMP PARALLEL direktíva.

Erre is találtam egy mintapéldát a https://docs.loni.org/wiki/Advanced_OpenMP címen:

PROGRAM SECTIONS
USE OMP_LIB
INTEGER SQUARE
INTEGER X, Y, Z, XS, YS, ZS
CALL OMP_SET_DYNAMIC (.FALSE.)
CALL OMP_SET_NUM_THREADS (3)
X = 2
Y = 3
Z = 5
!$OMP PARALLEL
!$OMP SECTIONS
!$OMP SECTION
XS = SQUARE(X)
PRINT *, "ID = ", OMP_GET_THREAD_NUM(), "XS =", XS
!$OMP SECTION
YS = SQUARE(Y)
PRINT *, "ID = ", OMP_GET_THREAD_NUM(), "YS =", YS
!$OMP SECTION
ZS = SQUARE(Z)
PRINT *, "ID = ", OMP_GET_THREAD_NUM(), "ZS =", ZS
!$OMP END SECTIONS
!$OMP END PARALLEL
END
INTEGER FUNCTION SQUARE(N)
INTEGER N
SQUARE = N*N
END

Az fftw rutinok eleve kepesek multithreaded modban mukodni es kihasznalni az osszes CPU magot. Miert nem jo ez neked?

teljesen jogos, vmiért az sem akart műküdni, pedig az fftw oldalán leírt módon csináltam meg a kódot. biztos én csesztem el vmit. még lesegetem majd azt is. csak ezt is meg akartam próbálni, mert 2 és 3 dimenziós tömböket kell majd fft-znem, és úgy gondoltam, a páros ill. páratlan sorszámú vektorokat (tömbszeleteket) megosztom majd a két szál között, mert függetlenül számolhatóak.

köszönöm mindenkinek, a tippek jók. a mintapéldákat lesegetem. viszont a $!OMP PARALLEL direktíva beszúrása után sem pörög fel mind2 mag. Ezt az infót találtam a SECTIONS-re:
"It is even possible for one thread to do all of the work. Which thread does work is non-deterministic in this case."
szóval lehet nem ez a jó megoldás erre a típusú feladatra.
Az fftw-t meg még nyüstölni fogom.

nos, most felpörög mind a 2 mag. Az az igazság, abszolút kezdő vok fortranban, a kódom egyéb részében volt a hiba. viszont a két szálas dolognál baromi hosszú ideig megy és a végén segfaultol. vmi tuti nem thread-safe abban, amit csinálok, valszeg az fftw-nél, mivel a fenti programszeletben más nagyon nincs. nézegetem majd még az fftw-t többmagos üzemmódban is, ha jól tolja, az is megfelelne.