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.

questionAnswers(1)

yourAnswerToTheQuestion