Einzelner Befehl, mehrere Daten

Single Instruction, Multiple Data ( SIMD ) ist eine Art des Parallelrechnens (paralleler Datenverarbeitung) gemäß Flynns Taxonomie . SIMD beschreibt Computer mit mehreren Verarbeitungselementen , die dieselbe Operation gleichzeitig auf mehreren Datenpunkten ausführen. SIMD kann intern (Teil des Hardware-Designs) implementiert sein und direkt über eine Befehlssatzarchitektur (ISA) zugänglich sein , ist aber nicht mit einer ISA zu verwechseln.

Solche Maschinen nutzen Datenparallelität , aber keine Nebenläufigkeit : Es finden zwar simultane (parallele) Berechnungen statt, aber jede Einheit führt zu jedem Zeitpunkt exakt denselben Befehl aus (nur mit unterschiedlichen Daten). Ein einfaches Beispiel ist die Addition vieler Zahlenpaare: Alle SIMD-Einheiten führen eine Addition durch, aber jede addiert unterschiedliche Zahlenpaare. SIMD eignet sich besonders für gängige Aufgaben wie die Kontrastanpassung in einem digitalen Bild oder die Lautstärkeregelung digitaler Audiodateien . Die meisten modernen CPUs enthalten SIMD-Befehle, um die Leistung bei Multimedia- Anwendungen zu verbessern. In aktuellen CPUs sind SIMD-Einheiten eng mit Cache-Hierarchien und Prefetch-Mechanismen verknüpft, wodurch die Latenz bei Operationen mit großen Datenblöcken minimiert wird. Beispielsweise können AVX-512-fähige Prozessoren ganze Cache-Zeilen vorladen und FMA-Operationen (Fused Multiply-Add) in einem einzigen SIMD-Zyklus ausführen.

Verwechslung zwischen SIMT und SIMD

ILLIAC IV Array Übersicht, aus der von ARPA finanzierten Einführungsbeschreibung von Steward Denenberg, 15. Juli 1971 [ 2 ]

SIMD umfasst drei verschiedene Unterkategorien in Flynns Taxonomie von 1972 , darunter Single Instruction, Multiple Threads (SIMT). SIMT ist nicht mit Software- oder Hardware- Threads zu verwechseln , die beide auf Task-Time-Sharing (Time-Slicing) basieren. SIMT ermöglicht echte simultane parallele Ausführung auf Hardwareebene, wie beispielsweise im ILLIAC IV .

SIMD sollte nicht mit Vektorverarbeitung verwechselt werden , die durch den Cray-1 charakterisiert und in Duncans Taxonomie erläutert wird . Der Unterschied zwischen SIMD- und Vektorprozessoren liegt primär im Vorhandensein eines Cray-ähnlichen SET VECTOR LENGTHBefehls.

Geschichte

Die erste bekannte operative Anwendung von SIMD innerhalb eines Registers war der TX-2 im Jahr 1958. Er war in der Lage, 36-Bit-Operationen und zwei 18-Bit- oder vier 9-Bit-Teilwortoperationen durchzuführen.

Die erste kommerzielle Anwendung von SIMD-Befehlen erfolgte im ILLIAC IV , der 1972 fertiggestellt wurde.

Vektor-Supercomputer der frühen 1970er-Jahre, wie der CDC Star-100 und der Texas Instruments ASC, konnten mit einem einzigen Befehl einen Datenvektor verarbeiten. Die Vektorverarbeitung wurde in den 1970er- und 1980er-Jahren insbesondere durch Cray populär . Vektorverarbeitungsarchitekturen werden heute als eigenständig von SIMD-Computern betrachtet: Duncans Taxonomie schließt sie ein, Flynns Taxonomie hingegen nicht, da Flynns Arbeiten (1966, 1972) vor dem Cray-1 (1977) entstanden . Die Komplexität von Vektorprozessoren inspirierte jedoch eine einfachere Anordnung, bekannt als SIMD innerhalb eines Registers .

Die erste Ära moderner SIMD-Computer war durch massiv parallel arbeitende Supercomputer wie die Thinking Machines Connection Machine CM-1 und CM-2 geprägt. Diese Computer verfügten über viele Prozessoren mit begrenzter Funktionalität, die parallel arbeiteten. Beispielsweise führte jeder der 65.536 Einzelbit-Prozessoren einer Thinking Machines CM-2 gleichzeitig denselben Befehl aus. Dies ermöglichte es beispielsweise, 65.536 Bitpaare gleichzeitig logisch zu kombinieren, wobei ein Hypercube-Netzwerk oder prozessorspezifischer RAM zur Ermittlung der Operanden genutzt wurde. Mit dem Aufkommen kostengünstiger MIMD-Verfahren (Scalar Multiple Instruction, Multiple Data ) auf Basis von Standardprozessoren wie dem Intel i860 XP und der damit einhergehenden Leistungssteigerung wandte sich das Supercomputing vom SIMD-Ansatz ab, und das Interesse an SIMD nahm ab. [ 3 ]

The current era of SIMD processors grew out of the desktop-computer market rather than the supercomputer market. As desktop processors became powerful enough to support real-time gaming and audio/video processing during the 1990s, demand grew for this type of computing power, and microprocessor vendors turned to SIMD to meet the demand.[4] This resurgence also coincided with the rise of DirectX and OpenGL shader models, which heavily leveraged SIMD under the hood. The graphics APIs encouraged programmers to adopt data-parallel programming styles, indirectly accelerating SIMD adoption in desktop software. Hewlett-Packard introduced Multimedia Acceleration eXtensions (MAX) instructions into PA-RISC 1.1 desktops in 1994 to accelerate MPEG decoding.[5] Sun Microsystems introduced SIMD integer instructions in its "VIS" instruction set extensions in 1995, in its UltraSPARC I microprocessor. MIPS followed suit with their similar MDMX system.

The first widely deployed desktop SIMD was with Intel's MMX extensions to the x86 architecture in 1996. This sparked the introduction of the much more powerful AltiVec system in the MotorolaPowerPC and IBM's POWER systems. Intel responded in 1999 by introducing the all-new SSE system. Since then, there have been several extensions to the SIMD instruction sets for both architectures. Advanced vector extensions AVX, AVX2 and AVX-512 are developed by Intel. AMD supports AVX, AVX2, and AVX-512 in their current products.[6]

Disadvantages

With SIMD, an order of magnitude increase in code size is not uncommon, when compared to equivalent scalar or equivalent vector code, and an order of magnitude or greater effectiveness (work done per instruction) is achievable with Vector ISAs.[7]

ARM's Scalable Vector Extension takes another approach, known in Flynn's Taxonomy more commonly known today as "Predicated" (masked) SIMD. This approach is not as compact as vector processing but is still far better than non-predicated SIMD. Detailed comparative examples are given at Vector processor § Vector instruction example.

Chronology

SIMD supercomputer examples excluding vector processors
YearExample
1974ILLIAC IV – ein Array-Prozessor bestehend aus skalaren 64-Bit-PEs
1974ICL Distributed Array Processor (DAP)
1976Burroughs Scientific Prozessor
1981Geometrisch-arithmetischer Parallelprozessor von Martin Marietta (weitergeführt bei Lockheed Martin , dann bei Teranex und Silicon Optix )
1983–1991Massiv paralleler Prozessor (MPP), von der NASA / Goddard Space Flight Center
1985Verbindungsmaschine , Modelle 1 und 2 (CM-1 und CM-2), von Thinking Machines Corporation
1987–1996MasPar MP-1 und MP-2
1991Zephyr DC von Wavetracer
2001Xplor von Pyxsys, Inc.

Hardware

CPUs

Die SIMD-Technologie mit kleiner Bitbreite (64 oder 128 Bit) erfreute sich Anfang der 1990er-Jahre auf Allzweckprozessoren großer Beliebtheit und wurde bis 1997 und später mit den Motion Video Instructions (MVI) für Alpha weiterentwickelt . SIMD -Befehle sind in unterschiedlichem Umfang auf den meisten Prozessoren zu finden, darunter IBMs AltiVec und Signal Processing Engine (SPE) für PowerPC , Hewlett-Packards (HP) PA-RISC Multimedia Acceleration eXtensions (MAX), Intels MMX und iwMMXt , Streaming SIMD Extensions (SSE), SSE2 , SSE3, SSSE3 und SSE4.x , AMDs 3DNow !, ARCs ARC -Video - Subsystem, SPARCs VIS und VIS2, Suns MAJC , ARMs Neon- Technologie, MIPS ' MDMX (MaDMaX) und MIPS-3D .

Intels AVX-512 SIMD-Befehle verarbeiten 512 Bit Daten gleichzeitig.

Koprozessoren

Der Befehlssatz des Synergistic Processing Element (SPE) des gemeinsam von IBM, Sony und Toshiba entwickelten Cell-Prozessors basiert größtenteils auf SIMD.

Einige, aber nicht alle GPUs basieren auf SIMD. AMD-GPUs seit der TeraScale-Mikroarchitektur nutzen SIMD, ein Merkmal, das auch in den Mikroarchitekturen RDNA und CDNA der 2020er Jahre beibehalten wurde [ 8 ] , mit einer darüberliegenden SIMT-Schicht ( Single Instruction, Multiple Threads ) [ 9 ] . Nvidias CUDA-Architekturen hingegen verwenden Skalarkerne mit SIMT [ 10 ] .

Philips , heute NXP , entwickelte mehrere SIMD-Prozessoren namens Xetal . Der Xetal verfügt über 320 16-Bit-Prozessorelemente, die speziell für Bildverarbeitungsaufgaben entwickelt wurden.

Die M1- und M2-Chips von Apple verfügen über SIMD-Einheiten, die tief in die GPU und die Neural Engine integriert sind und von Apple entwickelte SIMD-Pipelines nutzen, die für Bildfilterung, Faltung und Matrixmultiplikation optimiert sind. Diese einheitliche Speicherarchitektur trägt dazu bei, dass SIMD-Befehle effizienter auf gemeinsam genutzten Speicherpools ausgeführt werden. (Der CPU-Teil implementiert herkömmliches NEON.)

Software

Die gewöhnliche Verdreifachung von vier 8-Bit-Zahlen. Die CPU lädt eine 8-Bit-Zahl in R1, multipliziert sie mit R2 und speichert das Ergebnis aus R3 im RAM. Dieser Vorgang wird für jede Zahl wiederholt.
Die SIMD-Multiplikation von vier 8-Bit-Zahlen. Die CPU lädt vier Zahlen gleichzeitig, multipliziert sie in einer einzigen SIMD-Multiplikation und speichert die Ergebnisse anschließend wieder im RAM. Theoretisch lässt sich die Geschwindigkeit vervierfachen.

SIMD-Befehle werden häufig zur Verarbeitung von 3D-Grafiken verwendet, obwohl moderne Grafikkarten mit integriertem SIMD diese Aufgabe weitgehend von der CPU übernommen haben. Einige Systeme beinhalten auch Permutationsfunktionen, die Elemente innerhalb von Vektoren neu anordnen und sich dadurch besonders für die Datenverarbeitung und -komprimierung eignen. Sie werden auch in der Kryptographie eingesetzt. [ 11 ] [ 12 ] [ 13 ] Der Trend zum allgemeinen Rechnen auf GPUs ( GPGPU ) könnte zukünftig zu einer breiteren Verwendung von SIMD führen. Neuere Compiler wie LLVM , die GNU Compiler Collection (GCC) und Intels ICC bieten leistungsstarke Optionen für die automatische Vektorisierung. Entwickler können diese oft mit Flags wie `--auto-vectoring` -O3oder ` --auto-vectoring` aktivieren -ftree-vectorize, die den Compiler anweisen, Schleifen für die SIMD-Kompatibilität umzustrukturieren.

Die Einführung von SIMD-Systemen in PC- Software verlief anfangs aufgrund verschiedener Probleme schleppend. Zum einen verlangsamten viele der frühen SIMD-Befehlssätze die Gesamtleistung des Systems durch die Wiederverwendung vorhandener Gleitkommaregister. Andere Systeme wie MMX und 3DNow! boten Unterstützung für Datentypen, die für ein breites Publikum uninteressant waren, und benötigten aufwändige Kontextwechselbefehle, um zwischen der Verwendung der FPU- und der MMX -Register umzuschalten . Auch die Compiler boten oft keine ausreichende Unterstützung, sodass Programmierer auf Assembler- Code zurückgreifen mussten .

SIMD auf x86 hatte einen langsamen Start. Die Einführung von 3DNow! durch AMD und SSE durch Intel sorgte zunächst für Verwirrung, doch mittlerweile scheint sich das System stabilisiert zu haben (nachdem AMD SSE übernommen hat), und neuere Compiler sollten zu mehr SIMD-fähiger Software führen. Intel und AMD bieten nun optimierte Mathematikbibliotheken an, die SIMD-Befehle nutzen, und Open-Source-Alternativen wie libSIMD , SIMDx86 und SLEEF sind aufgetaucht (siehe auch libm ). [ 14 ]

Apple Computer war etwas erfolgreicher, obwohl das Unternehmen später als die Konkurrenz in den SIMD-Markt einstieg. AltiVec bot ein umfangreiches System und konnte mit immer leistungsfähigeren Compilern von Motorola , IBM und GNU programmiert werden , sodass Assemblerprogrammierung nur selten erforderlich war. Zudem stammten viele Systeme, die von SIMD profitierten, von Apple selbst, beispielsweise iTunes und QuickTime . Im Jahr 2006 wechselte Apple jedoch zu Intel x86-Prozessoren. Apples APIs und Entwicklungswerkzeuge ( Xcode ) wurden angepasst, um neben AltiVec auch SSE2 und SSE3 zu unterstützen. Apple war der Hauptabnehmer von PowerPC-Chips von IBM und Freescale Semiconductor . Obwohl Apple die Verwendung von PowerPC-Prozessoren in seinen Produkten eingestellt hat, wird die Entwicklung von AltiVec in verschiedenen PowerPC- und Power-ISA -Designs von Freescale und IBM fortgesetzt.

SIMD innerhalb eines Registers ( SWAR ) bezeichnet eine Reihe von Techniken und Tricks zur Durchführung von SIMD-Operationen in Allzweckregistern auf Hardware, die keine direkte Unterstützung für SIMD-Befehle bietet. Dies ermöglicht die Ausnutzung von Parallelität in bestimmten Algorithmen, selbst auf Hardware ohne direkte SIMD-Unterstützung.

Programmierschnittstelle

Es ist üblich, dass die Hersteller von SIMD-Befehlssätzen eigene C- und C++- Spracherweiterungen mit intrinsischen Funktionen oder speziellen Datentypen (mit Operatorüberladung ) entwickeln, um die Generierung von Vektorcode zu gewährleisten. Intel, AltiVec und ARM NEON bieten Erweiterungen an, die von den Compilern für ihre CPUs weit verbreitet verwendet werden. (Komplexere Operationen werden mithilfe von Vektormathematikbibliotheken durchgeführt.)

Generische Datentypen

Der GNU C Compiler geht noch einen Schritt weiter, indem er die Erweiterungen in eine universelle Schnittstelle abstrahiert, die auf jeder Plattform verwendet werden kann und die Definition von SIMD-Datentypen ermöglicht. [ 15 ] Auch der LLVM Clang Compiler implementiert diese Funktion mit einer analogen, in der IR definierten Schnittstelle. [ 16 ] Rusts packed_simdCrate (und die experimentelle Version std::simd) sowie Swift 2.0+ verwenden diese Schnittstelle.

C++ verfügt über eine experimentelle Schnittstelle std::experimental::simd, die ähnlich wie die GCC-Erweiterung funktioniert. Die libcxx von LLVM scheint diese zu implementieren. Für GCC und libstdc++ ist eine Wrapper-Bibliothek verfügbar, die auf der GCC-Erweiterung aufbaut. [ 17 ]

Microsoft hat SIMD in .NET mit RyuJIT eingeführt. [ 18 ] Das System.Numerics.Vectorauf NuGet verfügbare Paket implementiert SIMD-Datentypen. [ 19 ] Auch Java bietet eine neue API für SIMD-Befehle, die in OpenJDK 17 als Inkubatormodul verfügbar ist. [ 20 ] Zudem verfügt Java über einen sicheren Fallback-Mechanismus für nicht unterstützte CPUs, der auf einfache Schleifen zurückgreift.

Hinweise zur Vektorisierung

Anstatt einen SIMD-Datentyp bereitzustellen, können Compiler auch angewiesen werden, bestimmte Schleifen automatisch zu vektorisieren , wobei gegebenenfalls Zusicherungen hinsichtlich fehlender Datenabhängigkeiten vorgenommen werden. Dies ist zwar nicht so flexibel wie die direkte Manipulation von SIMD-Variablen, aber einfacher zu handhaben. OpenMP 4.0+ bietet eine #pragma omp simdentsprechende Funktion. [ 21 ] Diese OpenMP-Schnittstelle hat eine Vielzahl nicht standardkonformer Erweiterungen ersetzt, darunter die von Cilk [ 22 ]#pragma simd , die von GCC [ 23 ] und viele weitere.#pragma GCC ivdep

„SIMD everywhere“, eine Sammlung von C/C++-Headern, die plattformspezifische Intrinsics für andere Plattformen implementieren (z. B. SSE-Intrinsics für ARM NEON), beinhaltet die Verwendung plattformspezifischer Intrinsics, generischer Vektorschnittstellen und Vektorisierungshinweise. Sie kann als „Rosetta-Stein“ zum Vergleich dieser verschiedenen SIMD-Programmierparadigmen verwendet werden. [ 24 ]

SPMD-on-SIMD

Ein anderer Ansatz ist SPMD : Man schreibt ein Programm, das so aussieht, als würde es nur ein Element pro Zeiteinheit bearbeiten, und lässt es dann vom Compiler auf die Breite des SIMD-Vektors erweitern. Dieser Ansatz wird von Grafik- Shadern verwendet und findet seit Kurzem auch in CPU-orientierten Tools wie Intel IPSC Anwendung. [ 25 ]

SIMD-Multiversionierung

Consumer software is typically expected to work on a range of CPUs covering multiple generations, which could limit the programmer's ability to use new SIMD instructions to improve the computational performance of a program. The solution is to include multiple versions of the same code that uses either older or newer SIMD technologies, and pick one that best fits the user's CPU at run-time (dynamic dispatch). There are two main camps of solutions:

  • Function multi-versioning (FMV): a subroutine in the program or a library is duplicated and compiled for many instruction set extensions, and the program decides which one to use at run-time.
  • Library multi-versioning (LMV): the entire programming library is duplicated for many instruction set extensions, and the operating system or the program decides which one to load at run-time.

FMV, manually coded in assembly language, is quite commonly used in a number of performance-critical libraries such as glibc and libjpeg-turbo. Intel C++ Compiler, GNU Compiler Collection since GCC 6, and Clang since clang 7 allow for a simplified approach, with the compiler taking care of function duplication and selection. GCC and clang requires explicit target_clones labels in the code to "clone" functions,[26] while ICC does so automatically (under the command-line option /Qax). The Rust programming language also supports FMV. The setup is similar to GCC and Clang in that the code defines what instruction sets to compile for, but cloning is manually done via inlining.[27]

As using FMV requires code modification on GCC and Clang, vendors more commonly use library multi-versioning: this is easier to achieve as only compiler switches need to be changed. Glibc supports LMV and this functionality is adopted by the Intel-backed Clear Linux project.[28]

SIMD on the web

In 2013 John McCutchan announced that he had created a high-performance interface to SIMD instruction sets for the Dart programming language, bringing the benefits of SIMD to web programs for the first time. The interface consists of two types:[29]

  • Float32x4, 4 single precision floating point values.
  • Int32x4, 4 32-bit integer values.

Instanzen dieser Typen sind unveränderlich und werden in optimiertem Code direkt SIMD-Registern zugeordnet. Operationen in Dart werden typischerweise ohne zusätzlichen Aufwand in eine einzige Anweisung kompiliert. Dies ist vergleichbar mit den intrinsischen Funktionen von C und C++. Benchmarks für die 4×4- Matrixmultiplikation , die 3D-Vertex-Transformation und die Visualisierung der Mandelbrot-Menge zeigen eine Geschwindigkeitssteigerung von nahezu 400 % im Vergleich zu skalarem Code in Dart.

Intel kündigte auf dem IDF 2013 an, McCutchans Spezifikation sowohl für V8 als auch für SpiderMonkey zu implementieren . [ 30 ] Im Jahr 2017 wurde SIMD.js jedoch aus der ECMAScript- Standardisierungsliste entfernt, um stattdessen eine ähnliche Schnittstelle in WebAssembly zu verfolgen . [ 31 ]

Die Unterstützung für SIMD wurde in die WebAssembly 2.0-Spezifikation aufgenommen , die 2022 fertiggestellt und im Dezember 2024 offiziell in Kraft trat. [ 32 ] LLVMs Autovectoring kann beim Kompilieren von C oder C++ nach WebAssembly WebAssembly SIMD als Zielplattform auswählen, um SIMD automatisch zu nutzen; außerdem stehen intrinsische SIMD-Funktionen zur Verfügung. [ 33 ]

Kommerzielle Anwendungen

Es hat sich im Allgemeinen als schwierig erwiesen, nachhaltige kommerzielle Anwendungen für reine SIMD-Prozessoren im Bereich der Allzweckrechner zu finden.

Ein System, das gewisse Erfolge verzeichnen konnte, ist GAPP , entwickelt von Lockheed Martin und von deren Tochtergesellschaft Teranex für den kommerziellen Markt adaptiert . Die jüngsten Versionen von GAPP haben sich zu einem leistungsstarken Werkzeug für Echtzeit- Videoverarbeitungsanwendungen entwickelt , beispielsweise für die Konvertierung zwischen verschiedenen Videostandards und Bildraten ( NTSC zu/von PAL , NTSC zu/von HDTV usw.), Deinterlacing , Rauschunterdrückung , adaptive Videokompression und Bildverbesserung.

Eine weitverbreitete Anwendung für SIMD findet sich in Videospielen : Nahezu jede moderne Videospielkonsole seit 1998 verfügt über einen SIMD-Prozessor in ihrer Architektur. Die PlayStation 2 war insofern ungewöhnlich, als eine ihrer Vektor-Gleitkommaeinheiten entweder als eigenständiger digitaler Signalprozessor (DSP) mit eigenem Befehlsstrom oder als Koprozessor unter Steuerung herkömmlicher CPU-Befehle fungieren konnte. 3D-Grafikanwendungen eignen sich besonders gut für die SIMD-Verarbeitung , da sie stark auf Operationen mit vierdimensionalen Vektoren angewiesen sind. Microsofts Direct3D 9.0 wählt nun zur Laufzeit prozessorspezifische Implementierungen seiner mathematischen Operationen aus, einschließlich der Verwendung von SIMD-fähigen Befehlen.

Ein späterer Prozessor, der Vektorverarbeitung nutzte, ist der Cell-Prozessor der PlayStation 3. Er wurde von IBM in Zusammenarbeit mit Toshiba und Sony entwickelt . Er verwendet mehrere SIMD-Prozessoren (eine NUMA-Architektur ( Non-Uniform Memory Access ), jeder mit eigenem lokalen Speicher und gesteuert von einer Allzweck-CPU) und ist auf die enormen Datenmengen ausgelegt, die für 3D- und Videoverarbeitungsanwendungen benötigt werden. Er unterscheidet sich von herkömmlichen ISAs (Integrated Architecture Standards) dadurch, dass er von Grund auf SIMD-basiert ist und keine separaten Skalarregister besitzt.

Ziilabs produzierte einen SIMD-Prozessor für den Einsatz in mobilen Geräten wie Mediaplayern und Mobiltelefonen. [ 34 ]

Größere kommerzielle SIMD-Prozessoren sind von ClearSpeed ​​Technology, Ltd. und Stream Processors, Inc. erhältlich. Der CSX600 (2004) von ClearSpeed ​​verfügt über 96 Kerne mit jeweils zwei Gleitkommaeinheiten doppelter Genauigkeit, während der CSX700 (2008) 192 Kerne besitzt. Stream Processors wird vom Computerarchitekten Bill Dally geleitet. Deren Storm-1-Prozessor (2007) enthält 80 SIMD-Kerne, die von einer MIPS- CPU gesteuert werden .

Siehe auch

Referenzen

  1. ^ Flynn, Michael J. (September 1972). „Some Computer Organizations and Their Effectiveness“ (PDF) . IEEE Transactions on Computers . C-21 (9): 948–960 . doi : 10.1109/TC.1972.5009071 .
  2. ^ „Archivierte Kopie“ (PDF) . Archiviert vom Original (PDF) am 27.04.2024.{{cite web}}: CS1 Wartung: Archivierte Kopie als Titel ( Link )
  3. ^ "MIMD1 - XP/S, CM-5" (PDF) .
  4. ^ Conte, G.; Tommesani, S.; Zanichelli, F. (2000). „Der lange und verschlungene Weg zur Hochleistungsbildverarbeitung mit MMX/SSE“. Proc. Fifth IEEE Int'l Workshop on Computer Architectures for Machine Perception . doi : 10.1109/CAMP.2000.875989 . hdl : 11381/2297671 . S2CID 13180531 . 
  5. ^ Lee, RB (1995). „Echtzeit-MPEG-Video durch Software-Dekomprimierung auf einem PA-RISC-Prozessor“. Tagungsband der Compcon '95. Technologien für die Informationsautobahn . S.  186–192 . doi : 10.1109/CMPCON.1995.512384 . ISBN 0-8186-7029-0S2CID  2262046 .​
  6. ^ „AMD Zen 4 AVX-512 Leistungsanalyse im Ryzen 9 7950X Testbericht“ . www.phoronix.com . Abgerufen am 13.07.2023 .
  7. ^ Patterson, David; Waterman, Andrew (18. September 2017). „SIMD-Anweisungen als schädlich betrachtet“ . SIGARCH .
  8. ^ Lam, Chester. „GCN, AMDs GPU-Architekturmodernisierung“ . chipsandcheese.com .
  9. ^ Lam, Chester. „Hot Chips 34 – AMDs Instinct MI200-Architektur“ . chipsandcheese.com . Sowohl bei NVIDIA als auch bei AMD durchbrechen Matrixbefehle das SIMT-Abstraktionsmodell und wirken über die gesamte Wellenfront (bzw. den „Warp“ bei NVIDIA).
  10. ^ "Version 2.3 27.08.2009 OpenCL Programming Guide for the CUDA Architecture" (PDF) .
  11. ^ Betreff: SSE2-Geschwindigkeit , Darstellung der Verwendung von SSE2 zur Implementierung von SHA-Hash-Algorithmen
  12. ^ Salsa20-Geschwindigkeit; Salsa20-Software , die eine mit SSE2 implementierte Stromchiffre zeigt
  13. ^ Betreff: Bis zu 1,4-facher RSA-Durchsatz mit SSE2 , zeigt RSA, implementiert mit einer Nicht-SIMD-SSE2-Integer-Multiplikationsanweisung.
  14. ^ „SIMD-Bibliotheksmathematikfunktionen“ . Stack Overflow . Abgerufen am 16. Januar 2020 .
  15. ^ „Vektorerweiterungen“ . Verwendung der GNU Compiler Collection (GCC) . Abgerufen am 16. Januar 2020 .
  16. ^ „Clang Language Extensions“ . Clang 11-Dokumentation . Abgerufen am 16. Januar 2020 .
  17. ^ "VcDevel/std-simd" . VcDevel. 6. August 2020.
  18. ^ „RyuJIT: Der JIT-Compiler der nächsten Generation für .NET“ . 30. September 2013.
  19. ^ „Das JIT hat endlich einen Antrag gemacht. JIT und SIMD heiraten .“ 7. April 2014.
  20. ^ "JEP 338: Vector API" .
  21. ^ „SIMD-Direktiven“ . www.openmp.org .
  22. ^ „Tutorial pragma simd“ . CilkPlus . 18. Juli 2012. Archiviert vom Original am 4. Dezember 2020. Abgerufen am 9. August 2020 .
  23. ^ Kruse, Michael. "OMP5.1: Schleifentransformationen" (PDF) .
  24. ^ „simd-everywhere/simde: Implementierungen von SIMD-Befehlssätzen für Systeme, die diese nicht nativ unterstützen“ . GitHub . SIMD Everywhere. 6. November 2025.
  25. ^ Pharr, Matt; Mark, William R. (Mai 2012). ispc: Ein SPMD-Compiler für die Hochleistungs-CPU-Programmierung (PDF) . 2012 Innovative Parallel Computing (InPar). S.  1–13 . doi : 10.1109/InPar.2012.6339601 .
  26. ^ „Funktions-Multiversionierung in GCC 6“ . lwn.net . 22. Juni 2016.
  27. ^ "2045-target-feature" . Das Rust RFC-Buch .
  28. ^ „Transparente Verwendung von für die Intel®-Architektur optimierten Bibliothekspaketen“ . Clear Linux*-Projekt . Abgerufen am 8. September 2019 .
  29. ^ John McCutchan. „Bringing SIMD to the web via Dart“ (PDF) . Archiviert vom Original (PDF) am 03.12.2013.
  30. ^ "SIMD in JavaScript" . 01.org . 8. Mai 2014.
  31. ^ „tc39/ecmascript_simd: SIMD-Numerischer Typ für EcmaScript“ . GitHub . Ecma TC39. 22. August 2019. Abgerufen am 8. September 2019 .
  32. ^ "Wasm 2.0 abgeschlossen - WebAssembly" .
  33. ^ „Verwendung von SIMD mit WebAssembly“ . Emscripten 4.0.11-git (dev) Dokumentation .
  34. ^ „ZiiLABS ZMS-05 ARM 9 Media Processor“ . ZiiLabs . Archiviert vom Original am 18.07.2011 . Abgerufen am 24.05.2010 .