Sto cercando un modo più rapido e complicato per moltiplicare due matrici 4×4 in C. La mia attuale ricerca è incentrata sull’assemblaggio x86-64 con estensioni SIMD. Finora, ho creato una funzione che è circa 6 volte più veloce di un’implementazione ingenua C, che ha superato le mie aspettative per il miglioramento delle prestazioni. Sfortunatamente, ciò […]
Sto calcolando otto prodotti punto in una sola volta con AVX. Nel mio codice attuale faccio qualcosa del genere (prima di srotolare): Ivy-Bridge / Sandy-Bridge __m256 areg0 = _mm256_set1_ps(a[m]); for(int i=0; i<n; i++) { __m256 breg0 = _mm256_load_ps(&b[8*i]); tmp0 = _mm256_add_ps(_mm256_mul_ps(arge0,breg0), tmp0); } Haswell __m256 areg0 = _mm256_set1_ps(a[m]); for(int i=0; i<n; i++) { __m256 breg0 […]
Sono nuovo all’ottimizzazione del codice con le istruzioni SSE / SSE2 e fino ad ora non sono arrivato molto lontano. A mia conoscenza, una funzione comune ottimizzata per SSE sarebbe simile a questa: void sse_func(const float* const ptr, int len){ if( ptr is aligned ) { for( … ){ // unroll loop by 4 or […]
Quali file di intestazione forniscono gli elementi intrinseci per le diverse estensioni del set di istruzioni SIMX x86 (MMX, SSE, AVX, …)? Sembra imansible trovare una tale lista online. Correggimi se sbaglio.
Sto cercando di trovare la riduzione della sum di 32 elementi (ogni 1 byte di dati) su un processore Intel i3. L’ho fatto: s=0; for (i=0; i<32; i++) { s = s + a[i]; } Tuttavia, richiede più tempo, poiché la mia applicazione è un’applicazione in tempo reale che richiede molto meno tempo. Si prega […]
Ho appena iniziato a utilizzare SSE e sono confuso su come ottenere il valore intero massimo ( max ) di un __m128i . Per esempio: __m128i t = _mm_setr_ps(0,1,2,3); // max(t) = 3; La ricerca in giro mi ha portato all’istruzione MAXPS ma non riesco a trovare come usarlo con “xmmintrin.h” . Inoltre, c’è qualche […]
Qualcuno sa di un riferimento che elenca il funzionamento delle funzioni intrinseche SSE per gcc, ovvero le funzioni nei file di intestazione ? Grazie.
Sto ymm problemi di allineamento durante l’utilizzo ymm registri ymm , con alcuni frammenti di codice che a me sembrano soddisfacenti. Ecco un esempio di lavoro minimo: #include #include inline void ones(float *a) { __m256 out_aligned = _mm256_set1_ps(1.0f); _mm256_store_ps(a,out_aligned); } int main() { size_t ss = 8; float *a = new float[ss]; ones(a); delete [] […]
Sto cercando alcuni consigli su come fare una sum di prefisso parallela con SSE. Sono interessato a farlo su una schiera di Ints, Floating o Double. Ho trovato due soluzioni. Un caso speciale e un caso generale. In entrambi i casi la soluzione viene eseguita sull’array in due passaggi in parallelo con OpenMP. Per il […]
SSE2 ha istruzioni per convertire i vettori tra float a precisione singola e interi a 32 bit. _mm_cvtps_epi32() _mm_cvtepi32_ps() Ma non ci sono equivalenti per la precisione doppia e gli interi a 64 bit. In altre parole, mancano: _mm_cvtpd_epi64() _mm_cvtepi64_pd() Sembra che AVX non li abbia neanche. Qual è il modo più efficace per simulare […]