Che cos'è SIMD?
SIMD (Single Instruction Multiple Data) è un set di istruzioni disponibile principalmente su tutti i processori attuali. Le istruzioni SIMD danno un parallelismo a livello di dati su un'unità (vettore di dati). Una singola istruzione viene eseguita in parallelo su più punti dati invece di eseguire più istruzioni. Questo migliora le prestazioni dell'applicazione.
Considerate due array A e B che memorizzano numeri interi. Volete sommare gli elementi corrispondenti in A e B e memorizzare i risultati nell'array C:
qualcosa come C[i] = A[i] + B[i] in un ciclo.
In ogni iterazione del ciclo ci saranno 2 istruzioni load, 1 store e 1 add. Sto ovviamente sorvolando sugli effetti della cache della CPU per spiegare l'argomento.
Fare lo stesso lavoro sfruttando il set di istruzioni SIMD richiederà meno istruzioni della CPU poiché ogni istruzione elaborerà più elementi. Per essere specifici, con il set di istruzioni SIMD che ha un registro a 128 bit, possiamo fare l'elaborazione su 4 interi alla volta:
- Una singola istruzione load per ottenere 4 valori di A in un registro SIMD a 128 bit
- Una singola istruzione load per ottenere 4 valori di B in un registro SIMD a 128 bit
- Una singola istruzione add per aggiungere i valori corrispondenti in entrambi i registri.
La programmazione basata su SIMD è spesso indicata come vettorizzazione. Ci sono diversi set di istruzioni SIMD (o loro estensioni) disponibili: SSE, SSE2, SSE3, AVX. Leggete questo link per maggiori dettagli: Classi C++ e operazioni SIMD
Non è molto semplice scrivere codice che sfrutti il set di istruzioni SIMD. O scriviamo il codice in modo che il compilatore sia in grado di vettorizzare e quindi usi automaticamente le istruzioni SIMD fornite dall'architettura o scriviamo codice assembly con il set di istruzioni SIMD richiesto. Tuttavia, Intel ha pubblicato un manuale per utilizzare le intrinseche del compilatore nei programmi C/C++ per sfruttare i set di istruzioni SIMD. Inoltre, potete trovare maggiori informazioni qui sulle estensioni fornite da Intel a SSE (Streaming SIMD Extensions).
Questo è un buon articolo sulla programmazione SIMD usando le istruzioni vettoriali Intel AVX e AVX2. Si noti che Intel ha ora AVX512 che aumenta il parallelismo e le prestazioni fornendo registri SIMD più grandi (512 bit di larghezza).
AFAIK, le capacità delle istruzioni SIMD sono state originariamente sfruttate nella programmazione grafica, nell'elaborazione delle immagini e nei campi correlati. Ora troviamo un uso esteso dell'elaborazione SIMD nei database (in particolare nei motori a colonne), nell'apprendimento profondo su CPU e GPU.
Articoli simili
- Cos'è un file .dex? Cos'è dexopt? Che cos'è odex? Cos'è dexoat? Cos'è ELF? Come funziona tutto questo?
- Cos'è il mio numero SMS? Che cos'è l'SMS? Come faccio a sapere se ce l'ho o no?
- Cos'è un discord bot? Cos'è un server discord?
- Che cos'è questo tipo di fotocamera f/2.2 che sta spuntando sugli smartphone?