Einzelanweisung, mehrere Daten

Einzelanweisung, mehrere Daten

Einzelanweisung, mehrere Daten (Simd) ist eine Art von Art von Parallelverarbeitung in Flynns Taxonomie. SIMD kann intern sein (Teil des Hardwaredesigns) und über einen direkt zugänglich sein Anweisungsset Architektur (ISA), aber es sollte nicht mit einem ISA verwechselt werden. SIMD beschreibt Computer mit Mehrere Verarbeitungselemente Dadurch können Sie den gleichen Betrieb gleichzeitig mit mehreren Datenpunkten ausführen.

Solche Maschinen nutzen Datenebene Parallelität, aber nicht Parallelität: Es gibt gleichzeitige (parallele) Berechnungen, aber jede Einheit führt zu einem bestimmten Zeitpunkt genau dieselbe Anweisung aus (nur mit unterschiedlichen Daten). SIMD ist besonders für gemeinsame Aufgaben anwendbar, z. B. die Anpassung des Kontrasts in a digitales Bild oder das Volumen von einstellen digitaler Ton. Am modernsten Zentralprozessor Zu den Designs gehören SIMD -Anweisungen zur Verbesserung der Leistung von Multimedia verwenden. SIMD hat drei verschiedene Unterkategorien in Flynns Taxonomie von 1972, eines davon ist Simt. SIMT sollte nicht verwechselt werden mit Software -Threads oder Hardware -ThreadsBeide sind Zeitteilung von Aufgaben (Zeitspeisen). SIMT ist echte gleichzeitige Ausführung paralleler Hardware-Ebene.

Geschichte

Die erste Verwendung von SIMD -Anweisungen war in der ILLIAC IV, der 1966 fertiggestellt wurde.

Simd war die Grundlage für Vektor -Supercomputer von den frühen 1970er Jahren wie die CDC Star-100 und die Texas Instrumente ASC, die mit einem "Vektor" von Daten mit einer einzigen Anweisung arbeiten könnten. Die Vektorverarbeitung wurde besonders populär von populär von Cray In den 1970er und 1980er Jahren. Vektorverarbeitungsarchitekturen gelten jetzt als getrennt von SIMD -Computern: Duncans Taxonomie beinhaltet sie wo Flynns Taxonomie aufgrund von Flynns Arbeit (1966, 1972) nicht vor dem Dating der Cray-1 (1977).

Die erste Ära moderner Simd -Computer wurde durch gekennzeichnet Massiv parallele Verarbeitung-Stil Supercomputer so wie die Denkmaschinen CM-1 und CM-2. Diese Computer hatten viele limitierte Funktionalitätsprozessoren, die parallel funktionieren würden. Zum Beispiel würde jeder der 65.536 Einzelbit-Prozessoren in einem Denkmaschinen CM-2 gleichzeitig denselben Anweisungen ausführen, sodass beispielsweise 65.536 Bitpaare gleichzeitig unter Verwendung eines Hypercube-vernetzten Netzwerks oder eines Hypercube-Netzwerks oder der Verwendung von Bits kombiniert werden können Prozessor-dedizierter RAM, um seine Operanden zu finden. Supercomputing bewegte sich beim günstigen Skalar vom SIMD -Ansatz ab Mimd Ansätze basierend auf Warenprozessoren wie der Intel i860 xp[2] wurde mächtiger und das Interesse an Simd ließ nach.

Die aktuelle Ära der SIMD-Prozessoren ist aus dem Desktop-Computer-Markt und nicht aus dem Supercomputermarkt hervorgegangen. Als Desktop-Prozessoren in den neunziger Jahren leistungsfähig genug wurden, um Echtzeitspiele und Audio-/Videoverarbeitung zu unterstützen, wuchs die Nachfrage nach dieser speziellen Art von Rechenleistung, und Mikroprozessoranbieter wandten sich an SIMD, um die Nachfrage zu befriedigen.[3] Hewlett-Packard wurde vorgestellt Max Anweisungen in Pa-risc 1.1 Desktops im Jahr 1994 zur Beschleunigung der MPEG -Dekodierung.[4] Sun Microsystems stellte SIMD Integer -Anweisungen in seine "ein" "Vis"Anleitungssatzerweiterungen im Jahr 1995 in seiner Ultrasparc i Mikroprozessor. MIPS folgte dem Beispiel mit ihren ähnlichen Mdmx System.

Die erste weit verbreitete Desktop -SIMD war bei Intel's MMX Erweiterungen zum x86 Architektur im Jahr 1996. Dies löste die Einführung der viel leistungsfähigeren aus Altivec System in der Motorola Powerpc und IBMs ENERGIE Systeme. Intel antwortete 1999 mit der Einführung des All-New Sse System. Seitdem gab es für beide Architekturen mehrere Erweiterungen zu den SIMD -Anweisungssätzen. Advanced Vector Extensions AVX, AVX2 und AVX-512 werden von Intel entwickelt. AMD unterstützt AVX und AVX2 in ihren aktuellen Produkten.

Alle diese Entwicklungen waren auf die Unterstützung von Echtzeitgrafiken ausgerichtet und sind daher in zwei, drei oder vier Dimensionen auf die Verarbeitung ausgerichtet, normalerweise mit Vektorlängen zwischen zwei und sechzehn Wörtern, abhängig von Datentyp und Architektur. Wenn neue SIMD-Architekturen von älteren unterschieden werden müssen, gelten die neueren Architekturen dann als "Kurzvektor-Architekturen", da frühere SIMD- und Vektor-Supercomputer Vektorlängen von 64 bis 64.000 hatten. Ein moderner Supercomputer ist fast immer ein Cluster von MIMD-Computern, von denen jede SIMD-Anweisungen (kurzvektor) implementiert.

Vorteile

Eine Anwendung, die SIMD nutzen kann Multimedia Anwendungen. Ein Beispiel wäre, die Helligkeit eines Bildes zu ändern. Jeder Pixel eines Bildes besteht aus drei Werten für die Helligkeit der rot (r), grünen (g) und blauen (b) -Teile der Farbe. Um die Helligkeit zu ändern, werden die R-, G- und B -Werte aus dem Speicher gelesen, ein Wert wird hinzugefügt (oder von) und die resultierenden Werte in den Speicher zurückgeschrieben. Audio DSPs würde auch für die Volumensteuerung sowohl links als auch rechte Kanäle gleichzeitig multiplizieren.

Bei einem SIMD -Prozessor gibt es zwei Verbesserungen an diesem Prozess. Zum einen wird die Daten in Blöcken verstanden, und eine Reihe von Werten kann auf einmal geladen werden. Anstelle einer Reihe von Anweisungen, in denen "dieses Pixel abrufen, jetzt das nächste Pixel abrufen" wird ein SIMD -Prozessor über eine einzige Anweisung verfügt, in der "N -Pixel abrufen" (wobei n eine Zahl von Design bis Design variiert). Aus einer Vielzahl von Gründen kann dies viel weniger Zeit in Anspruch nehmen als jedes Pixel einzeln wie bei einem herkömmlichen CPU -Design.

Ein weiterer Vorteil besteht darin, dass die Anweisung in allen geladenen Daten in einem einzigen Betrieb arbeitet. Mit anderen Worten, wenn das SIMD -System funktioniert, indem acht Datenpunkte gleichzeitig geladen werden, die hinzufügen Der Betrieb, der auf die Daten angewendet wird, werden gleichzeitig auf alle acht Werte stattfinden. Diese Parallelität ist von der von a bereitgestellten Parallelität getrennt Superscalar -Prozessor; Die acht Werte werden auch bei einem nicht-superscalarar-Prozessor parallel verarbeitet, und ein Supercalar-Prozessor kann möglicherweise mehrere SIMD-Operationen parallel ausführen.

Nachteile

Außerhalb von Spezialbereichen und Verwendungszwecken, für die SIMD große Einsparungen erzielt, können SIMD-Nachteile bei Verwendung für das allgemeine Umsatzberechnen nicht überbetont werden.

  • Nicht alle Algorithmen können leicht vektorisiert werden. Zum Beispiel eine fließungskontrollige Aufgabe wie Code Parsing kann nicht leicht von SIMD profitieren; Es ist jedoch theoretisch möglich, Vergleiche zu vectorisieren und "Batch Flow" Um die maximale Cache -Optimalität abzuzielen, erfordert diese Technik jedoch mehr Zwischenzustand. Hinweis: Batch-Pipeline-Systeme (Beispiel: GPUs oder Software-Rasterisierungspipelines) sind für die Cache-Steuerung am vorteilhaftesten, wenn sie mit SIMD-Intrinsics implementiert sind, sie sind jedoch nicht ausschließlich SIMD-Funktionen. Eine weitere Komplexität kann sichtbar sein, um die Abhängigkeit innerhalb von Reihen wie Code -Zeichenfolgen zu vermeiden. während für die Vektorisierung Unabhängigkeit erforderlich ist.[Klarstellung erforderlich]
  • Große Registerdateien, die den Stromverbrauch und den erforderlichen Chipbereich erhöhen.
  • Derzeit erfordert die Implementierung eines Algorithmus mit SIMD -Anweisungen in der Regel menschliche Arbeit. Die meisten Compiler generieren keine SIMD -Anweisungen von einem typischen C Programm zum Beispiel. Automatische Vektorisierung In Compilers ist ein aktives Gebiet der Informatikforschung. (Vergleichen Vektorverarbeitung.))
  • Die Programmierung mit bestimmten SIMD-Anweisungssätzen kann zahlreiche Herausforderungen auf niedriger Ebene beinhalten.
    1. SIMD kann Einschränkungen haben Datenausrichtung; Programmierer, die mit einer bestimmten Architektur vertraut sind, erwarten dies möglicherweise nicht. Schlimmer: Die Ausrichtung kann sich von einer Überarbeitung oder einem "kompatiblen" Prozessor zur anderen ändern.
    2. Das Sammeln von Daten in SIMD -Register und die Streuung an den richtigen Zielorten ist schwierig (manchmal erfordert Permute Operations) und kann ineffizient sein.
    3. Spezifische Anweisungen wie Rotationen oder Drei-Operand-Addition sind in einigen SIMD-Anweisungssätzen nicht verfügbar.
    4. Anweisungssätze sind architekturspezifisch: Einige Prozessoren fehlen die SIMD-Anweisungen vollständig, sodass Programmierer für sie nicht geprüfte Implementierungen (oder unterschiedliche vektorisierte Implementierungen) bereitstellen müssen.
    5. Unterschiedliche Architekturen bieten unterschiedliche Registergrößen (z. B. 64, 128, 256 und 512 Bit) und Anweisungssätze, was bedeutet, dass Programmierer mehrere Implementierungen von vektorisiertem Code bereitstellen müssen, um optimal bei einer bestimmten CPU zu arbeiten. Darüber hinaus wächst der mögliche Satz von SIMD -Anweisungen mit jeder neuen Registergröße. Leider können die älteren Versionen aus Legacy Support -Gründen nicht im Ruhestand geraten.
    6. Der frühe MMX Der Befehlssatz hat eine Registerdatei mit dem Gleitkomma-Stapel geteilt, der beim Mischen von Gleitkomma- und MMX-Code Ineffizienzen verursachte. Jedoch, SSE2 korrigiert das.

Probleme 1 und 5, um Probleme zu beheben, Risc-v's Vector Extension verwendet einen alternativen Ansatz: Anstatt den Details auf Unterregister dem Programmierer auszusetzen, werden sie mit diesem Befehlssatz als einige "Vektorregister" abtraht, die dieselben Schnittstellen über alle CPUs hinweg verwenden. Die Hardware behandelt alle Ausrichtungsprobleme und "Streifenabbau" von Schleifen. Maschinen mit unterschiedlichen Vektorgrößen könnten denselben Code ausführen. LLVM nennt diesen Vektortyp "vscale".

Die Nachteile von SIMD im Vergleich zu Vektorverarbeitung und selbst die skalare Verarbeitung für die Verwendung allgemeiner Zwecke kann nicht überbewertet werden. Eine Größenordnung der Codegröße ist im Vergleich zu äquivalenten Skalar- oder äquivalenten Vektorcode und einer Größenordnung nicht ungewöhnlich oder größer Effektivität (Arbeit pro Anweisung) ist mit Vector ISAs erreichbar[5]

Waffen Skalierbare Vektorerweiterung verfolgt einen anderen Ansatz, bekannt in Flynns Taxonomie als "assoziative Verarbeitung", die heute allgemein bekannt als "Vorhergesagt" (maskiert) Simd. Dieser Ansatz ist nicht so kompakt wie Vektorverarbeitung ist aber immer noch weitaus besser als nicht geschätzte SIMD. Detaillierte vergleichende Beispiele sind in der angegeben Vektorverarbeitung Seite.

Chronologie

Beispiele für SIMD -Supercomputer (nicht einbezogen Vektorprozessoren))
Jahr Beispiel
1974 ILLIAC IV
1974 ICL -verteilter Array -Prozessor (DAP)
1976 Burroughs wissenschaftlicher Prozessor
1981 Geometrisch-arithmetischer Parallelprozessor aus Martin Marietta (Fortsetzung bei Lockheed Martindann bei Teranex und Silizium optix))
1983-1991 Massiv paralleler Prozessor (MPP), von NASA/Goddard Space Flight Center
1985 Verbindungsmaschine, Modelle 1 und 2 (CM-1 und CM-2), von Denkmaschinen Corporation
1987-1996 Masspar MP-1 und MP-2
1991 Zephyr DC aus Wavetracer
2001 Xplor von Pyxsys, Inc.

Hardware

Simd in kleinem Maßstab (64 oder 128 Bit) wurde Anfang der neunziger Jahre bei allgemeiner Purpose-CPU Alpha. SIMD -Anweisungen finden Sie in den meisten CPUs, einschließlich der einen oder anderen Grad, einschließlich IBM's Altivec und spe für Powerpc, HP's Pa-risc Multimedia -Beschleunigungserweiterungen (Max), Intel's Mmx und iwmmxt, Sse, SSE2, SSE3 SSSE3 und SSE4.x, AMD's 3dnow!, BOGENARC Video Subsystem, Sparc's Vis und vis2, Sonne's Majc, ARM's Neon Technologie, MIPS' Mdmx (Madmax) und MIPS-3D. Das IBM, Sony, Toshiba entwickelte sich gemeinsam Zellprozessor's SpuDer Anweisungssatz ist stark simdbasiert. Philips, jetzt NXPentwickelte mehrere SIMD -Prozessoren, die benannt wurden Xetal. Der Xetal verfügt über 320 16-Bit-Prozessorelemente, die speziell für Sehaufgaben entwickelt wurden.

Modern Grafikverarbeitungseinheiten (GPUs) sind häufig große SIMD -Implementierungen, die Zweige, Lasten und Speichern auf 128 oder 256 Bit gleichzeitig in der Lage sind.

Intel ist neuest AVX-512 SIMD -Anweisungen verarbeiten jetzt 512 Datenbits gleichzeitig.

Software

Das gewöhnliche Verdreifachung von vier 8-Bit-Zahlen. Die CPU lädt eine 8-Bit-Nummer in R1, multipliziert sie mit R2 und spart dann die Antwort von R3 zurück zum RAM. Dieser Vorgang wird für jede Zahl wiederholt.
Das Simd-Verdreifachung von vier 8-Bit-Zahlen. Die CPU lädt 4 Zahlen gleichzeitig, multipliziert sie alle in einer SIMD-Multiplikation und spart sie alle gleichzeitig dem RAM zurück. Theoretisch kann die Geschwindigkeit mit 4 multipliziert werden.

SIMD -Anweisungen werden häufig verwendet, um 3D -Grafiken zu verarbeiten, obwohl modern Grafikkarten Mit eingebetteter SIMD haben diese Aufgabe weitgehend von der CPU übernommen. Einige Systeme enthalten auch Permute-Funktionen, die Elemente in Vektoren neu packen, wodurch sie für die Datenverarbeitung und -komprimierung besonders nützlich sind. Sie werden auch in der Kryptographie verwendet.[6][7][8] Der Trend des Allzweck-Computing bei GPUs (Gpgpu) kann in Zukunft zu einer breiteren Verwendung von SIMD führen.

Einführung von SIMD -Systemen in persönlicher Computer Die Software war aufgrund einer Reihe von Problemen zunächst langsam. Eines war, dass viele der frühen SIMD-Anweisungssätze aufgrund der Wiederverwendung bestehender schwimmender Punktregister dazu neigten, die Gesamtleistung des Systems zu verlangsamen. Andere Systeme wie MMX und 3dnow!, boten Unterstützung für Datentypen an, die für ein breites Publikum nicht interessant waren und teure Kontextanweisungen zum Umschalten zwischen der Verwendung der Verwendung hatten FPU und mmx Register. Compiler fehlten auch häufig Unterstützung Montagesprache Codierung.

Simd on x86 hatte einen langsamen Start. Die Einführung von 3dnow! durch AMD und Sse durch Intel Verwirrte Angelegenheiten etwas, aber heute scheint sich das System niedergelassen zu haben (nachdem AMD SSE übernommen wurde) und neuere Compiler sollten zu mehr SIMD-fähiger Software führen. Intel und AMD liefern jetzt beide optimierte mathematische Bibliotheken, die SIMD -Anweisungen verwenden, und Open -Source -Alternativen wie LibSimd, Simdx86 und Sleef werden begonnen (siehe auch libm).[9]

Apple Computer hatte etwas mehr Erfolg, obwohl sie später als die anderen in den Simd -Markt eingetreten waren. Altivec bot ein reichhaltiges System und kann mit zunehmend ausgefeilteren Compilern von programmiert werden Motorola, IBM und GNUDaher ist selten die Programmierung der Montagesprachenprogrammierung erforderlich. Darüber hinaus wurden viele der Systeme, die von SIMD profitieren würden, zum Beispiel von Apple selbst geliefert iTunes und Schnelle Zeit. Im Jahr 2006 wechselten Apple Computers jedoch zu Intel X86 -Prozessoren. Äpfel Apis und Entwicklungswerkzeuge (Xcode) wurden modifiziert, um sie zu unterstützen SSE2 und SSE3 sowie Altivec. Apple war der dominierende Käufer von Powerpc -Chips von IBM und Freescale Semiconductor Und obwohl sie die Plattform aufgegeben haben, wird die weitere Entwicklung von Altivec in mehreren fortgesetzt Powerpc und Macht ISA Entwürfe von Freescale und IBM.

Simd innerhalb eines Registers, oder SWAR, ist eine Reihe von Techniken und Tricks, die für die Durchführung von SIMD in allgemeinen Registern für Hardware verwendet werden, die keine direkte Unterstützung für SIMD-Anweisungen bieten. Dies kann verwendet werden, um die Parallelität in bestimmten Algorithmen selbst auf Hardware zu nutzen, die SIMD nicht direkt unterstützt.

Programmierschnittstelle

Es ist üblich, dass Verlage der SIMD -Anweisungssätze ihre eigenen C/C ++ - Sprachverlängerungen mit Intrinsische Funktionen oder spezielle Datenatypen (mit Bedienerüberlastung) Gewährleistung der Erzeugung des Vektorcode. Intel, Altivec und Arm Neon bieten Erweiterungen, die von den Compilern, die auf ihre CPUs abzielen, weit verbreitet. (Komplexere Operationen sind die Aufgabe der Vektor -Mathematikbibliotheken.)

Das GNU C Compiler Stellt die Erweiterungen einen Schritt weiter durch, indem sie in eine universelle Schnittstelle abstrahiert werden, die auf jeder Plattform verwendet werden kann, indem eine Möglichkeit zur Definition von SIMD -Datentypen bereitgestellt wird.[10] Das Llvm Der Clang -Compiler implementiert auch die Funktion mit einer im IR definierten analogen Schnittstelle.[11] Rusts paket_simd crate verwendet diese Schnittstelle, und so tut es auch Schnell 2.0+.

C ++ hat eine experimentelle Schnittstelle std::experimental::simd Das funktioniert ähnlich wie bei der GCC -Erweiterung. LIBCXX von LLVM scheint es zu implementieren. Für GCC und LIBSTDC ++ ist eine Wrapper -Bibliothek verfügbar, die auf der GCC -Erweiterung aufbaut.[12]

Microsoft Simd hinzugefügt zu .NETZ in Ryujit.[13] Das System.Numerics.Vector Paket, verfügbar auf Nuget, implementieren Sie SIMD -Datentypen.[14] Java hat auch eine neue vorgeschlagene API für SIMD -Anweisungen [15] verfügbar in OpenJDK 17 in einem Inkubatormodul. Es hat auch einen sicheren Fallback -Mechanismus für nicht unterstützte CPUs zu einfachen Schleifen.

Anstatt einen SIMD-Datentyp bereitzustellen, können Compiler auch darauf hingewiesen werden, einige Schleifen automatisch zu untersuchen, wodurch einige Behauptungen über den Mangel an Datenabhängigkeit angenommen werden können. Dies ist nicht so flexibel wie die direkte Manipulation von SIMD -Variablen, aber einfacher zu bedienen. OpenMP 4.0+ hat a #pragma omp simd Hinweis.[16] Diese OpenMP -Schnittstelle hat eine Vielzahl von nicht standardmäßigen Erweiterungen ersetzt, einschließlich Cilk's #pragma simd.,[17] GCCs #pragma GCC ivdep, und viele mehr.[18]

Simd Multi-Version

Es wird in der Regel erwartet, dass Verbrauchersoftware an einer Reihe von CPUs funktioniert, die mehrere Generationen abdecken, was die Fähigkeit des Programmierers, neue SIMD -Anweisungen zu verwenden, um die Rechenleistung eines Programms zu verbessern. Die Lösung besteht darin, mehrere Versionen desselben Codes zu enthalten, die entweder ältere oder neuere SIMD-Technologien verwendet, und eine ausgewählt werden, die zur Laufzeit am besten zur CPU des Benutzers passt (zur Laufzeit (Dynamischer Versand). Es gibt zwei Hauptlösungen mit Lösungen:

  • Funktion Multi-Versioning (FMV): a Subroutine Im Programm oder einer Bibliothek wird für viele Anweisungssatzerweiterungen dupliziert und zusammengestellt, und das Programm entscheidet, welche zur Laufzeit verwendet werden soll.
  • Bibliothek Multi-Versioning (LMV): das gesamte Programmierbibliothek wird für viele Anweisungssatzerweiterungen dupliziert, und das Betriebssystem oder das Programm entscheidet, welche zur Laufzeit geladen werden soll.

FMV, manuell in der Assemblersprache kodiert, wird in einer Reihe von leistungskritischen Bibliotheken wie GLIBC und Libjpeg-Turbo häufig verwendet. Intel C ++ - Compiler, GNU Compiler -Sammlung Seit GCC 6 und Klang Da Clang 7 einen vereinfachten Ansatz ermöglicht, wobei der Compiler die Funktionsverdoppelung und -auswahl sorgt. GCC und Clang benötigen explizit target_clones Etiketten im Code zum "Klon" -Funktionen,[19] während ICC dies automatisch macht (unter der Befehlszeilenoption /Qax). Das Rost -Programmiersprache Unterstützt auch FMV. Das Setup ähnelt GCC und Clang dadurch, dass der Code definiert, für welche Anweisungssätze er kompiliert werden sollen, das Klonen jedoch manuell durch Inlining erfolgen wird.[20]

Da die Verwendung von FMV auf GCC und Clang eine Codeänderung erfordert, verwenden die Anbieter häufiger Bibliotheksmulti-Versionen: Dies ist einfacher zu erreichen, da nur Compiler-Switches geändert werden müssen. Glibc Unterstützt LMV und diese Funktionalität wird vom Intel-Backed Clear Linux-Projekt übernommen.[21]

Simd im Web

2013 gab John McCutchan bekannt, dass er eine Hochleistungsschnittstelle zu SIMD-Anweisungssätzen für die erstellt habe Pfeil Programmiersprache, die zum ersten Mal die Vorteile von SIMD für Webprogramme bringt. Die Schnittstelle besteht aus zwei Typen:[22]

  • Float32x4, 4 einzelne Präzisionsschwimmpunktwerte.
  • INT32X4, 4 32-Bit Ganzzahlwerte.

Instanzen dieser Typen sind unveränderlich und im optimierten Code werden direkt auf SIMD -Register abgebildet. Operationen, die in Dart ausgedrückt werden, werden typischerweise in eine einzelne Anweisung ohne Overhead zusammengestellt. Dies ist ähnlich wie bei C und C ++ Intrinsics. Benchmarks für 4 × 4 Matrix-Multiplikation, 3D -Vertex -Transformation, und Mandelbrot Set Die Visualisierung wird im Vergleich zum in Dart geschriebenen Skalarcode nahe 400% beschleunigt.

McCutchans Arbeit an Dart, jetzt Simd.js genannt, wurde von übernommen von übernommen von ECMaskript und Intel gab bei IDF 2013 bekannt, dass sie die Spezifikation von McCutchan für beide implementieren V8 und Spinnenaffe.[23] Bis 2017 wurde Simd.js jedoch aus der ECMascript -Standardwarteschlange herausgenommen, um eine ähnliche Schnittstelle zu verfolgen WebAssembly.[24] Ab August 2020 bleibt die Webassembly-Schnittstelle unvollendet, aber in der tragbaren 128-Bit-SIMD-Funktion wurde bereits in vielen Motoren einige Verwendung verwendet.

EMSCIPTEN, MOZILLAs C/C ++-To-JavaScript-Compiler, mit Erweiterungen können die Zusammenstellung von C ++-Programmen ermöglichen, die SIMD-Intrinsics oder GCC-Vektorcode für die SIMD-API von JavaScript verwenden, was zu Speedups im Vergleich zu Skalarcode führt.[25] Es unterstützt (und bevorzugt jetzt) ​​den 128-Bit-SIMD-Vorschlag von WebAssembly.[26]

Kommerzielle Anwendungen

Obwohl es sich im Allgemeinen als schwierig erwiesen hat, nachhaltige kommerzielle Anwendungen für SIMD-Prozessoren zu finden, ist eine ein gewisses Maß an Erfolg Gapp, was entwickelt wurde von Lockheed Martin und durch ihren Spin-off Teranex in den Handelssektor gebracht. Die jüngsten Inkarnationen der GAPP sind in Echtzeit zu einem leistungsfähigen Werkzeug geworden Videoverarbeitung Anwendungen wie Konvertierung zwischen verschiedenen Videostandards und Bildraten (Frameraten (Ntsc an/von KUMPEL, NTSC nach/von HDTV Formate usw.), Deinterlasieren, Bildrauschen Reduktion, adaptiv Video-Kompressionund Bildverbesserung.

Eine allgegenwärtigere Anwendung für SIMD ist in Videospiele: Fast jede Moderne Videospielkonsole seit 1998 hat einen SIMD -Prozessor irgendwo in seine Architektur aufgenommen. Das Playstation 2 war insofern ungewöhnlich, als eine seiner Vektor-Flusseinheiten als autonom fungieren konnte DSP Ausführung eines eigenen Anweisungsstroms oder als Coprozessor, der von gewöhnlichen CPU -Anweisungen angetrieben wird. 3D-Grafikanwendungen eignen sich in der Regel gut für die SIMD-Verarbeitung, da sie stark auf Operationen mit 4-dimensionalen Vektoren angewiesen sind. Microsoft's Direct3d 9.0 Wählt nun im Laufzeit-Prozessor-spezifische Implementierungen seiner eigenen mathematischen Operationen, einschließlich der Verwendung von SIMD-fähigen Anweisungen.

Einer der jüngsten Prozessoren zur Verwendung der Vektorverarbeitung ist die Zellprozessor entwickelt von IBM in Zusammenarbeit mit Toshiba und Sony. Es verwendet eine Reihe von SIMD -Prozessoren (a Numa Architektur, jeweils unabhängig lokaler Laden und von einer allgemeinen CPU gesteuert) und richtet sich an die riesigen Datensätze, die von 3D- und Videoverarbeitungsanwendungen erforderlich sind. Es unterscheidet sich von traditionellen ISAs, indem es von Grund auf ohne separate skalare Register simd wird.

Ziilabs erstellte einen SIMD -Prozessor für die Verwendung auf mobilen Geräten wie Medienspieler und Mobiltelefonen.[27]

Ganzere kommerzielle SIMD -Prozessoren sind bei Clearspeed Technology, Ltd. und Stream Processors, Inc. erhältlich. Clearspeed's CSX600 (2004) hat jeweils 96 Kerne mit zwei schwebenden Punkteinheiten mit zwei Präzisions, während der CSX700 (2008) 192. Stream-Prozessoren von Computerarchitekten geleitet wird Bill Dally. Ihr Storm-1-Prozessor (2007) enthält 80 SIMD-Kerne, die von einer MIPS-CPU gesteuert werden.

Siehe auch

Verweise

  1. ^ Flynn, Michael J. (September 1972). "Einige Computerorganisationen und ihre Effektivität" (PDF). IEEE -Transaktionen auf Computern. 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). "Die lange und kurvenreiche Straße zur Hochleistungsbildverarbeitung mit MMX/SSE". Proc. Fünfter IEEE INT'L Workshop über Computerarchitekturen für die Wahrnehmung von Maschinen. doi:10.1109/camp.2000.875989. HDL:11381/2297671. S2CID 13180531.
  4. ^ Lee, R. B. (1995). "Echtzeit-MPEG-Video über Software-Dekompression auf einem PA-RISC-Prozessor". Digest of Papers Compcon '95. Technologien für die Information Superhighway. S. 186–192. doi:10.1109/cmpcon.1995.512384. ISBN 0-8186-7029-0. S2CID 2262046.
  5. ^ Patterson, David; Waterman, Andrew (18. September 2017). "SIMD -Anweisungen gilt als schädlich". Sigarch.
  6. ^ Re: SSE2 Geschwindigkeitund zeigen, wie SSE2 zur Implementierung von SHA -Hash -Algorithmen verwendet wird
  7. ^ Salsa20 -Geschwindigkeit; Salsa20 -Softwaremit einer mit SSE2 implementierten Stream -Chiffre anzeigen
  8. ^ Betreff: Bis zu 1,4x RSA -Durchsatz mit SSE2, Anzeigen von RSA mit einem nicht-SIMD-SSE2-Ganzzahl-Multiplikationsanweisungen.
  9. ^ "SIMD Library Mathematch Funktionen". Paketüberfluss. Abgerufen 16. Januar 2020.
  10. ^ "Vektorerweiterungen". Verwenden der GNU Compiler Collection (GCC). Abgerufen 16. Januar 2020.
  11. ^ "Klangspracherweiterungen". Klang 11 Dokumentation. Abgerufen 16. Januar 2020.
  12. ^ "Vcdevel/std-simd". Vcdevel. 6. August 2020.
  13. ^ "Ryujit: Der JIT-Compiler der nächsten Generation für .NET".
  14. ^ "Die JIT hat schließlich vorgeschlagen. Jit und Simd heiraten".
  15. ^ "JEP 338: Vector API".
  16. ^ "SIMD -Richtlinien". www.openmp.org.
  17. ^ "Tutorial Pragma Simd". Cilkplus. 18. Juli 2012.
  18. ^ Kruse, Michael. "Omp5.1: Schleifentransformationen" (PDF).
  19. ^ "Funktion Multi-Version in GCC 6". lwn.net.
  20. ^ "2045-Target-Feature". Das Rost -RFC -Buch.
  21. ^ "Transparente Verwendung von Bibliothekspaketen für Intel® -Architektur optimiert". Clear Linux* Projekt. Abgerufen 8. September 2019.
  22. ^ John McCutchan. "SIMD über Dart ins Web bringen" (PDF). Archiviert von das Original (PDF) Am 2013-12-03.
  23. ^ "Simd in JavaScript". 01.org. 8. Mai 2014.
  24. ^ "TC39/ecmascript_simd: SIMD numerischer Typ für ECMascript". GitHub. ECMA TC39. 22. August 2019. Abgerufen 8. September 2019.
  25. ^ Jensen, Peter; Jibaja, Ivan; Hu, Ningxin; Gohman, Dan; McCutchan, John (2015). "SIMD in JavaScript über C ++ und EMSCIPTEN" (PDF). {{}}: Journal zitieren erfordert |journal= (Hilfe)
  26. ^ "Portierung von SIMD -Code -Targeting -WebAssembly". EMSCIPTEN 1.40.1 Dokumentation.
  27. ^ "Ziilabs ZMS-05 Arm 9 Medienprozessor". Ziilabs. Archiviert von das Original Am 2011-07-18. Abgerufen 2010-05-24.

Externe Links