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.
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. –
Ja, das ist möglich, mit verschachtelten Parallelität. –
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.) –