[OpenMP] in hoeverre "slim" parallelisatie API?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Stel je voor dat ik deze parallele code heb, en het ga paralleliseren met OpenMP:
C++:
1
2
3
4
5
6
7
8
9
/* en x,y worden na loop niet meer gebruikt */
int x = 0;
int y = _somevalue_;
for (int i = 0; i < N; i++) {
  for (int j = 0; j < M; j++) {
    function(x++, y);
  }
  y += P;
}


In hoeverre is de implementatie slim genoeg om te zien dat de iteraties onafhankelijk van elkaar gedraaid kunnen worden? Of doet OpenMP helemaal niks in die trant, en alle verantwoordelijkheid is voor de programmeur? Eg, ik moet zelf function door het volgende vervangen:
C++:
1
function(i * M + j, y + i * P);


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:05
OpenMP doet uit zichzelf helemaal niets.

Er zijn wel speciale declaraties voor variabelen die geüpdatet worden in een parallele loop, waardoor je dit soort expressies niet altijd handmatig hoeft om te schrijven, maar dan nog zal OpenMP de lus alleen paralleliseren als je daar expliciet om vraagt.

edit:
Ik denk dat in dit voorbeeld je trouwens wel zelf die expressie moet omschrijven...

[ Voor 14% gewijzigd door Soultaker op 15-04-2009 13:56 ]


Acties:
  • 0 Henk 'm!

  • bomberboy
  • Registratie: Mei 2007
  • Laatst online: 22:10

bomberboy

BOEM!

Darkvater schreef op woensdag 15 april 2009 @ 12:19:
In hoeverre is de implementatie slim genoeg om te zien dat de iteraties onafhankelijk van elkaar gedraaid kunnen worden? Of doet OpenMP helemaal niks in die trant, en alle verantwoordelijkheid is voor de programmeur?
Zoals Soultaker al aangeeft: OMP vertrouwt enkel op de programmeur en op wat de programmeur zegt dat geparalleliseerd mag worden. En dat geef je dan aan door die #pragma's
Eg, ik moet zelf function door het volgende vervangen:
C++:
1
function(i * M + j, y + i * P);
Dat zal je inderdaad moeten doen. En dan zou iets als
C++:
1
2
3
4
5
#pragma omp parallel
    {
        #pragma omp for private(i,j,y,P,M,N) schedule(runtime)
                //hier de code
        }


moeten volstaan denk ik.

Note: het is wel sinds mijn studies geleden dat ik dit nog gebruikt heb, dus misschien zijn er ondertussen ook nieuwe dingen mogelijk