2012-04-12 5 views
0

Wenn ich eine Schleife wie dieserOpenMP und Funktionen

int main(){ 
.... 

for (i=0; i< N; i++) 
{ 
    /*Do some calculations*/ 
    for (j=0; j<M; j++) 
    { 
    /*Do more calculations*/ 
    compute_x(some pointers as args); 
    } 
    compute_y(some pointer as args); 
} 
... 

return value; 
} 

and 

void compute_x(some pointers as args) 
{ 
    /* some calculations*/ 
    for (h=0; h<COUNT; h++) 
    { 
    ... 
    } 
} 
} 

und compute_y haben() ist ähnlich.

Meine Frage ist, wenn ich die äußeree Schleife im Haupt mit dem OpenMP Direktiven parallelisieren,

#pragma omp parallel for schedule (runtime) private (...) 
for (i=0; i< N; i++) 
{ 
... 
} 

Was das Verhalten der Funktion compute_x() und compute_y() sein wird ?? Soweit ich weiß, werden sie von jedem Thread ausgeführt, daher wird die for-Schleife in compute_x() von 0 bis COUNT von jedem Thread ausgeführt.

Wenn das richtig ist, was kann ich tun, um die Arbeitsbelastung auch in der for-Schleife in Funktion compute_x() zu teilen (unter der Annahme, dass es keine Datenabhängigkeit gibt). Meine erste Vermutung ist, die Funktion compute_x() und compute_y() inline zu machen, aber die Funktionen sind ziemlich groß, und sie rufen auch andere Funktionen auf, die glücklicherweise auch parallel ausgeführt werden können.

+0

Ihre Frage war schon komplex, also entfernte ich die Nebenfrage über Inline. Bitte fragen Sie es in einem separaten Post (Sie können es mit der Geschichte wiederherstellen) – CharlesB

Antwort

1

Wenn Ihr some pointers as args unterschiedlich sind für jeden Thread (unterschiedlich für jede i) oder wenn sie mit const Modifikator sind, das ist kein Thread den Inhalt von Zeiger ändern kann, dann nichts Unerwartetes passieren würde.

Die schlechte Sache ist, wenn Ihre verschiedenen Threads die gleichen Zeiger teilen und gleichzeitig Daten schreiben/lesen, auf die sie zeigen, dann können Sie ein unvorhergesehenes Ergebnis haben.

2

Wenn die äußere Schleife genügend Iterationen hat, um alle Kerne beschäftigt zu halten, besteht kein Grund, die Parallelisierung auf die inneren Schleifen zu erweitern. Dies wird nur mehr Threads erstellen, die nicht notwendig sind.