Odpojení smyčky - Loop unswitching
Odpojení smyčky je optimalizace kompilátoru. Přesune podmíněný uvnitř smyčky mimo něj duplikováním těla smyčky a umístěním jeho verze do každé klauzule if a else podmíněného.[1] To může zlepšit paralelizaci smyčky. Jelikož moderní procesory mohou rychle pracovat na vektorech, toto vylepšení zvyšuje rychlost programu.
Zde je jednoduchý příklad. Předpokládejme, že chceme přidat dvě pole X a y a také něco udělat v závislosti na proměnné w. Máme následující C kód:
int i, w, X[1000], y[1000]; pro (i = 0; i < 1000; i++) { X[i] += y[i]; -li (w) y[i] = 0; }
Podmíněný uvnitř této smyčky ztěžuje bezpečně paralelizovat tuto smyčku. Když smyčku odpojíme, stane se toto:
int i, w, X[1000], y[1000]; -li (w) { pro (i = 0; i < 1000; i++) { X[i] += y[i]; y[i] = 0; } } jiný { pro (i = 0; i < 1000; i++) { X[i] += y[i]; } }
Zatímco odpojení smyčky může zdvojnásobit množství zapsaného kódu, každá z těchto nových smyček může být nyní samostatně optimalizována.
V roce bylo zavedeno odpojení smyčky gcc ve verzi 3.4.[2]