Instruction Level Parallelism
Instruction Level Parallelism (ILP) paralelizm poziomu instrukcji, mechanizm zrówoleglania fragmentów kodu wykonywany przez procesor na poziomie automatycznego zrównoleglania poszczególnych instrukcji procesora (dokonywany bez ingerencji programisty). o ile starsze procesory potrafily wykonywać instrukcje scisle sekwencyjnie (kolejna instrukcja mogla byc wykonywana dopiero po pełnym wykonaniu poprzedniej) to obecnie wiele wspólczesnych procesorów (np wszystkie w architekturze x86 poczawszy od pierwszego pentium) potrafi wykonywac kod maszynowy w ten sposób ze przypisuje wykonywane instrukcje do odrebnych kanałów (tzw. channels) procesora i potrafi wykonywac je równolegle, tj nawet w tym samym cyklu (lub w rownoleglych kilku cyklach) procesora, Możliwosci takiego zrównoleglania są istotnie limitowane przez zaleznosci miedzy instrukcjami. Procesor mozna zrownoleglic instrukcje b z instrukcja a jezleli do wykonania ktorejs instrukcji b nie jest potrzebny wynik instrukcji a (i analogicznie nawet dla wiekszych ukladów instrukcji). Ogolnie kod maszynowy charakteryzuje sie zaleznosciami miedzy instrukcjami (kolejne dzialania zaleza od wynikow poprzednich) w ramach tego jednak wystepuje wiele drobnych instrukcji które parami, czy tez trójkami lub czwórkami sa niezalezne i moga byc zrownoleglone na poziomie kanałow procesora. Przyspieszenie jakie mozna osiagnac dzieki takiemu paralelizmowi poziomu instrukcji zalezy od stopnia zaleznosci poszczegolnych instrukcji w danym fragmencie kodu i co do rzeędu zwykle wynosi to w granicach (jesli mowa o rzędzie przyspieszenia jaki w praktyce w ten sposob jest uzyskiwany) dwukrotnego przyspieszenia danego kodu - od niewielkiego kilkunastoprocentowego przyspieszenia w niesprzyjajacym przypadku do przyspieszenia o czynnik dla przykladu dwa lub trzy jesli potok instrukcji jest podatny na zrównoleglanie grupami po kilka instrukcji na raz) Programista lub kompilator może pomóc procesorowi przegrupowywujac instrukcje w wynikowym kodzie maszynowym w ten sposób ze wzajemnie niezalezne instrukcje beda w potoku wystepowac obok siebie.
Uzywa sie tez pojec troughput i latency. latency jest to czas jaki zajmuje wykonanie instrukcji, w niesprzyjajacym przypadku czas wykonania kodu bylby sumą czasów latency wszystkich instrukcji - dzieki opcji zrownolegliwiania instrukcji czas wykonywania calosci moze byc mniejszy. Truoughput opisuje mozliwosci przetwarzania danej maszyny w konkretnej sprzyjajacej sytuacji gdy nastepuje zrównoleglanie wtedy czas całosci jest mniejszy niz ten wynikajacy z sum latencji.