Perfil de Nível de Instrução: O Significado do Ponteiro de Instrução?
Ao criar o código no nível de instrução de montagem, o que a posição do ponteiro de instrução realmente significa, já que as CPUs modernas não executam as instruções em série ou em ordem? Por exemplo, suponha o seguinte código de assembly 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.
Em qual instrução o ponteiro de instrução passará a maior parte do tempo? Eu posso pensar em bons argumentos para todos eles:
mov RAX, [RBX]
está tomando provavelmente 100s de ciclos porque é um erro de cache.mov RSI, [RBX + RCX]
também leva 100s de ciclos, mas provavelmente executa em paralelo com a instrução anterior. O que significa até mesmo para o ponteiro de instrução estar em um ou outro destes?xor R8, R8
provavelmente executa fora de ordem e termina antes que as cargas de memória terminem, mas o ponteiro de instrução pode ficar aqui até que todas as instruções anteriores também sejam concluídas.add RDX, RAX
gera uma tenda de oleoduto porque é a instrução onde o valor deRAX
é realmente usado após uma carga lenta de cache-miss para ele.add RDI, RSI
também empaca porque é dependente da carga emRSI
.