Compartilhar via


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

loop

/ Qpar (Auto-Parallelizer)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

Outros recursos

Seja análogo a programação em código nativo

Vectorizer and Parallelizer Messages