Procesador de vectores
Los procesadores vectoriales (también llamados computadoras vectoriales o procesadores de matriz ) realizan un cálculo en una gran cantidad de datos (en un vector o matriz ) al mismo tiempo . Si una gran cantidad de datos del mismo tipo se van a procesar de la misma manera (por ejemplo, en operaciones matriciales ), los procesadores vectoriales son muy superiores a los procesadores puramente de propósito general (por ejemplo, x86 ), que procesan todos los datos uno tras otro. Este es al menos el caso cuando la computadora vectorial también tiene acceso paralelo a la memoria principal .
Funcionalidad y campos de aplicación
Los procesadores vectoriales se utilizan principalmente en informática de alto rendimiento (HPC). Las supercomputadoras Cray usaban procesadores vectoriales. Los proveedores de computadoras vectoriales fueron NEC y Convex Computer Corporation , por ejemplo con la serie C38xx, que usaba tecnología de arseniuro de galio , o Fujitsu Siemens Computers con su serie VPP.
En las aplicaciones de HPC en particular, a menudo hay muchos del mismo tipo de datos que deben procesarse de manera similar, por ejemplo, en simulaciones en meteorología y geología, donde a menudo se utilizan computadoras vectoriales.
Las computadoras vectoriales se han enfrentado a una gran competencia en los últimos años por parte de los clústeres de computación construidos en paralelo y compuestos por muchos miles de procesadores estándar. Al recurrir a componentes estándar que están muy extendidos más allá del sector HPC, se pueden ahorrar costos, especialmente porque estos procesadores estándar se han vuelto muy poderosos debido al intenso desarrollo tecnológico. La informática distribuida es incluso más barata .
Debido a las ventajas que resultan de la ejecución simultánea de una operación aritmética sobre varios datos (instrucción única, datos múltiples, SIMD ), los procesadores estándar también se han expandido a la arquitectura respectiva desde la década de 1990 para acelerar este tipo de cálculo. Consulte Arquitectura del procesador x86 o AltiVec para procesadores PowerPC .
Además de las aplicaciones mencionadas anteriormente para procesadores vectoriales, la simulación gráfica también es una de las principales aplicaciones. Los juegos 3D complejos, en particular, requieren una enorme cantidad de cálculos (operaciones matriciales en coordenadas 3D, suavizado de la salida de la pantalla) en grandes cantidades de datos, por lo que los procesadores gráficos actuales son muy similares a los procesadores vectoriales puros.
Procesador de vectores en el trabajo
Ejemplo de arquitectura MIPS
Se utiliza un ejemplo sencillo para mostrar la diferencia entre un procesador escalar y uno vectorial.
X e Y son dos vectores de igual longitud y a es una cantidad escalar. Este problema se resuelve en procesadores escalares mediante un bucle. El mismo bucle también se utiliza en el punto de referencia LINPACK para determinar el rendimiento de las computadoras probadas. En la sintaxis de C, se ve así:
for (i = 0; i < 64; i++)
Y[i] = a * X[i] + Y[i];
Se supone aquí que los vectores constan de 64 elementos.
En el código MIPS , este fragmento de programa se ve así:
L.D F0, a ; Skalar a laden
DADDIU R4, Rx, #512 ; letzte Adresse 512/8 = 64
Loop: L.D F2, 0(Rx) ; X(i) laden
MUL.D F2, F2, F0 ; a * X(i)
L.D F4, 0(Ry) ; Y(i) laden
ADD.D F4, F4, F2 ; a * X(i) + Y(i)
S.D 0(Ry), F4 ; Y(i) speichern
DADDIU Rx, Rx, #8 ; Index (i) von X inkrementieren
DADDIU Ry, Ry, #8 ; Index (i) von Y inkrementieren
DSUBU R20, R4, Rx ; Rand berechnen
BNEZ R20, Loop ; wenn 0, dann fertig
En el código VMIPS , sin embargo, se ve así:
L.D F0, a ; Skalar a laden
LV V1, Rx ; Vektor X laden
MULVS.D V2, V1, F0 ; Vektor-Skalar-Multiplikation
LV V3, Ry ; Vektor Y laden
ADDV.D V4, V2, V3 ; Vektor-Addition
SV Ry, V4 ; Resultat speichern
Este ejemplo muestra la eficacia con la que el procesador vectorial resuelve la tarea. Con VMIPS, seis comandos son suficientes, mientras que con MIPS 64 * 9 + 2 = 578 comandos se ejecutan. Principalmente no hay bucle. Con VMIPS, solo una fracción de los comandos deben recuperarse de la memoria y decodificarse.
En la arquitectura MIPS, las multiplicaciones y adiciones se realizan alternativamente, es decir, la suma siempre debe esperar a la multiplicación más lenta. En la calculadora de vectores, sin embargo, todas las multiplicaciones independientes se llevan a cabo primero y luego todas las sumas dependientes. Ésta es otra diferencia significativa.
Ejemplo de una arquitectura x86, incrustada en lenguaje de alto nivel
Un ejemplo actual de la arquitectura del procesador x86 que utiliza la extensión de instrucción SSE . El ejemplo muestra el punto flotante multiplicador vectorizado - Arrays de precisión simple. El código fuente que se muestra está escrito en el lenguaje de alto nivel "C" , con partes esenciales del ensamblador en línea (sintaxis Intel), que se pueden compilar directamente con GCC .
//SSE-Funktion zum vektorisierten Multiplizieren von 2 Arrays mit Single-precision-Gleitkommazahlen
//Erster Parameter Zeiger auf Ziel/Quellarray, zweiter Parameter 2. Quellarray, dritter Parameter Anzahl der Gleitkommazahlen in jedem Array
//32-Bit-Version
void mul_asm(float* out, float* in, unsigned int leng)
{
unsigned int count, rest;
rest = (leng*4)%16;
count = (leng*4)-rest;
if (count>0){
// vectorized part; 4 floats per loop iteration
__asm __volatile__ (".intel_syntax noprefix\n\t"
"loop: \n\t"
"movups xmm0,[ebx+ecx] ;loads 4 floats in first register (xmm0)\n\t"
"movups xmm1,[eax+ecx] ;loads 4 floats in second register (xmm1)\n\t"
"mulps xmm0,xmm1 ;multiplies both vector registers\n\t"
"movups [eax+ecx],xmm0 ;write back the result to memory\n\t"
"sub ecx,16 ;increase address pointer by 4 floats\n\t"
"jnz loop \n\t"
".att_syntax prefix \n\t"
: : "a" (out), "b" (in), "c"(count), "d"(rest): "xmm0","xmm1");
}
// scalar part; 1 float per loop iteration
if (rest!=0)
{
__asm __volatile__ (".intel_syntax noprefix\n\t"
"add eax,ecx \n\t"
"add ebx,ecx \n\t"
"rest: \n\t"
"movss xmm0,[ebx+edx] ;load 1 float in first register (xmm0)\n\t"
"movss xmm1,[eax+edx] ;load 1 float in second register (xmm1)\n\t"
"mulss xmm0,xmm1 ;multiplies both scalar registers\n\t"
"movss [eax+edx],xmm0 ;write back the result\n\t"
"sub edx,4 \n\t"
"jnz rest \n\t"
".att_syntax prefix \n\t"
: : "a" (out), "b" (in), "c"(count), "d"(rest): "xmm0","xmm1");
}
return;
}
Programación de procesadores vectoriales con lenguajes de programación de alto nivel
El ejemplo anterior está codificado directamente en lenguaje de máquina, que ya no es común hoy en día, pero definitivamente es posible (SIMD Intrinsics o partes de código de ensamblador en línea). Las arquitecturas con instrucciones especiales de máquina para vectores requieren el apoyo de
- paralelizar compiladores (es decir, aquellos que pueden convertir un ciclo completo en el código fuente en una instrucción de cálculo SIMD)
- una extensión de idioma para generar las funciones de matriz
- o al menos a través de funciones especiales de biblioteca
Al menos en los dos últimos casos, el desarrollador de software debe conocer definitivamente la arquitectura y luego usar las funciones especiales para usar el procesamiento vectorial.
Ver también
- Clasificación de Flynn
- Computadora en paralelo : procesamiento de datos en CPU distribuidas
- Computación de propósito general en la unidad de procesamiento de gráficos
- Unidad de procesamiento de TensorFlow
enlaces web
- Instrucciones para la programación vectorial ( Memento del 6 de noviembre de 2013 en el Archivo de Internet ) (PDF; 1.03 MB) Cray Research (Inglés)
- HiCoVec ( Memento del 10 de julio de 2010 en Internet Archive ) Procesador vectorial configurable de código abierto del HS Augsburg