Mi sono imbattuto in un curioso problema. Un algoritmo Sto lavorando su è costituito da un sacco di calcoli come questoprestazioni a virgola mobile a 32 bit rispetto a 64 bit
q = x(0)*y(0)*z(0) + x(1)*y(1)*z(1) + ...
in cui la lunghezza della somma è compresa tra 4 e 7.
I calcoli originali sono tutti fatti con 64 bit di precisione. Per la sperimentazione, ho provato a utilizzare la precisione a 32 bit per i valori di input x, y, z (in modo che i calcoli vengano eseguiti utilizzando 32 bit) e memorizzare il risultato finale come valore a 64 bit (cast diretto).
mi aspettavo prestazioni a 32 bit per essere meglio (dimensione della cache, SIMD dimensioni, ecc), ma con mia sorpresa non c'era alcuna differenza in termini di prestazioni, forse anche diminuire.
L'architettura in questione è Intel 64, Linux e GCC. Entrambi i codici sembrano utilizzare SSE e le matrici in entrambi i casi sono allineate al limite di 16 byte.
Perché dovrebbe essere così? La mia ipotesi è che la precisione a 32 bit può usare SSE solo sui primi quattro elementi, mentre il resto viene composto in serie dall'overhead del cast.
Hai aggiunto una taglia - cosa non ti è piaciuto della risposta di dsimcha? Potrebbe anche valere la pena provare il GCC più recente che puoi o il compilatore di Intel http://software.intel.com/en-us/articles/non-commercial-software-download/ per vedere se fanno un miglior lavoro di compilazione/vettorizzazione . – Rup
@Rup Mi piace la sua risposta, tuttavia vorrei anche altre opinioni, quindi metto una taglia – Anycorn