Auto paralelização e vetorização automática
O Parallelizer automático e o automático Vectorizer são criados para fornecer ganhos automática de desempenho para loop no seu código.
Automático Parallelizer
A opção do compilador de /Qpar permite que o parallelization automática de loop no seu código.Quando você especificar este sinalizador sem alterar o código existente, o compilador avalia o código para localizar o loop que podem se beneficiar de parallelization.Como pode localizar os loops que não oferece muito trabalho e consequentemente não o tirarão beneficia do parallelization, e como cada parallelization desnecessário pode gerar desovar de um pool de segmento, de uma sincronização adicional, ou outro processamento que tenderia a diminuir o desempenho em vez de melhorar, o compilador é conservador em selecione o loop que parallelizes.Por exemplo, considere o seguinte exemplo no limite superior do loop não é conhecido em tempo de compilação:
void loop_test(int u) {
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Porque u pode ser um valor pequeno, o compilador não parallelize automaticamente este loop.No entanto, você pode ainda deseja parallelized porque você souber que u será sempre grande.Para ativar o parallelization automática, especifique loop de #pragma (hint_parallel (em))n , onde é o número de segmentos. a parallelize transversalmenteNo exemplo a seguir, o compilador tentará parallelize o loop através de 8 segmentos.
void loop_test(int u) {
#pragma loop(hint_parallel(8))
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Como com qualquer diretivas de pragma, a sintaxe alternativa __pragma(loop(hint_parallel(n))) de pragma também é suportado.
Há alguns loop que o compilador não pode parallelize mesmo se você deseja a.Aqui está um exemplo:
#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
A[i] = B[i] * C[i];
A função upper_bound() pode alterar cada vez que chamou.Porque o limite superior não pode ser conhecido, o compilador pode emitir uma mensagem de diagnóstico para explicar porque não pode parallelize este loop.O exemplo a seguir demonstra um loop que pode ser parallelized, um loop que não pode ser parallelized, a sintaxe do compilador para usar no prompt de comando, e a saída do compilador para cada opção de linha de 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;
}
}
Compilação usando este comando:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1
essas produz saída:
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
Compilação usando este comando:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2
essas produz saída:
--- 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'
Observe a diferença na saída entre as duas opções diferentes de /Qpar-report (Auto-Parallelizer Reporting Level) .mensagens de parallelizer de saída de**/Qpar-report:1** somente para os loops que parallelized com êxito.mensagens de parallelizer de saída de**/Qpar-report:2** para parallelizations com êxito e malsucedidos do loop.
Para obter mais informações sobre códigos e de mensagens de motivo, consulte Vectorizer and Parallelizer Messages.
Automático Vectorizer
O automático Vectorizer analisa loop no seu código, e usa os registros e instruções vetorial no seu computador, se ele pode executar.Isso pode melhorar o desempenho do seu código.O compilador utiliza as instruções e SSE2 em ou em processadores Intel de AMD, ou instruções DE NÉON em processadores de BRAÇO.O automático Vectorizer também usa a mais recente, instrução SSE4.2 definida se seus suporte de computador ele.
Por padrão, o automático Vectorizer está ativado.Se você deseja comparar o desempenho do seu código no vectorization, você pode usar loop de #pragma (no_vector) para desativar o vectorization de qualquer dado loop.
#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
A[i] = B[i] + C[i];
Como com qualquer diretivas de pragma, a sintaxe alternativa __pragma(loop(no_vector)) de pragma também é suportado.
Como com o automático Parallelizer, você pode especificar a opção de linha de comando de /Qvec-report (Auto-Vectorizer Reporting Level) relatar com êxito e em vão ou loop com êxito vectorized somente**/Qvec-report:1**— ou um loop vectorized**/Qvec-report:2**).
Para obter mais informações sobre códigos e de mensagens de motivo, consulte Vectorizer and Parallelizer Messages.
Para um exemplo que mostra como o vectorizer funciona na prática, consulte Parte 2 de O Austin de 6: Ondulação de página
Consulte também
Referência
/Qpar-report (Auto-Parallelizer Reporting Level)
/Qvec-report (Auto-Vectorizer Reporting Level)