Articles of sse

Veloce vettorizzazione rsqrt e reciproca con SSE / AVX in base alla precisione

Supponiamo che sia necessario calcolare la radice quadrata reciproca o reciproca per i dati in virgola mobile impacchettati. Entrambi possono essere facilmente eseguiti da: __m128 recip_float4_ieee(__m128 x) { return _mm_div_ps(_mm_set1_ps(1.0f), x); } __m128 rsqrt_float4_ieee(__m128 x) { return _mm_div_ps(_mm_set1_ps(1.0f), _mm_sqrt_ps(x)); } Funziona perfettamente ma lentamente: secondo la guida , eseguono 14 e 28 cicli su Sandy […]

Come utilizzare le istruzioni Fused Multiply-Add (FMA) con SSE / AVX

Ho appreso che alcune CPU Intel / AMD possono moltiplicare e aggiungere simultaneamente con SSE / AVX: FLOP per ciclo per sandy-bridge e haswell SSE2 / AVX / AVX2 . Mi piace sapere come farlo al meglio nel codice e voglio anche sapere come è fatto internamente nella CPU. Intendo con l’architettura super-scalare. Diciamo che […]

SSE, intrinseca e allineamento

Ho scritto una class vettoriale 3D usando molti intrinseci del compilatore SSE. Tutto ha funzionato bene fino a quando ho iniziato a instaziare classi con il vettore 3D come membro con nuovo. Ho avuto incidenti anomali in modalità di rilascio, ma non in modalità di debug e viceversa. Così ho letto alcuni articoli e ho […]

Utilizzo delle istruzioni della CPU AVX: scarse prestazioni senza “/ arch: AVX”

Il mio codice C ++ utilizza SSE e ora voglio migliorarlo per supportare AVX quando è disponibile. Quindi rilevo quando AVX è disponibile e chiama una funzione che utilizza i comandi AVX. Io uso Win7 SP1 + VS2010 SP1 e una CPU con AVX. Per utilizzare AVX, è necessario includere questo: #include “immintrin.h” e quindi […]

Come unire uno scalare in un vettore senza che il compilatore sprechi un’istruzione che azzeri gli elementi superiori? Limitazione del design negli intrinsechi di Intel?

Non ho in mente un particolare caso d’uso; Sto chiedendo se questo è davvero un difetto di progettazione / limitazione dell’intrinseca Intel o se mi manca qualcosa. Se si desidera combinare un float scalare con un vettore esistente, non sembra esserci un modo per farlo senza l’azzeramento degli elementi alti o la trasmissione dello scalare […]

Divisione intero SSE?

C’è _mm_div_ps per la divisione dei valori in virgola mobile, c‘è _mm_mullo_epi16 per la moltiplicazione dei numeri interi. Ma c’è qualcosa per la divisione intera (valore a 16 bit)? Come posso condurre una tale divisione?

Somma prefisso SIMD su CPU Intel

Devo implementare un algoritmo di sum di prefisso e avrei bisogno che fosse il più veloce ansible. Ex: [3, 1, 7, 0, 4, 1, 6, 3] should give [3, 4, 11, 11, 15, 16, 22, 25] C’è un modo per farlo usando le istruzioni della cpu SSE / mmx / SIMD? La mia prima idea […]

Il modo più veloce per calcolare il valore assoluto usando SSE

Sono a conoscenza di 3 metodi, ma per quanto ne so, solo i primi 2 sono generalmente utilizzati: 1) Maschera il bit del segno usando andps o andnotps . Pro: un’istruzione veloce se la maschera è già in un registro, il che lo rende perfetto per farlo più volte in un ciclo. Contro: La maschera […]

I compilatori JIT di JVM generano codice che utilizza istruzioni in virgola mobile vettorizzate?

Diciamo che il collo di bottiglia del mio programma Java è davvero uno strettissimo loop per calcolare una serie di prodotti con punti vettoriali. Sì, ho profilato, sì è il collo di bottiglia, sì è significativo, sì è proprio come è l’algoritmo, sì, ho eseguito Proguard per ottimizzare il codice byte, ecc. Il lavoro è, […]

Vettorizzazione con buffer non allineati: utilizzando VMASKMOVPS: generazione di una maschera da un conteggio disallineamento? O non usare affatto quell’Inn

gcc 5.3 con -O3 -mavx -mtune=haswell per x86-64 rende il codice sorprendentemente ingombrante per gestire input potenzialmente disallineati per codice come: // convenient simple example of compiler input // I’m not actually interested in this for any real program void floatmul(float *a) { for (int i=0; i<1024 ; i++) a[i] *= 2; } clang utilizza […]