La parallelizzazione e Automatico - Vectorization
Auto - Parallelizer e auto - Vectorizer sono progettate per fornire i vantaggi automatici di prestazioni per i cicli nel codice.
- Parallelizer auto
L'opzione del compilatore di /Qpar abilita la parallelizzazione automatico dei cicli nel codice.Quando si specifica questo flag senza modificare il codice esistente, il compilatore restituisce il codice per trovare i cicli che potrebbero trarre vantaggio da parallelizzare.Poiché potrebbe trovare i cicli non ne molto lavoro e pertanto non possono risultare dalla parallelizzazione e poiché ogni parallelizzazione non può generare la generazione di un pool di thread, una sincronizzazione aggiuntiva, o di un'altra attività di tenderebbe a rallentare le prestazioni anziché miglioramento, il compilatore è conservativo di selezione dei cicli che parallelizza automaticamente.Ad esempio, si consideri il seguente esempio in cui il limite superiore del ciclo non è noto in fase di compilazione:
void loop_test(int u) {
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Poiché u potrebbe essere un valore piccolo, il compilatore non disporrà automaticamente nel ciclo.Tuttavia, è ancora desiderarlo è parallelizzato poiché è noto che u sarà sempre maggiore.Per abilitare l'avvio automatico parallelizzazione, specificare ciclo #pragma (hint_parallel (n)), dove n è il numero di thread da parallelizzare tramite.Nell'esempio seguente, il compilatore tenterà di parallelizzare il ciclo oltre 8 thread.
void loop_test(int u) {
#pragma loop(hint_parallel(8))
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Come con qualsiasi direttive pragma, la sintassi alternativa __pragma(loop(hint_parallel(n))) di pragma è supportata.
Esistono alcuni cicli che il compilatore non è parallelizzare anche se lo si desidera.Di seguito è riportato un esempio:
#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
A[i] = B[i] * C[i];
La funzione upper_bound() può variare ogni volta che ha chiamato.Poiché il limite superiore non può essere noto, il compilatore generi un messaggio di diagnostica che viene spiegato perché non è possibile parallelizzare il ciclo.Nell'esempio seguente viene illustrato un ciclo che può essere parallelizzata, un ciclo che non può essere parallelizzata, la sintassi del compilatore per utilizzare il prompt dei comandi e l'output del compilatore per ogni opzione della riga di comando:
int A[1000];
void test() {
#pragma loop(hint_parallel(0))
for (int i=0; i<1000; ++i) {
A[i] = A[i] + 1;
}
for (int i=1000; i<2000; ++i) {
A[i] = A[i] + 1;
}
}
Compilando con questo comando:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1
semplifica questa restituiscono:
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
Compilando con questo comando:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2
semplifica questa restituiscono:
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'
Si noti la differenza nell'output tra le due diverse opzioni di /Qpar-report (Auto-Parallelizer Reporting Level)./Qpar-report:1 restituisce i messaggi di parallelizer solo per i cicli con i quali è disposti in parallelo./Qpar-report:2 restituisce i messaggi di parallelizer sia per i test superati non riusciti la parallelizzazione del ciclo.
Per ulteriori informazioni sui codici e i messaggi di motivo, vedere Vectorizer and Parallelizer Messages.
- Vectorizer auto
Auto - Vectorizer analizza i cicli nel codice che utilizza i registri e istruzioni vettoriale nel computer eseguirli, se possibile.Ciò può migliorare le prestazioni del codice.Il compilatore ha SSE2 in Intel o processori AMD, o istruzioni ATTIVITÀ NEON su processori del monitoraggio ARM.Auto - Vectorizer viene utilizzato il più recente, le istruzioni SSE4.2 impostate se i supporti computer.
Per impostazione predefinita, il ridimensionamento automatico - Vectorizer è abilitata.Se si desidera confrontare le prestazioni del codice nel vectorization, è possibile utilizzare ciclo #pragma (no_vector) per disabilitare il vectorization del ciclo specificato.
#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
A[i] = B[i] + C[i];
Come con qualsiasi direttive pragma, la sintassi alternativa __pragma(loop(no_vector)) di pragma è supportata.
Come con auto - Parallelizer, è possibile specificare l'opzione della riga di comando di /Qvec-report (Auto-Vectorizer Reporting Level) segnalare o cicli correttamente vectorized solo**/Qvec-report:1**— sia corretto o che non riuscita cicli vectorized**/Qvec-report:2**).
Per ulteriori informazioni sui codici e i messaggi di motivo, vedere Vectorizer and Parallelizer Messages.
Per un esempio in cui viene illustrato come il vectorizer funziona in pratica, vedere Una parte 2 di Austin di progetto a 6: Arricciatura della pagina
Vedere anche
Riferimenti
/Qpar (Parallelizzazione automatica)
/Qpar-report (Auto-Parallelizer Reporting Level)
/Qvec-report (Auto-Vectorizer Reporting Level)