Articles of sse

Efficiente moltiplicazione di matrice 4×4 (C vs assemblaggio)

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ò […]

Loop di srotolamento per raggiungere il massimo rendimento con Ivy Bridge e Haswell

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 […]

Come determinare se la memoria è allineata?

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 […]

File di intestazione per x86 SIMD intrinseca

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.

Somma riduzione dei byte senza segno senza overflow, utilizzando SSE2 su Intel

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 […]

Ottenendo il valore massimo in un vettore __m128i con SSE?

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 […]

Riferimento delle funzioni intrinseche SSE

Qualcuno sa di un riferimento che elenca il funzionamento delle funzioni intrinseche SSE per gcc, ovvero le funzioni nei file di intestazione ? Grazie.

Come risolvere il problema dell’allineamento a 32 byte per le operazioni di caricamento / archiviazione AVX?

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 [] […]

sum del prefisso parallelo (cumulativa) con SSE

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 […]

Come eseguire efficientemente conversioni double / int64 con SSE / AVX?

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 […]