Latência das instruções da CPU nos processadores x86 e x64


13

Estou procurando alguma tabela ou algo semelhante que possa me ajudar a calcular a eficiência do código de montagem.

Como eu sei, a troca de bits leva 1 relógio da CPU, mas eu realmente estou olhando quanto custa adição (subtração deve levar o mesmo), multiplicação e como presumivelmente calcular o tempo de divisão se eu souber valores que estão dividindo.

Eu realmente preciso de informações sobre valores inteiros, mas os tempos de execução de flutuação também são bem-vindos.


Respostas:


9

Em geral, cada uma dessas operações também executa um único ciclo de clock para executar se os argumentos estiverem registrados nos vários estágios do pipeline.

O que você quer dizer com latência? Quantos ciclos uma operação gasta na ULA?

Você pode achar esta tabela útil: http://www.agner.org/optimize/instruction_tables.pdf

Como os processadores modernos são super escalares e podem ser executados fora de ordem, geralmente é possível obter instruções totais por ciclo que excedem 1. Os argumentos para o comando macro são os mais importantes, mas a operação também é importante, pois as divisões demoram mais que XOR (<1 latência do ciclo).

Muitas instruções x86 podem levar vários ciclos para concluir alguns estágios, se forem complexas (comandos REP ou MWAIT pior, por exemplo).


3
A multiplicação de números inteiros tem latência de pelo menos 3c em todas as CPUs x86 recentes (e superior em algumas CPUs mais antigas). Em muitas CPUs, ele é totalmente canalizado; portanto, a taxa de transferência é de 1 por relógio, mas você só pode conseguir isso se tiver três multiplicações independentes em andamento. (A multiplicação de FP no Haswell é latência de 5c, rendimento de 0,5c, portanto, você precisa de 10 em vôo para saturar o rendimento). A divisão ( dive idiv) é ainda pior: é microcodificada e tem uma latência muito maior que addou shr, e nem é totalmente canalizada em qualquer CPU. Tudo isso é direto das tabelas de instruções de Agner Fog, por isso é bom que você tenha vinculado isso.
Peter Cordes


7

Calcular a eficiência do código de montagem não é o melhor caminho atualmente nos pipelines super escalares de execução fora de ordem. Isso varia de acordo com o tipo de processador. Ele variará nas instruções antes e depois (você pode adicionar código extra e executá-lo mais rápido às vezes!). Algumas operações (principalmente a divisão) podem ter uma variedade de tempos de execução, mesmo em chips mais antigos e previsíveis. Na verdade, o tempo de muitas iterações é o único caminho a percorrer.


Eu sei disso, mas preciso disso não em um projeto real, mas em um tipo de projeto de programação divertido .
ST3 10/10

Se você precisa real ou por diversão, não muda a resposta para essa linha de processadores. Você já pensou em mudar para um processador mais determinístico, como um chip Propeller?
precisa saber é o seguinte

3
Mesmo com uma escalar, previsões incorretas de ramificação de implementação e falhas de cache podem causar variação no tempo de execução.
Paul A. Clayton

Para coisas puramente ligadas à CPU (sem falhas de cache, sem erros de previsão de ramificação), o comportamento da CPU é entendido em detalhes suficientes para que a análise estática possa prever quase exatamente exatamente quantos ciclos por iteração um loop levará em uma CPU específica (por exemplo, Intel Haswell). por exemplo, veja esta resposta SO onde, olhando para o asm gerado pelo compilador, deixe-me explicar por que a versão ramificada foi executada quase exatamente 1,5x mais rapidamente que a versão CMOV na CPU Sandybridge do OP, mas muito mais próxima do meu Skylake.
Peter Cordes

Se você está escrevendo asm manualmente por motivos de desempenho, é realmente útil procurar gargalos de latência e taxa de transferência nas CPUs Intel e AMD. No entanto, é difícil e, às vezes, o ideal para a AMD não é o ideal para a Intel.
6607 Peter Cordes

4

Você pode encontrar informações sobre a Intel cpu nos manuais do desenvolvedor de software da Intel . Por exemplo, a latência é de 1 ciclo para uma adição de número inteiro e 3 ciclos para uma multiplicação de números inteiros.

Não sei sobre multiplicação, mas espero que a adição sempre tome um ciclo.


Um ciclo, exceto quando está "livre" (em paralelo quando os pipelines estão alinhados corretamente) ou leva mais tempo devido a uma falha no cache. :-)
Brian Knoblauch 24/09

2
Atualmente (2018), essas informações estão disponíveis no Apêndice C, chamado "Latência e taxa de transferência de instruções" do documento 248966 "Manual de referência da otimização de arquiteturas Intel® 64 e IA-32" também disponível na página vinculada na resposta
stefanct
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.