Compartir a través de


Auto - Parallelization y Automático - Vectorization

Auto - Parallelizer y automático - Vectorizer están diseñadas para proporcionar mejoras automáticos de rendimiento de los bucles en el código.

Auto-Parallelizer

El modificador del compilador /Qpar habilita la ejecución automática de bucles en el código.Cuando especifica este marcador sin cambiar el código existente, el compilador evalúa el código para buscar los bucles que podrían beneficiarse de la paralelización.Porque puede producirse los bucles que no hacen mucho trabajo y por tanto no se beneficiarán de la paralelización, y que cada paralelización innecesaria puede engendrar todos generar threadpool, de sincronización adicional, u otro procesamiento que tendería el rendimiento lento en lugar de mejorarlo, el compilador es conservador en la selección de los bucles en paralelo.Por ejemplo, considere el siguiente ejemplo en el que el límite superior del bucle no se conoce en tiempo de compilación:

void loop_test(int u) {
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

Dado que u puede ser un valor pequeño, el compilador automáticamente no paralelizará este bucle.Sin embargo, es posible que todavía se desee paralelizó porque sabe que u siempre será grande.Para habilitar la auto- paralelización, especifique bucle #pragma (hint_parallel (n)), donde es el número n de subprocesos a paralelizar a través de.En el ejemplo siguiente, el compilador intentará paralelizar el bucle entre 8 subprocesos.

void loop_test(int u) {
#pragma loop(hint_parallel(8))
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

Como con todo el directivas de pragma, la sintaxis alternativa __pragma(loop(hint_parallel(n))) de pragma también se admite.

Hay algunos bucles que el compilador no puede paralelizar incluso si lo desea.A continuación se muestra un ejemplo:

#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
    A[i] = B[i] * C[i];

La función upper_bound() puede cambiar cada vez que se denomina.Como el límite superior no puede ser conocido, el compilador puede emitir un mensaje de diagnóstico que explica por qué no se puede ejecutar este bucle.El ejemplo siguiente se muestra un bucle que se puede ejecutar en paralelo, un bucle que no se puede ejecutar en paralelo, la sintaxis del compilador para utilizar en el símbolo del sistema, y el compilador generado para cada opción de línea de comandos:

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;
    }
}

Compilación mediante este comando:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1

hace que este resultado:

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized

Compilación mediante este comando:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2

hace que este resultado:

--- 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 la diferencia entre las dos opciones diferentes de /Qpar-report (Auto-Parallelizer Reporting Level)./Qpar-report:1 genera mensajes de parallelizer sólo para bucles que se paralelizan correctamente./Qpar-report:2 generan mensajes de parallelizer para las paralelizaciones correctas e incorrectas del bucle.

Para obtener más información sobre los códigos de causa y mensajes, vea Vectorizer and Parallelizer Messages.

Auto-Vectorizer

Auto - Vectorizer analiza bucles en el código, y utiliza los registros y las instrucciones de vector en el equipo de ejecutarlas, si puede.Esto puede mejorar el rendimiento del código.El compilador tiene como destino las instrucciones SSE2 de Intel o los procesadores de AMD, o instrucciones de NEON en procesadores de ARM.Auto - Vectorizer también utiliza según el nuevo, conjunto de instrucciones SSE4.2 si la informáticos él.

De forma predeterminada, se habilita el auto-Vectorizer.Si desea comparar el rendimiento del código en el vectorization, puede utilizar bucle #pragma (no_vector) para deshabilitar el vectorization de cualquier bucle especificado.

#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
   A[i] = B[i] + C[i];

Como con todo el directivas de pragma, la sintaxis alternativa __pragma(loop(no_vector)) de pragma también se admite.

Como con el auto - Parallelizer, puede especificar la opción de línea de comandos /Qvec-report (Auto-Vectorizer Reporting Level) de señalar a cualquiera correctamente los bucles vectorizados sólo /Qvec-report:1— o correctamente y correctamente los bucles vectorizados /Qvec-report:2).

Para obtener más información sobre los códigos de causa y mensajes, vea Vectorizer and Parallelizer Messages.

Para obtener un ejemplo que muestra cómo funciona el vectorizer en la práctica, vea Proyecto Austin Parte 2 de 6: El encresparse de la página

Vea también

Referencia

loop

/Qpar (Paralelizador automático)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

Otros recursos

Programación paralela en código nativo

Vectorizer and Parallelizer Messages