stringtranslate.com

Instrucción única, datos múltiples

Instrucción única, datos múltiples

Instrucción única, datos múltiples ( SIMD ) es un tipo de procesamiento paralelo en la taxonomía de Flynn . SIMD puede ser interno (parte del diseño del hardware) y se puede acceder directamente a él a través de una arquitectura de conjunto de instrucciones (ISA), pero no debe confundirse con una ISA. SIMD describe computadoras con múltiples elementos de procesamiento que realizan la misma operación en múltiples puntos de datos simultáneamente.

Estas máquinas explotan el paralelismo a nivel de datos , pero no la concurrencia : hay cálculos simultáneos (paralelos), pero cada unidad realiza exactamente la misma instrucción en un momento dado (solo que con datos diferentes). SIMD es particularmente aplicable a tareas comunes como ajustar el contraste en una imagen digital o ajustar el volumen del audio digital . La mayoría de los diseños de CPU modernos incluyen instrucciones SIMD para mejorar el rendimiento del uso multimedia . SIMD tiene tres subcategorías diferentes en la Taxonomía de Flynn de 1972 , una de las cuales es SIMT . SIMT no debe confundirse con subprocesos de software o subprocesos de hardware , los cuales son tareas de tiempo compartido (time-slicing). SIMT es una verdadera ejecución paralela simultánea a nivel de hardware.

Las unidades de procesamiento de gráficos (GPU) modernas suelen ser implementaciones SIMD amplias, capaces de bifurcar, cargar y almacenar 128 o 256 bytes a la vez. Incluso las CPU pueden realizar cargas tan grandes que una línea de caché x86 tiene 512 bits (64 bytes) de ancho.

Historia

El primer uso de instrucciones SIMD fue en el ILLIAC IV , que se completó en 1966.

SIMD fue la base de las supercomputadoras vectoriales de principios de la década de 1970, como la CDC Star-100 y la Texas Instruments ASC , que podían operar en un "vector" de datos con una sola instrucción. El procesamiento vectorial fue especialmente popularizado por Cray en las décadas de 1970 y 1980. Las arquitecturas de procesamiento de vectores ahora se consideran separadas de las computadoras SIMD: la taxonomía de Duncan las incluye donde la taxonomía de Flynn no las incluye, debido a que el trabajo de Flynn (1966, 1972) es anterior al Cray-1 (1977).

La primera era de las computadoras SIMD modernas se caracterizó por supercomputadoras de estilo de procesamiento masivamente paralelo, como las Thinking Machines CM-1 y CM-2 . Estas computadoras tenían muchos procesadores de funcionalidad limitada que funcionarían en paralelo. Por ejemplo, cada uno de los 65.536 procesadores de un solo bit en Thinking Machines CM-2 ejecutaría la misma instrucción al mismo tiempo, lo que permitiría, por ejemplo, combinar lógicamente 65.536 pares de bits a la vez, utilizando una red conectada a un hipercubo o RAM dedicada al procesador para encontrar sus operandos. La supercomputación se alejó del enfoque SIMD cuando los enfoques MIMD escalares económicos basados ​​en procesadores básicos como el Intel i860 XP se volvieron más poderosos y el interés en SIMD disminuyó. [2]

La era actual de los procesadores SIMD surgió del mercado de las computadoras de escritorio y no del mercado de las supercomputadoras. A medida que los procesadores de escritorio se volvieron lo suficientemente potentes como para admitir juegos en tiempo real y procesamiento de audio/vídeo durante la década de 1990, la demanda de este tipo particular de potencia informática creció y los proveedores de microprocesadores recurrieron a SIMD para satisfacer la demanda. [3] Hewlett-Packard introdujo instrucciones MAX en las computadoras de escritorio PA-RISC 1.1 en 1994 para acelerar la decodificación MPEG. [4] Sun Microsystems introdujo instrucciones de números enteros SIMD en sus extensiones de conjunto de instrucciones " VIS " en 1995, en su microprocesador UltraSPARC I. MIPS hizo lo mismo con su sistema MDMX similar .

El primer SIMD de escritorio ampliamente implementado fue con las extensiones MMX de Intel para la arquitectura x86 en 1996. Esto provocó la introducción del sistema AltiVec, mucho más potente, en los sistemas PowerPC de Motorola y POWER de IBM . Intel respondió en 1999 introduciendo el nuevo sistema SSE . Desde entonces, ha habido varias extensiones de los conjuntos de instrucciones SIMD para ambas arquitecturas. Las extensiones vectoriales avanzadas AVX, AVX2 y AVX-512 son desarrolladas por Intel. AMD admite AVX, AVX2 y AVX-512 en sus productos actuales. [5]

Todos estos desarrollos se han orientado al soporte de gráficos en tiempo real y, por lo tanto, están orientados al procesamiento en dos, tres o cuatro dimensiones, generalmente con longitudes vectoriales de entre dos y dieciséis palabras, según el tipo de datos y la arquitectura. Cuando es necesario distinguir las nuevas arquitecturas SIMD de las más antiguas, las arquitecturas más nuevas se consideran arquitecturas de "vector corto", ya que las supercomputadoras SIMD y vectoriales anteriores tenían longitudes de vectores de 64 a 64.000. Una supercomputadora moderna es casi siempre un grupo de computadoras MIMD, cada una de las cuales implementa instrucciones SIMD (de vector corto).

Ventajas

Una aplicación que puede aprovechar SIMD es aquella en la que se agrega (o resta) el mismo valor a una gran cantidad de puntos de datos, una operación común en muchas aplicaciones multimedia . Un ejemplo sería cambiar el brillo de una imagen. Cada píxel de una imagen consta de tres valores para el brillo de las partes roja (R), verde (G) y azul (B) del color. Para cambiar el brillo, los valores R, G y B se leen de la memoria, se les suma (o se les resta) un valor y los valores resultantes se vuelven a escribir en la memoria. Los DSP de audio también, para controlar el volumen, multiplicarían los canales izquierdo y derecho simultáneamente.

Con un procesador SIMD hay dos mejoras en este proceso. Por un lado, se entiende que los datos están en bloques y se pueden cargar varios valores a la vez. En lugar de una serie de instrucciones que digan "recupere este píxel, ahora recupere el siguiente píxel", un procesador SIMD tendrá una única instrucción que efectivamente diga "recupere n píxeles" (donde n es un número que varía de un diseño a otro). Por diversas razones, esto puede llevar mucho menos tiempo que recuperar cada píxel individualmente, como ocurre con un diseño de CPU tradicional.

Otra ventaja es que la instrucción opera con todos los datos cargados en una sola operación. En otras palabras, si el sistema SIMD funciona cargando ocho puntos de datos a la vez, la addoperación que se aplica a los datos se realizará con los ocho valores al mismo tiempo. Este paralelismo es independiente del paralelismo proporcionado por un procesador superescalar ; los ocho valores se procesan en paralelo incluso en un procesador no superescalar, y un procesador superescalar puede realizar múltiples operaciones SIMD en paralelo.

Desventajas

Para remediar los problemas 1 y 5, la extensión vectorial de RISC-V utiliza un enfoque alternativo: en lugar de exponer los detalles del nivel de subregistro al programador, el conjunto de instrucciones los abstrae como unos pocos "registros vectoriales" que usan el mismo interfaces en todas las CPU con este conjunto de instrucciones. El hardware maneja todos los problemas de alineación y la "minería a cielo abierto" de bucles. Las máquinas con diferentes tamaños de vectores podrían ejecutar el mismo código. LLVM llama a este tipo de vector "vscale". [ cita necesaria ]

Un aumento de orden de magnitud en el tamaño del código no es infrecuente, en comparación con un código escalar o vectorial equivalente, y se puede lograr un orden de magnitud o mayor efectividad (trabajo realizado por instrucción) con Vector ISA. [6]

La extensión vectorial escalable de ARM adopta otro enfoque, conocido en la taxonomía de Flynn como "procesamiento asociativo", más comúnmente conocido hoy en día como SIMD "predicado" (enmascarado) . Este enfoque no es tan compacto como el procesamiento vectorial , pero sigue siendo mucho mejor que el SIMD no predicado. Se ofrecen ejemplos comparativos detallados en la página de procesamiento de vectores .

Cronología

Hardware

El SIMD de pequeña escala (64 o 128 bits) se hizo popular en las CPU de uso general a principios de la década de 1990 y continuó hasta 1997 y más tarde con Motion Video Instrucciones (MVI) para Alpha . Las instrucciones SIMD se pueden encontrar, en un grado u otro, en la mayoría de las CPU, incluidas AltiVec y SPE para PowerPC de IBM , PA-RISC Multimedia Acceleration eXtensions (MAX) de HP , MMX e iwMMXt de Intel , SSE , SSE2 , SSE3 SSSE3 y SSE4.x , 3DNow! de AMD . , el subsistema de vídeo ARC de ARC , VIS y VIS2 de SPARC , MAJC de Sun , tecnología Neon de ARM , MDMX ( MaDMaX ) de MIPS y MIPS-3D . El conjunto de instrucciones SPU del procesador Cell desarrollado conjuntamente por IBM, Sony y Toshiba está basado en gran medida en SIMD. Philips , ahora NXP , desarrolló varios procesadores SIMD denominados Xetal . El Xetal cuenta con 320 elementos procesadores de 16 bits especialmente diseñados para tareas de visión.

Las instrucciones SIMD AVX-512 de Intel procesan 512 bits de datos a la vez.

Software

La triplicación ordinaria de cuatro números de 8 bits. La CPU carga un número de 8 bits en R1, lo multiplica por R2 y luego guarda la respuesta de R3 en la RAM. Este proceso se repite para cada número.
El SIMD triplicando cuatro números de 8 bits. La CPU carga 4 números a la vez, los multiplica todos en una multiplicación SIMD y los guarda todos a la vez en la RAM. En teoría, la velocidad se puede multiplicar por 4.

Las instrucciones SIMD se utilizan ampliamente para procesar gráficos 3D, aunque las tarjetas gráficas modernas con SIMD integrado han asumido en gran medida esta tarea de la CPU. Algunos sistemas también incluyen funciones de permutación que reempaquetan elementos dentro de vectores, lo que los hace particularmente útiles para el procesamiento y la compresión de datos. También se utilizan en criptografía. [7] [8] [9] La tendencia de la informática de propósito general en GPU ( GPGPU ) puede conducir a un uso más amplio de SIMD en el futuro.

La adopción de sistemas SIMD en el software de ordenadores personales fue al principio lenta debido a una serie de problemas. Una era que muchos de los primeros conjuntos de instrucciones SIMD tendían a ralentizar el rendimiento general del sistema debido a la reutilización de los registros de punto flotante existentes. Otros sistemas, como MMX y 3DNow! , ofrecía soporte para tipos de datos que no eran interesantes para una amplia audiencia y tenía costosas instrucciones de cambio de contexto para alternar entre el uso de los registros FPU y MMX . Los compiladores a menudo también carecían de soporte, lo que requería que los programadores recurrieran a la codificación en lenguaje ensamblador .

SIMD en x86 tuvo un inicio lento. La introducción de 3DNow! por AMD y SSE por Intel confundieron un poco las cosas, pero hoy el sistema parece haberse asentado (después de que AMD adoptó SSE) y los compiladores más nuevos deberían dar como resultado más software compatible con SIMD. Intel y AMD ahora proporcionan bibliotecas matemáticas optimizadas que utilizan instrucciones SIMD, y han comenzado a aparecer alternativas de código abierto como libSIMD, SIMDx86 y SLEEF (ver también libm ). [10]

Apple Computer tuvo algo más de éxito, aunque entró en el mercado SIMD más tarde que el resto. AltiVec ofrecía un sistema rico y se puede programar utilizando compiladores cada vez más sofisticados de Motorola , IBM y GNU , por lo que rara vez se necesita programación en lenguaje ensamblador. Además, muchos de los sistemas que se beneficiarían de SIMD fueron suministrados por la propia Apple, por ejemplo iTunes y QuickTime . Sin embargo, en 2006, las computadoras Apple pasaron a procesadores Intel x86. Las API y las herramientas de desarrollo ( XCode ) de Apple se modificaron para admitir SSE2 y SSE3 , así como AltiVec. Apple fue el comprador dominante de chips PowerPC de IBM y Freescale Semiconductor . Aunque Apple ha dejado de utilizar procesadores PowerPC en sus productos, se continúa con el desarrollo de AltiVec en varios diseños de PowerPC y Power ISA de Freescale e IBM.

SIMD dentro de un registro , o SWAR , es una gama de técnicas y trucos utilizados para realizar SIMD en registros de uso general en hardware que no proporciona soporte directo para instrucciones SIMD. Esto se puede utilizar para explotar el paralelismo en ciertos algoritmos incluso en hardware que no admite SIMD directamente.

Interfaz del programador

Es común que los editores de conjuntos de instrucciones SIMD creen sus propias extensiones de lenguaje C/C++ con funciones intrínsecas o tipos de datos especiales (con sobrecarga de operadores ) que garantizan la generación de código vectorial. Intel, AltiVec y ARM NEON proporcionan extensiones ampliamente adoptadas por los compiladores dirigidos a sus CPU. (Las operaciones más complejas son tarea de las bibliotecas matemáticas vectoriales).

El compilador GNU C lleva las extensiones un paso más allá al abstraerlas en una interfaz universal que se puede usar en cualquier plataforma al proporcionar una forma de definir tipos de datos SIMD. [11] El compilador LLVM Clang también implementa la característica, con una interfaz análoga definida en el IR. [12] La caja de Rust packed_simd(y la experimental std::sims) usa esta interfaz, al igual que Swift 2.0+.

C++ tiene una interfaz experimental std::experimental::simdque funciona de manera similar a la extensión GCC. Libcxx de LLVM parece implementarlo. [ cita necesaria ] Para GCC y libstdc++, está disponible una biblioteca contenedora que se basa en la extensión GCC. [13]

Microsoft agregó SIMD a .NET en RyuJIT. [14] El System.Numerics.Vectorpaquete, disponible en NuGet, implementa tipos de datos SIMD. [15] Java también tiene una nueva API propuesta para instrucciones SIMD disponible en OpenJDK 17 en un módulo de incubadora. [16] También tiene un mecanismo de respaldo seguro en CPU no compatibles para bucles simples.

En lugar de proporcionar un tipo de datos SIMD, también se puede insinuar a los compiladores que vectoricen automáticamente algunos bucles, lo que podría hacer algunas afirmaciones sobre la falta de dependencia de los datos. Esto no es tan flexible como manipular variables SIMD directamente, pero es más fácil de usar. OpenMP 4.0+ tiene una #pragma omp simdpista. [17] Esta interfaz OpenMP ha reemplazado un amplio conjunto de extensiones no estándar, incluidas Cilk ,#pragma simd [ 18] GCC #pragma GCC ivdepy muchas más. [19]

Multiversionado SIMD

Por lo general, se espera que el software de consumo funcione en una variedad de CPU que cubren varias generaciones, lo que podría limitar la capacidad del programador para utilizar nuevas instrucciones SIMD para mejorar el rendimiento computacional de un programa. La solución es incluir múltiples versiones del mismo código que utilicen tecnologías SIMD más antiguas o más nuevas, y elegir la que mejor se adapte a la CPU del usuario en tiempo de ejecución ( despacho dinámico ). Hay dos campos principales de soluciones:

FMV, codificado manualmente en lenguaje ensamblador, se usa con bastante frecuencia en varias bibliotecas críticas para el rendimiento, como glibc y libjpeg-turbo. El compilador Intel C++ , la colección de compiladores GNU desde GCC 6 y Clang desde clang 7 permiten un enfoque simplificado, en el que el compilador se encarga de la duplicación y selección de funciones. GCC y clang requieren target_clonesetiquetas explícitas en el código para "clonar" funciones, [20] mientras que ICC lo hace automáticamente (bajo la opción de línea de comandos /Qax). El lenguaje de programación Rust también es compatible con FMV. La configuración es similar a GCC y Clang en que el código define para qué conjuntos de instrucciones compilar, pero la clonación se realiza manualmente mediante inserción. [21]

Como el uso de FMV requiere modificación de código en GCC y Clang, los proveedores suelen utilizar versiones múltiples de bibliotecas: esto es más fácil de lograr ya que solo es necesario cambiar los modificadores del compilador. Glibc es compatible con LMV y esta funcionalidad es adoptada por el proyecto Clear Linux respaldado por Intel. [22]

SIMD en la web

En 2013, John McCutchan anunció que había creado una interfaz de alto rendimiento para conjuntos de instrucciones SIMD para el lenguaje de programación Dart , llevando los beneficios de SIMD a los programas web por primera vez. La interfaz consta de dos tipos: [23]

Las instancias de estos tipos son inmutables y en código optimizado se asignan directamente a registros SIMD. Las operaciones expresadas en Dart normalmente se compilan en una sola instrucción sin ningún costo adicional. Esto es similar a los intrínsecos de C y C++. Los puntos de referencia para la multiplicación de matrices 4×4 , la transformación de vértices 3D y la visualización del conjunto de Mandelbrot muestran una aceleración cercana al 400 % en comparación con el código escalar escrito en Dart.

El trabajo de McCutchan en Dart, ahora llamado SIMD.js, ha sido adoptado por ECMAScript e Intel anunció en IDF 2013 que están implementando la especificación de McCutchan tanto para V8 como para SpiderMonkey . [24] Sin embargo, en 2017, SIMD.js fue eliminado de la cola estándar ECMAScript a favor de buscar una interfaz similar en WebAssembly . [25] En agosto de 2020, la interfaz WebAssembly aún no está terminada, pero su función SIMD portátil de 128 bits ya ha tenido cierto uso en muchos motores.

Emscripten, el compilador de C/C++ a JavaScript de Mozilla, con extensiones puede permitir la compilación de programas C++ que utilizan elementos intrínsecos SIMD o código vectorial de estilo GCC en la API SIMD de JavaScript, lo que da como resultado aceleraciones equivalentes en comparación con el código escalar. [26] También admite (y ahora prefiere) la propuesta SIMD de 128 bits de WebAssembly. [27]

Aplicaciones comerciales

En general, ha resultado difícil encontrar aplicaciones comerciales sostenibles para procesadores exclusivamente SIMD.

Uno que ha tenido cierto éxito es el GAPP , que fue desarrollado por Lockheed Martin y llevado al sector comercial por su spin-off Teranex. Las encarnaciones recientes de GAPP se han convertido en una poderosa herramienta en aplicaciones de procesamiento de video en tiempo real, como la conversión entre varios estándares de video y velocidades de fotogramas ( NTSC a/desde PAL , NTSC a/desde formatos HDTV , etc.), desentrelazado , reducción de ruido de imagen , adaptativo. compresión de vídeo y mejora de imágenes.

Una aplicación más ubicua para SIMD se encuentra en los videojuegos : casi todas las consolas de videojuegos modernas desde 1998 han incorporado un procesador SIMD en algún lugar de su arquitectura. La PlayStation 2 era inusual porque una de sus unidades de flotación vectorial podía funcionar como un DSP autónomo ejecutando su propio flujo de instrucciones, o como un coprocesador impulsado por instrucciones ordinarias de la CPU. Las aplicaciones de gráficos 3D tienden a prestarse bien al procesamiento SIMD, ya que dependen en gran medida de operaciones con vectores de 4 dimensiones. Direct3D 9.0 de Microsoft ahora elige en tiempo de ejecución implementaciones específicas del procesador de sus propias operaciones matemáticas, incluido el uso de instrucciones compatibles con SIMD.

Un procesador posterior que utilizó procesamiento vectorial es el procesador Cell utilizado en la Playstation 3, que fue desarrollado por IBM en cooperación con Toshiba y Sony . Utiliza varios procesadores SIMD (una arquitectura NUMA , cada uno con un almacén local independiente y controlado por una CPU de uso general) y está orientado a los enormes conjuntos de datos requeridos por las aplicaciones de procesamiento de vídeo y 3D. Se diferencia de los ISA tradicionales por ser SIMD desde cero sin registros escalares separados.

Ziilabs produjo un procesador tipo SIMD para usar en dispositivos móviles, como reproductores multimedia y teléfonos móviles. [28]

Los procesadores SIMD comerciales de mayor escala están disponibles en ClearSpeed ​​Technology, Ltd. y Stream Processors, Inc. El CSX600 (2004) de ClearSpeed ​​tiene 96 núcleos cada uno con dos unidades de coma flotante de doble precisión, mientras que el CSX700 (2008) tiene 192. Stream Processors es dirigido por el arquitecto informático Bill Dally . Su procesador Storm-1 (2007) contiene 80 núcleos SIMD controlados por una CPU MIPS.

Ver también

Referencias

  1. ^ Flynn, Michael J. (septiembre de 1972). "Algunas organizaciones informáticas y su eficacia" (PDF) . Transacciones IEEE en computadoras . C-21 (9): 948–960. doi :10.1109/TC.1972.5009071.
  2. ^ "MIMD1 - XP/S, CM-5" (PDF) .
  3. ^ Conte, G.; Tommesani, S.; Zanichelli, F. (2000). "El largo y tortuoso camino hacia el procesamiento de imágenes de alto rendimiento con MMX/SSE". Proc. Quinto taller internacional IEEE sobre arquitecturas informáticas para la percepción de máquinas . doi :10.1109/CAMP.2000.875989. hdl :11381/2297671. S2CID  13180531.
  4. ^ Lee, RB (1995). "Vídeo MPEG en tiempo real mediante descompresión de software en un procesador PA-RISC". resumen de artículos Compcon '95. Tecnologías para la Supercarretera de la Información . págs. 186-192. doi :10.1109/CMPCON.1995.512384. ISBN 0-8186-7029-0. S2CID  2262046.
  5. ^ "Análisis de rendimiento de AMD Zen 4 AVX-512 en la revisión de Ryzen 9 7950X". www.phoronix.com . Consultado el 13 de julio de 2023 .
  6. ^ Patterson, David; Waterman, Andrew (18 de septiembre de 2017). "Las instrucciones SIMD se consideran dañinas". SIGARCH .
  7. ^ RE: Velocidad de SSE2, que muestra cómo se utiliza SSE2 para implementar algoritmos hash SHA
  8. ^ Velocidad Salsa20; Software Salsa20, que muestra un cifrado de flujo implementado usando SSE2
  9. ^ Asunto: rendimiento de RSA de hasta 1,4 veces usando SSE2, que muestra RSA implementado usando una instrucción de multiplicación de enteros SSE2 no SIMD.
  10. ^ "Funciones matemáticas de la biblioteca SIMD". Desbordamiento de pila . Consultado el 16 de enero de 2020 .
  11. ^ "Extensiones vectoriales". Usando la colección de compiladores GNU (GCC) . Consultado el 16 de enero de 2020 .
  12. ^ "Extensiones de lenguaje Clang". Documentación de Clang 11 . Consultado el 16 de enero de 2020 .
  13. ^ "VcDevel/std-simd". VcDevel. 6 de agosto de 2020.
  14. ^ "RyuJIT: el compilador JIT de próxima generación para .NET". 30 de septiembre de 2013.
  15. ^ "El JIT finalmente propuso matrimonio. JIT y SIMD se casan". 7 de abril de 2014.
  16. ^ "JEP 338: API vectorial".
  17. ^ "Directivas SIMD". www.openmp.org .
  18. ^ "Tutorial pragma simd". CilkPlus . 18 de julio de 2012. Archivado desde el original el 4 de diciembre de 2020 . Consultado el 9 de agosto de 2020 .
  19. ^ Kruse, Michael. "OMP5.1: Transformaciones de bucle" (PDF) .
  20. ^ "Función de multiversionado en GCC 6". lwn.net .
  21. ^ "Función de destino 2045". El libro RFC de Rust .
  22. ^ "Uso transparente de paquetes de biblioteca optimizados para la arquitectura Intel®". Borrar proyecto Linux* . Consultado el 8 de septiembre de 2019 .
  23. ^ John McCutchan. "Llevando SIMD a la web a través de Dart" (PDF) . Archivado desde el original (PDF) el 3 de diciembre de 2013.
  24. ^ "SIMD en JavaScript". 01.org . 8 de mayo de 2014.
  25. ^ "tc39/ecmascript_simd: tipo numérico SIMD para EcmaScript". GitHub . ECMA TC39. 22 de agosto de 2019 . Consultado el 8 de septiembre de 2019 .
  26. ^ Jensen, Pedro; Jibaja, Iván; Hu, Ningxin; Gohman, Dan; McCutchan, John (2015). "SIMD en JavaScript a través de C++ y Emscripten" (PDF) .
  27. ^ "Transferencia de código SIMD dirigido a WebAssembly". Documentación de Emscripten 1.40.1 .
  28. ^ "Procesador de medios ZiiLABS ZMS-05 ARM 9". ZiiLabs . Archivado desde el original el 18 de julio de 2011 . Consultado el 24 de mayo de 2010 .

enlaces externos