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

loop

/Qpar (Parallelizzazione automatica)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

Altre risorse

Parallelizzi la programmazione in codice nativo

Vectorizer and Parallelizer Messages