Ho un semplice codice a 32 bit che calcola il prodotto di un array di interi a 32 bit. Il ciclo interno si presenta così:Perché il giro di andata e ritorno della memoria è più veloce del non effettuare il viaggio di andata e ritorno?
@@loop:
mov esi,[ebx]
mov [esp],esi
imul eax,[esp]
add ebx, 4
dec edx
jnz @@loop
Quello che sto cercando di capire è il motivo per cui il codice di cui sopra è del 6% più veloce di queste due versioni del codice, che non svolge la memoria di andata e ritorno ridondante:
@@loop:
mov esi,[ebx]
imul eax,esi
add ebx, 4
dec edx
jnz @@loop
e
@@loop:
imul eax,[ebx]
add ebx, 4
dec edx
jnz @@loop
Gli ultimi due pezzi di codice eseguire praticamente nello stesso tempo, e come accennato entrambi sono 6% più lento del primo pezzo (165ms vs 155ms, 200 milioni di elementi).
Ho provato ad allineare manualmente il target di salto a un limite di 16 byte, ma non fa alcuna differenza.
L'ho eseguito su un Intel i7 4770k, Windows 10 x64.
Nota: so che il codice potrebbe essere migliorato eseguendo tutti i tipi di ottimizzazioni, tuttavia mi interessa solo la differenza di prestazioni tra le parti di codice sopra riportate.
Non posso darti riferimenti (perché probabilmente non esistono, dal momento che rivelerebbero segreti commerciali), ma probabilmente stai vedendo un artefatto dello straordinario sforzo che Intel mette nelle prestazioni della cache L1. – Gene
Si verifica ancora quando si inserisce un carico fittizio 'mov ecx, [ebx]' nella seconda versione? – harold
Come vanno le prestazioni nel caso memorizzato nella cache? Il primo ciclo dovrebbe uscire dal buffer del ciclo ad uno per 2 cicli (dal momento che sono 5 domini con dominio fuso sulla CPU Haswell). Gli altri due possono rilasciare un ciclo per iterazione. Tuttavia, la catena di dipendenza "imul" trasportata da loop dovrebbe limitarli tutti a 3 cicli per iterazione.Il primo non ha lo store e non ricarica nella catena di dipendenze del percorso critico, e Haswell può eseguire 2x load + 1x store ogni ciclo. (Pre-Haswell non aveva un AGU dedicato al negozio). Non riesco a capire perché è più veloce, ma ha senso che non sia più lento. –