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).
- 1859 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
tényleg hiányzott, köszönöm
- A hozzászóláshoz be kell jelentkezni
Az fftw rutinok eleve kepesek multithreaded modban mukodni es kihasznalni az osszes CPU magot. Miert nem jo ez neked?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
nekem is a todo-listan van az openmp ...
en ezt talaltam hozza: https://computing.llnl.gov/tutorials/openMP/
k.
- A hozzászóláshoz be kell jelentkezni