Articles of sse

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

Come implementare atoi usando SIMD?

Mi piacerebbe provare a scrivere un’implementazione di atoi usando le istruzioni SIMD, da includere in RapidJSON (una libreria di lettori / scrittori JSON C ++). Attualmente ha alcune ottimizzazioni SSE2 e SSE4.2 in altri luoghi. Se si tratta di un guadagno di velocità, è ansible eseguire più risultati atoi in parallelo. Le stringhe provengono originariamente […]

Carichi non temporali e prefetcher dell’hardware, funzionano insieme?

Quando si esegue una serie di chiamate _mm_stream_load_si128() ( MOVNTDQA ) da posizioni di memoria consecutive, il pre-fetcher hardware può ancora kick-in, o dovrei usare il prefetching del software esplicito (con suggerimento NTA) per ottenere i benefici del prefetching mentre ancora evitando l’inquinamento della cache? Il motivo per cui lo chiedo è perché i loro […]

Perché SSE scalare sqrt (x) più lento di rsqrt (x) * x?

Ho analizzato alcuni dei nostri calcoli di base su un Intel Core Duo e, osservando vari approcci alla radice quadrata, ho notato qualcosa di strano: usando le operazioni scalari SSE, è più veloce prendere una radice quadrata reciproca e moltiplicarla per ottenere lo sqrt, piuttosto che usare l’opcode nativo di sqrt! Lo sto testando con […]

Efficiente moltiplicazione del vettore a matrice 4×4 con SSE: prodotto orizzontale add e dot: qual è il punto?

Sto cercando di trovare l’implementazione più efficiente della moltiplicazione di matrice 4×4 (M) con un vettore (u) usando SSE. Intendo Mu = v. Per quanto ho capito, ci sono due modi principali per farlo: method 1) v1 = dot(row1, u), v2 = dot(row2, u), v3 = dot(row3, u), v4 = dot(row4, u) method 2) v […]

Qual è il significato degli accessi di memoria “non temporali” in x86

Questa è una domanda un po ‘di basso livello. Nell’assembly x86 ci sono due istruzioni SSE: MOVDQA xmmi, m128 e MOVNTDQA xmmi, m128 Il Manuale dello sviluppatore del software IA-32 dice che l’ NT in MOVNTDQA sta per Non Temporal , e che altrimenti è lo stesso di MOVDQA. La mia domanda è, cosa significa […]

Perché questo codice SSE è 6 volte più lento senza VZEROUPPER su Skylake?

Ho cercato di capire un problema di prestazioni in un’applicazione e ho finalmente ridotto il problema a un problema davvero strano. Il seguente pezzo di codice viene eseguito 6 volte più lentamente su una CPU Skylake (i5-6500) se l’istruzione VZEROUPPER è commentata. Ho testato le CPU Sandy Bridge e Ivy Bridge ed entrambe le versioni […]

Come verificare se una CPU supporta il set di istruzioni SSE3?

Il seguente codice è valido per verificare se una CPU supporta il set di istruzioni SSE3? L’utilizzo della funzione IsProcessorFeaturePresent() non funziona su Windows XP (consultare http://msdn.microsoft.com/en-us/library/ms724482(v=vs.85).aspx ). bool CheckSSE3() { int CPUInfo[4] = {-1}; //– Get number of valid info ids __cpuid(CPUInfo, 0); int nIds = CPUInfo[0]; //– Get info for id “1” if […]

Istruzioni SSE: quali CPU possono eseguire operazioni di memoria atomica a 16B?

Considerare un’istruzione SSE a singola memoria (a lettura singola o singola scrittura, non lettura + scrittura) su una CPU x86. L’istruzione accede a 16 byte (128 bit) di memoria e la posizione di memoria accessibile è allineata a 16 byte. Il documento “White paper di ordinazione della memoria di architettura Intel® 64” afferma che per […]

Quali sono le migliori sequenze di istruzioni per generare costanti vettoriali al volo?

“Migliore” indica il minor numero di istruzioni (o il minor numero di Uops, se le istruzioni decodificano a più di un UOP). La dimensione del codice macchina in byte è un tie-breaker per un numero uguale di insn. La generazione costante è per sua natura l’inizio di una nuova catena di dipendenze, quindi è insolito […]