praegune kellaaeg 06.07.2025 17:40:13
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
UglyOgre
HV kasutaja

liitunud: 25.03.2004
|
01.05.2008 02:30:33
OpenMP/libgomp ja nested tsüklid |
|
|
Tere,
Äkki keegi OpenMP/libgomp-i kogemusega inimene seletaks, kuidas seda korrektselt kasutada nested tsüklite puhul. Idee pseudokood on umbes selline:
c:
|
for (i=1; i<CONST; i++){ a = array[i-1]; b = array[i] - array[i-1]; c = 0; for(j=a; j<a+b; j++){ if (foo(array2[j]) > 0){ c++; } } if (c > 0){ /*tee midagi*/ } }
|
Dokumentatsiooni (OpenMP v2.5) näide on selline:
c:
|
void work(int i, int j) {} void good_nesting(int n) { int i, j; #pragma omp parallel default(shared) { #pragma omp for for (i=0; i<n; i++) { #pragma omp parallel shared(i, n) { #pragma omp for for (j=0; j < n; j++) work(i, j); } } } }
|
Kuid selle järgi tehes läbitakse välimise tsükli iga etappi millegipärast 2 korda. Samuti ei ole ma ka päris kindel, millised muutujad tuleb välimiselt tsüklilt sisemisele edasi saata. Igasugused ideed ja arvamused on teretulnud.
|
|
Kommentaarid: 19 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
16 |
|
tagasi üles |
|
 |
spikhoff
HV veteran
liitunud: 26.01.2005
|
01.05.2008 08:56:26
Re: OpenMP/libgomp ja nested tsüklid |
|
|
Aga topi printf funktsioonid vahele? Saad n2ha mitu kord tsykkel l2bi k2idi, siis muuda tsyklite argumente ja vaatad mis juhtub.
c:
|
for (i=1; i<CONST; i++){ a = array[i-1]; b = array[i] - array[i-1]; c = 0; for(j=a; j<a+b; j++){ if (foo(array2[j]) > 0){ c++; } } if (c > 0){ /*tee midagi*/ } }
|
|
|
Kommentaarid: 59 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
54 |
|
tagasi üles |
|
 |
UglyOgre
HV kasutaja

liitunud: 25.03.2004
|
01.05.2008 19:20:32
|
|
|
Tundub, et sain oma mure lahendatud (iseasi kui korrektselt, loomulikult). Idee sain sellest artiklist, lühidalt öeldes muutsin threadi piires privaatseks tsüklitest sõltuvad muutujad. Pisut segane see seletus sai, aga koodis näeb see välja umbes nii:
c:
|
#pragma omp parallel for private (i, j, a, b, c ) for (i=1; i<CONST; i++){ a = array[i-1]; b = array[i] - array[i-1]; c = 0; for(j=a; j<a+b; j++){ if (foo(array2[j]) > 0){ c++; } } if (c > 0){ /*tee midagi*/ } }
|
|
|
Kommentaarid: 19 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
16 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|