2.2: Procesamiento de vectores cortos (Operaciones multimedia)
- Page ID
- 154348
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Introducción
Esta sección introduce al alumno al procesamiento de vectores cortos (operaciones multimedia) que inicialmente se desarrolló para aplicaciones de supercomputación. Hoy es importante para las operaciones multimedia.
Detalles de la actividad
Procesador vectorial
También se llama procesador de matriz y es una unidad central de procesamiento (CPU) que implementa un conjunto de instrucciones que contiene instrucciones que operan en matrices unidimensionales de datos llamadas vectores, en comparación con los procesadores escalares, cuyas instrucciones operan en elementos de datos individuales. Los procesadores vectoriales pueden mejorar en gran medida el rendimiento en ciertas cargas de trabajo, especialmente la simulación numérica y tareas similares.
Comúnmente se les llama supercomputadoras, los procesadores vectoriales son máquinas construidas principalmente para manejar grandes cálculos científicos y de ingeniería. Su rendimiento deriva de una arquitectura fuertemente canalizada que las operaciones en vectores y matrices pueden explotar de manera eficiente.
Los procesadores vectoriales tienen operaciones de alto nivel que funcionan en matrices lineales de números: “vectores”.
Propiedades de Procesadores Vectoriales
los procesadores vectoriales tienen las siguientes propiedades;
- La instrucción de un solo vector implica mucho trabajo (bucle), es decir, tiene menos búsquedas de instrucciones
- Cada resultado independiente del resultado anterior.
a. Se pueden ejecutar múltiples operaciones en paralelo
b. Diseño más simple, alta frecuencia de reloj
c. El compilador (programador) garantiza que no haya dependencias - Reduce los problemas de sucursales y sucursales en tuberías
- Las instrucciones vectoriales acceden a la memoria con patrón
conocido a. Prefetching efectivo
b. Amortizar la latencia de memoria de más de un gran número de elementos
c. Puede explotar un sistema de memoria de alto ancho de banda
d. ¡No se requieren caches (de datos)!
Estilos de Arquitecturas Vectoriales
Son de dos estilos
- Procesadores vectoriales de memoria
a. Todas las operaciones vectoriales son de memoria a memoria
- Procesadores de registro vectorial
- Todas las operaciones vectoriales entre registros vectoriales (excepto carga vectorial y almacenamiento)
- Equivalente vectorial de arquitecturas de almacén de carga
- Incluye todas las máquinas vectoriales desde finales de los 80
- Asumimos vector-registro para el resto de la conferencia
Componentes de un procesador vectorial
- CPU escalar: registros, rutas de datos, lógica de búsqueda de instrucciones
- Registro vectorial
- Banco de memoria de longitud fija que contiene un solo vector
- Normalmente 8-32 registros vectoriales, cada uno con 1 a 8 Kbits
- Tiene al menos 2 puertos de lectura y 1 de escritura
- MM: Se puede ver como una matriz de elementos 64b, 32b, 16b u 8b
- Unidades funcionales vectoriales (UF)
- Completamente canalizado, comienza una nueva operación cada reloj
- Típicamente de 2 a 8 UF: entero y FP
- Múltiples rutas de datos (canalizaciones) utilizadas para cada unidad para procesar múltiples elementos por ciclo
- Unidades vectoriales de almacenamiento de carga (LSU)
- Unidad completamente canalizada para cargar o almacenar un vector
- Múltiples elementos buscados/almacenados por ciclo
- Puede tener múltiples LSU
Barra transversal para conectar UF, LSU, registros Instrucciones vectoriales básicas
Estos se encuentran en la Tabla 1 a continuación;
Tabla 1
Instr. | Operandos | Operación | Comentar |
VA.VV | V1, V2, V3 | V1 = V2 + V3 | vector + vector |
VADD.SV | V1, R0, V2 | V1 = R0 + V2 | escalar + vector |
VMUL.VV | V1, V2, V3 | V1 = V2\(\times\) V3 | vector\(\times\) vector |
VMUL.SV | V1, R0, V2 | V1 = R0\(\times\) V2 | \(\times\)vector escalar |
VLD | V1, R1 | V1 = M [R1.. R1 + 63] | carga, zancada = 1 |
VLDS | V1, R1, R2 | V1 = M [R1.. R1 + 63*R2] | carga, zancada = R2 |
VLDX | V1, R1, V2 | V1 = M [R1 + V2i, i = 0.. 63] | indexado (“reunir”) |
VST | V1, R1 | M [R1.. R1 + 63] = V1 | tienda, zancada = 1 |
VSTS | V1, R1, R2 | V1 = M [R1.. R1 + 63*R2] | tienda, zancada = R2 |
VSTX | V1, R1, V2 | V1 = M [R1 + V2i, i=0.. 63] | indexado (“scatter”) |
+ todas las instrucciones escalares regulares (estilo RISC)...
Tabla 1
Operaciones de memoria vectorial
- Las operaciones de carga/almacenamiento mueven grupos de datos entre registros y memoria
- Tres tipos de direccionamiento
- Zancada de la unidad
- Más rápido
- Zancada no unitaria (constante)
- Indexado (recopilar-dispersión)
- Equivalente vectorial de registro indirecto
- Bueno para arreglos de datos dispersos
- Aumenta el número de programas que vectorizan
- comprimir/expandir variante también
- Soporte para varias combinaciones de anchos de datos en la memoria
- {.L, .W, .H., .B}\(\times\) {64b, 32b, 16b, 8b}
Ejemplo de código vectorial
Y [0:63] = Y [0:653] + A*x [0:63]
Véase el cuadro 2 y 3 a continuación;
Cuadro 2
64 elementos SAXPY: escalar | 64 elementos SAXPY: vector | |||
LD | R0, un | LD R0, a | #load escalar a |
|
ADDI | R4, Rx, #512 | VLD, V1, Rx | #load vector X |
|
bucle: | LD | R2, 0 (Rx) | VMUL.SV V2, R0, V1 |
#vector mult |
MULTD | R2, R0, R2 | VLD V3, Ry | #load vector Y |
|
LD | R4, 0 (Ry) | VADD.VV V4, V2, V3 |
#vector agregar | |
ADDD | R4, R2, R4 | VST Ry, V4 | #store Vector Y |
Cuadro 3
SD | R4, 0 (Ry) |
ADDI | Rx, Rx, #8 |
ADDI | Ry, Ry, #8 |
SUB | R20, R4, Rx |
BNZ | R20, bucle |
Longitud del vector
El registro vectorial puede contener algún número máximo de elementos para cada ancho de datos (longitud máxima del vector o MVL). ¿Qué hacer cuando la longitud del vector de aplicación no es exactamente MVL? El registro de longitud vectorial (VL) controla la longitud de cualquier operación de vector, incluyendo una carga o almacén vectorial Por ejemplo, vado.vv con VL=10 es para (I=0; I<10; I++) V1 [I] =V2 [I] +V3 [I]
El VL puede ser cualquier cosa, desde 0 hasta MVL
Conclusión
La sección introdujo al alumno al procesamiento de vectores cortos (operaciones multimedia) que se utiliza para las operaciones en matriz lineal de alto nivel de números.
Evaluación
1. Indicar las propiedades de los procesadores vectoriales
- Cada resultado independiente del resultado anterior
=> Pipeline largo, el compilador garantiza que no haya dependencias
=> Alta frecuencia de reloj
- Instrucciones vectoriales acceden a la memoria con patrón conocido
=> Memoria altamente intercalada
=> Amortizar la latencia de memoria de más de\(\approx\) 64 elementos
=> ¡No se requieren cachés (de datos)! (Usar caché de instrucciones)
- Reduce los problemas de sucursales y sucursales en tuberías
- La instrucción de un solo vector implica mucho trabajo (\(\approx\)bucle)
=> Menos busques de instrucciones