2009-10-04 11 views
20

È una buona idea per vettorializzare il codice? Quali sono le buone pratiche in termini di quando farlo? Cosa succede sotto?Cosa significa vectorization?

+4

Vedere anche: http://stackoverflow.com/questions/1422149/what-is-vectorization/ –

risposta

35

Vectorization significa che il compilatore rileva che le istruzioni indipendenti possono essere eseguite come un'istruzione SIMD. esempio usuale è che se fai qualcosa come

for(i=0; i<N; i++){ 
    a[i] = a[i] + b[i]; 
} 

Sarà vettorializzato come (usando notazione vettoriale)

for (i=0; i<(N-N%VF); i+=VF){ 
    a[i:i+VF] = a[i:i+VF] + b[i:i+VF]; 
} 

Fondamentalmente il compilatore sceglie un'operazione che può essere fatto su elementi VF della matrice a allo stesso tempo e fa questo N/VF volte invece di fare la singola operazione N volte.

Aumenta le prestazioni, ma richiede più requisiti per l'architettura.

+3

Quindi c'è qualcosa che un programmatore può fare per garantire la vettorizzazione (a parte l'attivazione dell'ottimizzazione)? – Jacob

+1

Per quanto ne so, i compilatori sono limitati in auto-vettorizzazione, quindi la soluzione migliore è mantenere il codice quanto più semplice possibile. Inoltre è possibile controllare il codice assembly generato per vedere se il compilatore è stato vettorizzato o meno. – Zed

+1

@jacob: non puoi davvero "assicurarlo", potresti dare un'occhiata a http://openmp.org/ per il metodo che dice esplicitamente al compilatore di vettorializzare. –

3

È la generazione del codice SSE.

Si dispone di un ciclo con codice a matrice mobile nella matrice1 [i] [j] + matrice2 [i] [j] e il compilatore genera il codice SSE.

+1

SEE non è l'unico set di istruzioni vettoriali. PPC ha Altivec e altre architetture hanno le proprie istruzioni vettoriali pure. – Amok

11

Come menzionato sopra, vettorizzazione è usato per fare uso di istruzioni SIMD, che possono eseguire operazioni identiche di dati diversi confezionati in grandi registri.

Una linea guida generica per consentire a un compilatore di autovectorizzare un ciclo è di garantire che non vi siano elementi di flusso e anti-dipendenze in bianco e nero in diverse iterazioni di un ciclo.

http://en.wikipedia.org/wiki/Data_dependency

Alcuni compilatori come l'Intel C++/Fortran compilatori sono in grado di codice autovectorizing. Nel caso in cui non fosse in grado di vettorizzare un ciclo, il compilatore Intel è in grado di segnalare perché non è stato in grado di farlo. Ci I report possono essere utilizzati per modificare il codice in modo tale che diventa vectorizable (ammesso che sia possibile)

dipendenze sono coperti in modo approfondito nel libro 'compilatori ottimizzanti per architetture moderne: un approccio dipendenza a base di'

3

Vettorizzazione necessità non essere limitato al singolo registro che può contenere grandi dati. Come usare il registro di bit '128' per contenere i dati di '4 x 32' bit. Dipende dai limiti architettonici. Alcune architetture hanno diverse unità di esecuzione che hanno i loro registri. In tal caso, una parte dei dati può essere alimentata a quell'unità di esecuzione e il risultato può essere preso da un registro corrispondente a quell'unità di esecuzione.

Ad esempio, considerare il caso seguente.

for (i = 0; i < N; i ++) {

a [i] = a [i] + b [i];
}



Se sto lavorando su un'architettura che ha due unità di esecuzione, quindi il mio numero vettore è definito come due. Il ciclo di cui sopra verrà riformulata come

for (i = 0; i < (N/2); i + = 2)
{
a [i] = a [i] + b [i ];


a [i + 1] = a [i + 1] + b [i + 1];
}

NOTA: Il 2 all'interno dell'istruzione for deriva dalla dimensione del vettore.

Dato che ho due unità di esecuzione, le due istruzioni all'interno del ciclo verranno inserite nelle due unità di esecuzione. La somma verrà accumulata separatamente nelle unità di esecuzione. Infine verrà eseguita la somma dei valori accumulati (da due unità di esecuzione).

Le buone pratiche sono
1. I vincoli come la dipendenza (tra diverse iterazioni del ciclo) devono essere controllati prima di vettorializzare il ciclo.
2. Le chiamate di funzione devono essere prevenute.
3. L'accesso al puntatore può creare aliasing e deve essere prevenuto.