Sto cercando un modo rapido per calcolare il prodotto punto di vettori con 3 o 4 componenti. Ho provato diverse cose, ma la maggior parte degli esempi online utilizza una serie di float mentre la nostra struttura dati è diversa.Prodotto a punti veloci usando intrinseci SSE/AVX
Utilizziamo le strutture allineate a 16 byte. estratto di codice (semplificato):
struct float3 {
float x, y, z, w; // 4th component unused here
}
struct float4 {
float x, y, z, w;
}
Nei test precedenti (utilizzando SSE4 prodotto scalare intrinseco o FMA) non ho potuto ottenere un aumento di velocità, rispetto al utilizzando il seguente codice C++ regolare.
float dot(const float3 a, const float3 b) {
return a.x*b.x + a.y*b.y + a.z*b.z;
}
I test sono stati eseguiti con gcc e clang su Intel Ivy Bridge/Haswell. Sembra che il tempo speso per caricare i dati nei registri SIMD e tirarli fuori di nuovo uccide tutti i vantaggi.
Gradirei un po 'di aiuto e idee, come il prodotto punto può essere calcolato in modo efficiente utilizzando le nostre strutture dati float3/4. SSE4, AVX o anche AVX2 va bene.
Grazie in anticipo.
Hai controllato l'ASM generato? Per gcc, puoi attivare la generazione di output ASM usando l'opzione '' -S'' (l'output è scritto sull'obiettivo dato con '' -o''). Quali sono le tue opzioni di compilazione? È possibile che gcc produca già il codice SSE? –
Come regola generale, SSE accelera le cose solo se si hanno molti calcoli senza lasciare i registri SSE. Quello che hai nella tua funzione punto sembra non abbastanza (e confermato anche dai tuoi test). Se avete qualcosa di più grande che include una chiamata a punto() (idealmente un ciclo che chiama punto() un migliaio di volte, e l'intero ciclo può essere implementato come SSE) - allora avete una buona possibilità di accelerazione generale. –
Sarebbe utile vedere più contesto, in particolare il codice che chiama 'punto'. Stai chiamando 'punto' in un ciclo, ad es.per un array di 'float3' o' float4'? –