Articles of assembly de

Qual é o objective do registrador de pointers de quadro EBP?

Eu sou um iniciante em linguagem assembly e notei que o código x86 emitido pelos compiladores geralmente mantém o ponteiro do quadro em volta mesmo no modo release / optimized quando ele poderia usar o registrador EBP para outra coisa. Eu entendo porque o ponteiro do quadro pode tornar o código mais fácil de depurar, […]

A substituição de um contador de loops de 32 bits por um de 64 bits apresenta desvios loucos no desempenho

Eu estava procurando o caminho mais rápido para popcount grandes matrizes de dados. Eu encontrei um efeito muito estranho : Alterar a variável de loop de unsigned para uint64_t fez o desempenho cair 50% no meu PC. O benchmark #include #include #include int main(int argc, char* argv[]) { using namespace std; if (argc != 2) […]

Como eu alcanço o máximo teórico de 4 FLOPs por ciclo?

Como pode o pico máximo teórico de 4 operações de ponto flutuante (precisão dupla) por ciclo ser alcançado em um CPU Intel x86-64 moderno? Pelo que eu entendi, são necessários três ciclos para um SSE add e cinco ciclos para que um mul seja concluído na maioria dos processadores modernos da Intel (veja, por exemplo, […]

Por que os loops são sempre compilados no estilo “do… while” (salto de cauda)?

Ao tentar entender a assembly (com a otimização do compilador ativada), vejo esse comportamento: Um loop muito básico como este outside_loop; while (condition) { statements; } É frequentemente compilado em (pseudocódigo) ; outside_loop jmp loop_condition ; unconditional loop_start: loop_statements loop_condition: condition_check jmp_if_true loop_start ; outside_loop No entanto, se a otimização não estiver ativada, ela será […]

O que é a IACA e como eu a uso?

Eu encontrei esta ferramenta interessante e poderosa chamada IACA (o Intel Architecture Code Analyzer) , mas eu tenho dificuldade em entendê-lo. O que posso fazer com isso, quais são suas limitações e como posso: Usá-lo para analisar o código em C ou C ++? Usá-lo para analisar o código no montador x86?

É <mais rápido que <=?

Estou lendo um livro onde o autor diz que if( a < 901 ) é mais rápido que if( a <= 900 ) . Não exatamente como neste exemplo simples, mas há pequenas alterações de desempenho no código complexo de loop. Suponho que isso tenha que fazer alguma coisa com código de máquina gerado, caso […]

Instrução INC vs ADD 1: Isso importa?

Da resposta de Ira Baxter, por que as instruções INC e DEC não afetam a Carry Flag (CF)? Principalmente, eu fico longe do INC e DEC agora, porque eles fazem atualizações de código de condição parcial, e isso pode causar estranhas barracas no pipeline, e ADD / SUB não. Então, onde não importa (a maioria […]

Usando o registro do ponteiro base em C ++ inline asm

Eu quero ser capaz de usar o registrador de ponteiro base ( %rbp ) dentro de um asm inline. Um exemplo de brinquedo disso é assim: void Foo(int &x) { asm volatile (“pushq %%rbp;” // ‘prologue’ “movq %%rsp, %%rbp;” // ‘prologue’ “subq $12, %%rsp;” // make room “movl $5, -12(%%rbp);” // some asm instruction “movq […]

Um num ++ pode ser atômico para ‘int num’?

Em geral, para int num , num++ (ou ++num ), como uma operação read-modify-write, não é atômica . Mas muitas vezes vejo compiladores, por exemplo, o GCC , gerar o seguinte código para ele ( tente aqui ): Como a linha 5, que corresponde a num++ é uma instrução, podemos concluir que num++ é atômico […]

Maneira mais rápida de fazer a sum vetorial do flutuador horizontal no x86

Você tem um vetor de três (ou quatro) carros alegóricos. Qual é o caminho mais rápido para resumi-los? O SSE (movaps, shuffle, add, movd) é sempre mais rápido que x87? As instruções de adição horizontal no SSE4.2 valem a pena? Qual é o custo para mudar para o FPU, então faddp, faddp? Qual é a […]