98
szerkesztés
Módosítások
→Ciklus kifejtés
====Párhuzamos szálak ütemezése====
====Ciklus kifejtés====
A technika már egy példa erejéig a vektorizációnál is látható, de ott nem került részletezésre. A megoldás lényege, hogy a kellően nagy ciklust szétdaraboljuk kisebb darabokra, amit már külön feldolgozhatóak, ezzel párhuzamosítva a folyamatokat. Az egy darab kiindulási ciklusból két darab egymásba ágyazott ciklust hozunk létre, ami ugyanazon a feladattéren dolgozik.
Eredeti állapot:
<pre>
for (int i = 0; i < n; i++) {...}
</pre>
Átírt változat:
<pre>
int STRIP=1024;
for (int ii = 0; ii < n; ii += STRIP)
for (int i = ii; i < ii+STRIP; i++) {...}
// ha még van maradék elem, akkor azokon is végrehajtjuk a számításokat
if (n%STRIP != 0) {
for (i=n-(n%STRIP)+1; i<n; i++) {...}
}
</pre>
A darabok mérete (STRIP értéke) az adott rendszer és feladat függvényében változhat, tehát ez egyfajta "tuning" paraméter.
====Automatikus ciklusösszevonás====
Az OpenMP támogatást nyújt több egymásba ágyazott ciklus "összevonására". Ehhez csak a '''collaps''' fordítási direktívát és az összevonandó ciklusok számát kell megadni. <br />