Procesador de vectores

Placa de procesador de una computadora vectorial CRAY-YMP

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

enlaces web