2016-08-18 5 views
1

Nach this answer, ich habe tatsächlich komplizierten Code mit drei Schleifen:Ist es möglich, parallele Schleifen "zu kollabieren"?

!$omp parallel 
!$omp do 
do i=1,4 ! can be parallelized 
    ... 
    do k=1,1000 !to be executed sequentially 
    ... 
    do j=1,4 ! can be parallelized 
    call job(i,j) 

Die äußeren Schleifen beenden schnell mit Ausnahme i=4. Also möchte ich Threads auf der innersten Schleife starten, aber die k-Schleife nacheinander innerhalb jeder i -Iteration lassen. In der Tat, k Schleifen über die wechselnden Zustände eines Zufallsgenerators, so kann dies nicht parallelisiert werden.

Wie kann ich nur die i und j Schleifen einklappen? Ich vermute, dass die ordered Klausel hier nützlich ist, aber ich habe Angst, dass es die innere Schleife wieder beeinflussen würde und ich immer noch unsicher bin über die Syntax.

Antwort

1

Ich kann mir nicht vorstellen, wie das funktionieren könnte. Wie auch immer, die collapse Syntax unterstützt das definitiv nicht.

Wenn Sie ein Problem mit der Lastverteilung haben, denken Sie über das Umordnen Ihrer Schleifen nach, indem Sie dynamisches Scheduling, OpenMP-Tasks oder verschachtelte Parallelität verwenden. Es gibt nicht genug Code, um zu sagen, welcher hier anwendbar sein könnte.

+0

Vielleicht eine zukünftige OpenMP-Version? Technisch sollte es möglich sein, neue Threads in der innersten Schleife zu erstellen, während die äußeren freien Threads die CPU-Kapazität freigeben. –

+0

Ja, das ist möglich, mit verschachtelten Parallelität. –

+0

Oder parallelisieren Sie einfach die innere Schleife. Ich bin nur besorgt, dass es auch nicht effizient genug sein kann, wenn nur die "j" -Schleife von 1 bis 4 parallelisierbar ist und wenn sie zu oft ausgeführt wird. (Aber das gilt auch für verschachtelte Parallelität, wenn nicht mehr.) –

1

Wenn 1,4 die echten Werte sind, die Sie in der äußeren Schleife verwenden, dann schlage ich vor, nur innere Schleifen zu parallelisieren (die parallelisiert werden können), da es nicht viel Overhead geben wird.

Ein weiterer Vorschlag ist k und i Schleifen zu tauschen, wenn es möglich ist, so dass die äußere Schleife Schleife in k und die beiden neuen inneren Schleifen in i und j zusammen Zusammenbruch mit parallelisiert werden könnte wäre.

1

Ein leichter und einheitlicher Ansatz für diesen Fall ist die Verwendung von OpenMP-Aufgaben.
Sie können sie für beide parallele Schleifen oder nur für die innere verwenden. Im zweiten Fall werden wir eine Kombination der for und task Konstrukte haben. Diese Lösung nutzt verschachtelte Parallelität, vermeidet jedoch die Auswirkungen verschachtelter paralleler Regionen. Das taskloop Konstrukt ist ein äquivalenter und automatisierterer Ansatz.

Verwandte Themen