Sto cercando di migliorare questo codice con il prodotto punto SSE4 ma sto riscontrando difficoltà nel trovare una soluzione. Questa funzione ottiene i parametri qi e tj che contengono array float con 80 celle ciascuno e quindi calcolano il prodotto punto. Il valore di ritorno è un vettore con quattro punti. Quindi, quello che sto cercando di fare è calcolare quattro prodotti punto di venti valori in parallelo.Vectorizing Calcolo del prodotto del punto utilizzando SSE4
Hai qualche idea su come migliorare questo codice?
inline __m128 ScalarProd20Vec(__m128* qi, __m128* tj)
{
__m128 res=_mm_add_ps(_mm_mul_ps(tj[0],qi[0]),_mm_mul_ps(tj[1],qi[1]));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[2],qi[2]),_mm_mul_ps(tj[3],qi[3])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[4],qi[4]),_mm_mul_ps(tj[5],qi[5])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[6],qi[6]),_mm_mul_ps(tj[7],qi[7])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[8],qi[8]),_mm_mul_ps(tj[9],qi[9])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[10],qi[10]),_mm_mul_ps(tj[11],qi[11])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[12],qi[12]),_mm_mul_ps(tj[13],qi[13])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[14],qi[14]),_mm_mul_ps(tj[15],qi[15])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[16],qi[16]),_mm_mul_ps(tj[17],qi[17])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[18],qi[18]),_mm_mul_ps(tj[19],qi[19])));
return res;
}
Vieni a pensarci. Ci sono 40 carichi di memoria. A meno che non si stia utilizzando un processore Sandy Bridge, il collo di bottiglia si riduce a 40 cicli. Quindi il codice dell'OP potrebbe essere già ottimale. – Mysticial
Informazioni sull'associatività in virgola mobile: Spesso le sottostanti bandiere del compilatore '-ffast-math 'spesso sottovalutate e incomprese fanno miracoli. E gli AMD possono fare due carichi di memoria L1 per ciclo fin dagli albori dell'umanità, ma sfortunatamente sono cani lenti ovunque. – hirschhornsalz
Grazie mille per il vostro aiuto. Il risultato del mio test afferma che il mio codice funziona alla velocità della tua idea (come hai detto nel commento). L'AMD FMA4 sembra interessante ma questa istruzione non è disponibile sulla mia macchina e il codice deve essere compatibile con SSE2. Lo proverò con -ffast-math. –