Eu tenho o seguinte loop no asm:
.LBB5_5:
vaddpd ymm0, ymm0, ymmword, ptr, [rdi, +, 8*rcx]
vaddpd ymm1, ymm1, ymmword, ptr, [rdi, +, 8*rcx, +, 32]
vaddpd ymm2, ymm2, ymmword, ptr, [rdi, +, 8*rcx, +, 64]
vaddpd ymm3, ymm3, ymmword, ptr, [rdi, +, 8*rcx, +, 96]
add rcx, 16
cmp rax, rcx
jne .LBB5_5
Isso faz parte de uma função maior que calcula a soma de um [f64]
array em Rust.
Comparei esse código com a caixa de critérios e consegui que os ciclos 1 000 000 000
duplos ocorressem 200 000 000
na minha CPU Rocket Lake (i7 11700K)
Em várias fontes, descobri que a latência de uma adição de ponto flutuante é de 4 ciclos nesta CPU. Isso significaria que cada um deles vaddpd
só pode ser executado a cada 4 ciclos, pois carregam uma dependência da soma anterior. Isso significaria que só posso fazer 4 adições duplas por ciclo no máximo.
Minha medição mostra que faz 5 adições por ciclo. (Ele usa as RDTSC
instruções para medi-lo, não tenho certeza se isso pode ser problemático)
Quero principalmente entender o que está acontecendo e testar se entendo bem o pipeline da CPU.