Profilowanie poziomu instrukcji: znaczenie wskaźnika instrukcji?
Podczas profilowania kodu na poziomie instrukcji zespołu, co naprawdę oznacza pozycja wskaźnika instrukcji, biorąc pod uwagę, że nowoczesne procesory nie wykonują instrukcji szeregowo lub w kolejności? Załóżmy na przykład następujący kod zespołu x64:
mov RAX, [RBX]; // Assume a cache miss here.
mov RSI, [RBX + RCX]; // Another cache miss.
xor R8, R8;
add RDX, RAX; // Dependent on the load into RAX.
add RDI, RSI; // Dependent on the load into RSI.
W której instrukcji wskaźnik instrukcji spędza większość czasu? Mogę wymyślić dobre argumenty dla nich wszystkich:
mov RAX, [RBX]
bierze prawdopodobnie 100 sekund cykli, ponieważ jest to brak pamięci podręcznej.mov RSI, [RBX + RCX]
zajmuje także 100 cykli, ale prawdopodobnie wykonuje się równolegle z poprzednią instrukcją. Co to znaczy, że wskaźnik instrukcji znajduje się na jednym lub drugim z nich?xor R8, R8
Prawdopodobnie wykonuje się po awarii i kończy się przed zakończeniem ładowania pamięci, ale wskaźnik instrukcji może pozostać tutaj, dopóki wszystkie poprzednie instrukcje również nie zostaną zakończone.add RDX, RAX
generuje przeciągnięcie rurociągu, ponieważ jest to instrukcja, w której wartośćRAX
jest rzeczywiście używany po powolnym ładowaniu pamięci podręcznej.add RDI, RSI
również zatrzymuje się, ponieważ zależy od obciążeniaRSI
.