Pregunta

Varias veces, he encontrado este término en matlab, fortran ... algún otro ... pero nunca he encontrado una explicación de qué significa y qué hace. Entonces, aquí pregunto qué es la vectorización y qué significa, por ejemplo, que "un ciclo está vectorizado". ?

¿Fue útil?

Solución

Muchas CPU tienen " vector " o "SIMD" conjuntos de instrucciones que aplican la misma operación simultáneamente a dos, cuatro o más piezas de datos. Los chips x86 modernos tienen las instrucciones SSE, muchos chips PPC tienen el "Altivec" instrucciones, e incluso algunos chips ARM tienen un conjunto de instrucciones vectoriales, llamado NEON.

" Vectorización " (simplificado) es el proceso de reescribir un bucle para que, en lugar de procesar un solo elemento de una matriz N veces, procese (digamos) 4 elementos de la matriz simultáneamente N / 4 veces.

(Elegí 4 porque es lo que es más probable que soporte directamente el hardware moderno; el término `` vectorización '' también se usa para describir una transformación de software de nivel superior en la que puede simplemente abstraer el bucle por completo y simplemente describir el funcionamiento en matrices en lugar de los elementos que los componen)


La diferencia entre vectorización y desenrollado de bucle: Considere el siguiente ciclo muy simple que agrega los elementos de dos matrices y almacena los resultados en una tercera matriz.

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

Desenrollar este bucle lo transformaría en algo como esto:

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

Vectorizarlo, por otro lado, produce algo como esto:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

Donde " addFourThingsAtOnceAndStoreResult " es un marcador de posición para cualquier intrínseco (s) que utiliza su compilador para especificar instrucciones vectoriales. Tenga en cuenta que algunos compiladores pueden vectorizar automáticamente bucles muy simples como este, que a menudo se pueden habilitar mediante una opción de compilación. Los algoritmos más complejos aún requieren la ayuda del programador para generar un buen código vectorial.

Otros consejos

Vectorización es el término para convertir un programa escalar en un programa vectorial. Los programas vectorizados pueden ejecutar múltiples operaciones desde una sola instrucción, mientras que el escalar solo puede operar en pares de operandos a la vez.

De wikipedia :

Enfoque escalar:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

Enfoque vectorizado:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}

Se refiere a la capacidad de realizar operaciones matemáticas individuales en una lista, o "vector". - de números en un solo paso. Lo ves a menudo con Fortran porque eso está asociado con la informática científica, que está asociada con la supercomputación, donde apareció por primera vez la aritmética vectorizada. Hoy en día, casi todas las CPU de escritorio ofrecen alguna forma de aritmética vectorizada, a través de tecnologías como el SSE de Intel. Las GPU también ofrecen una forma de aritmética vectorizada.

La

Vectorización se usa en gran medida en la informática científica, donde se deben procesar grandes cantidades de datos de manera eficiente.

En una aplicación de programación real, sé que se usa en NUMPY (no estoy seguro de otra cosa).

Numpy (paquete para computación científica en python), utiliza la vectorización para la manipulación rápida de la matriz n-dimensional, que generalmente es más lenta si se hace con las opciones de python incorporadas para manejar las matrices.

aunque hay muchas explicaciones, AQUÍ ESTÁ LO QUE VECTORIZACIÓN SE DEFINE COMO EN PÁGINA DE DOCUMENTACIÓN NUMPY

La vectorización describe la ausencia de cualquier bucle explícito, indexación, etc., en el código; estas cosas están ocurriendo, por supuesto, solo & # 8220; detrás de escena & # 8221; en código C optimizado y precompilado. El código vectorizado tiene muchas ventajas, entre las cuales se encuentran:

  1. el código vectorizado es más conciso y más fácil de leer

  2. menos líneas de código generalmente significan menos errores

  3. el código se parece más a la notación matemática estándar (lo que facilita, por lo general, codificar correctamente matemáticamente construcciones)

  4. La
  5. vectorización da como resultado más & # 8220; Pythonic & # 8221; código. Sin vectorización, nuestro código estaría lleno de ineficaces y difícil de leer para los bucles.

Vectorización, en palabras simples, significa optimizar el algoritmo para que pueda utilizar las instrucciones SIMD en los procesadores.

AVX, AVX2 y AVX512 son los conjuntos de instrucciones (intel) que realizan la misma operación en múltiples datos en una sola instrucción. por ej. AVX512 significa que puede operar con 16 valores enteros (4 bytes) a la vez. Lo que eso significa es que si tiene un vector de 16 enteros y desea duplicar ese valor en cada número entero y luego agregarle 10. Puede cargar valores en el registro general [a, b, c] 16 veces y realizar la misma operación o puede realizar la misma operación cargando los 16 valores en los registros SIMD [xmm, ymm] y realizar la operación una vez. Esto permite acelerar el cálculo de los datos vectoriales.

En vectorización usamos esto para nuestra ventaja, al remodelar nuestros datos para que podamos realizar operaciones SIMD en él y acelerar el programa.

El único problema con la vectorización son las condiciones de manejo. Porque las condiciones ramifican el flujo de ejecución. Esto se puede manejar enmascarando. Al modelar la condición en una operación aritmética. p.ej. si queremos agregar 10 al valor si es mayor que 100. también podemos.

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

o podemos modelar la condición en una operación aritmética creando un vector de condición c,

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

este es un ejemplo muy trivial aunque ... por lo tanto, c es nuestro vector de enmascaramiento que usamos para realizar operaciones binarias en función de su valor. Esto evita la ramificación del flujo de ejecución y permite la vectorización.

La vectorización es tan importante como la paralelización. Por lo tanto, debemos utilizarlo lo más posible. Todos los procesadores modernos tienen instrucciones SIMD para cargas de trabajo informáticas pesadas. Podemos optimizar nuestro código para usar estas instrucciones SIMD usando vectorización, esto es similar a la paralelización de nuestro código para que se ejecute en múltiples núcleos disponibles en procesadores modernos.

Me gustaría irme con la mención de OpenMP, que me permite vectorizar el código usando pragmas. Lo considero un buen punto de partida. Lo mismo puede decirse de OpenACC.

Ver las dos respuestas anteriores. Solo quería agregar que la razón para querer hacer la vectorización es que estas operaciones pueden realizarse fácilmente en paralelo por supercomputadoras y multiprocesadores, produciendo una gran ganancia de rendimiento. En las computadoras de un solo procesador no habrá ganancia de rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top