Ugrás a tartalomhoz

SIMD

Ellenőrzött
A Wikipédiából, a szabad enciklopédiából
Egyetlen utasítás, több adat (Data pool: adatkészlet, Instruction pool: utasításkészlet, PU: végrehajtó egység, Vector unit: vektoros egység)

Single instruction, multiple data (SIMD, magyarul: egyetlen utasítás, több adat) a párhuzamos számítógépek egyik osztálya a Flynn-féle osztályozásban. Több olyan feldolgozóelemmel rendelkező számítógépeket ír le, amelyek egyszerre több adatponton ugyanazt a műveletet hajtják végre. Az ilyen gépek kihasználják az adat-párhuzamosságot, de nem a feladat-párhuzamosságot: vannak párhuzamos számítások, de csak egyetlen utasítás egy adott pillanatban. A SIMD különösen alkalmas olyan feladatokra, mint például a digitális kép kontrasztjának vagy a digitális hang hangerejének módosítása, vagy mátrixműveletek számítása. A legtöbb modern processzorterv tartalmaz SIMD utasításokat a multimédia feladatok teljesítménye javítása érdekében. A SIMD nem tévesztendő össze a SIMT-el, amely szálakat használ.

Történelem

[szerkesztés]

A SIMD utasításokat először az ILLIAC IV-ben használták, amely 1966-ban készült el.

A SIMD volt az alapja az 1970-es évek eleji vektor szuperszámítógépeknek, mint például a CDC Star-100 és a Texas Instruments ASC, amelyek egyetlen utasítással képesek működni egy adat-vektoron. A vektorfeldolgozást a Cray számítógép-gyártó népszerűsítette, különösen az 1970-es és 1980-as években. A vektorfeldolgozó architektúrákat ma külön tekintik a SIMD számítógépektől, azon a tényen alapulva, hogy a vektoros számítógépek a vektorok elemeit egyenként dolgozták fel a futószalagos processzorokon keresztül (bár még mindig egyetlen utasítás alapján), míg a modern SIMD számítógépek a vektor minden elemét párhuzamosan dolgozzák fel.[1]

A modern SIMD számítógépek első korszakát masszívan párhuzamosan feldolgozott stílusú szuperszámítógépek jellemezték, mint például a Thinking Machines CM-1 és CM-2. Ezeknek a számítógépeknek sok korlátozott funkcionalitású processzoruk volt, amelyek párhuzamosan működtek. Például a Thinking Machines CM-2 65536 egybites processzora mindegyike ugyanazt az utasítást hajtja végre, lehetővé téve például 65536 bit logikai kombinációját egyszerre, egy hiperkockához csatlakoztatott hálózat vagy processzorhoz dedikált RAM használatával, operandusainak megtalálásához. A szuperszámítástechnika eltávolodott a SIMD-megközelítéstől, amikor az olyan gyakori processzorokon alapuló olcsó és skaláris MIMD megközelítések, mint az Intel i860 XP,[2] erőteljesebbé váltak, és a SIMD iránti érdeklődés alábbhagyott.

A SIMD processzorok jelenlegi korszaka az asztali számítógépek piacáról nőtt ki, nem pedig a szuperszámítógépek piacáról. Amint az asztali processzorok az 1990-es években eléggé hatékonyak lettek a valós idejű játék és audio/video feldolgozás támogatásához, nőtt a kereslet az ilyen típusú számítási teljesítmény iránt, és a mikroprocesszorok gyártói a SIMD-hez fordultak, hogy kielégítsék az igényeket.[3] A Hewlett-Packard 1994-ben bevezette a MAX utasításokat a PA-RISC 1.1 asztali számítógépekbe az MPEG dekódolás felgyorsítása érdekében.[4] A Sun Microsystems 1995-ben bevezette a SIMD egész számú (fixpontos, integer) utasításokat a VIS utasításkészlet-kiterjesztésbe, az UltraSPARC I mikroprocesszorba. A MIPS követte példáját hasonló MDMX utasításkészlet-kiterjesztésével.

Az első széles körben telepített asztali SIMD az Intel MMX kiterjesztése volt az x86 architektúrára 1996-ban. Ez elindította a sokkal erősebb AltiVec rendszer bevezetését a Motorola PowerPC és az IBM POWER rendszereiben. Az Intel 1999-ben válaszolt a vadonatúj SSE rendszer bevezetésével. Azóta számos kiterjesztés van a SIMD utasításkészletekhez mindkét architektúrához.[5]

Mindezek a fejlesztések a valós idejű grafika támogatására irányultak, ezért két, három vagy négy dimenzióban történő feldolgozásra irányulnak, általában két és tizenhat szó közötti vektorhosszal, az adattípustól és az architektúrától függően. Amikor meg kell különböztetni az új SIMD architektúrákat a régiektől, akkor az újabb architektúrákat „rövid vektoros” architektúrának tekintik, mivel a korábbi SIMD és vektor szuperszámítógépek vektorhossza 64–64000 volt. A modern szuperszámítógép szinte mindig a MIMD számítógép, amelyek mindegyike (rövid vektorú) SIMD utasításokat hajt végre.

Előnyök

[szerkesztés]

Az az alkalmazás, amely kihasználhatja a SIMD előnyeit, olyan alkalmazás, ahol ugyanazt az értéket adják hozzá (vagy vonják ki) sok adatponthoz, ami sok multimédiás alkalmazásban általános művelet. Ilyen például a kép fényerejének megváltoztatása. A kép minden képpontja a piros (R), zöld (G) és kék (B) színek fényerejének értékeiből áll. A fényerő megváltoztatásához az R, G és B értékeket beolvassák a memóriából, hozzáadnak (vagy kivonnak belőlük) egy értéket, és a kapott értékeket visszaírják a memóriába.

Egy SIMD processzorral két fejlesztés érhető el. Az egyik esetben az adatok blokkokban értendők, és egyszerre számos értéket lehet betölteni. Az "olvasd ki ezt a képpontot, most pedig a következő képpontot" utasítássorozat helyett a SIMD processzor egyetlen utasítással rendelkezik, amely gyakorlatilag azt mondja, hogy "n pixelt olvass ki" (ahol n olyan szám, amely tervenként változik). Különböző okokból ez sokkal kevesebb időt vehet igénybe, mint az egyes pixelek külön-külön történő lekérése, ami egy hagyományos CPU-kialakításban történik.

További előny, hogy az utasítás az összes betöltött adaton működik egyetlen művelet alatt. Más szavakkal, ha a SIMD rendszer nyolc adatpont egyszerre történő feltöltésével működik, akkor az adatokra alkalmazott add művelet mind a nyolc értékre egyszerre fog bekövetkezni. Ez a párhuzamosság elkülönül a szuperskalár processzor által biztosított párhuzamosságtól; a nyolc értéket párhuzamosan dolgozzák fel még nem szuperkalár processzoron is, és egy szuperkalár processzor képes lehet több SIMD művelet párhuzamos végrehajtására.

Hátrányok

[szerkesztés]
  • Nem minden algoritmus könnyen vektorizálható. Például egy flow-control alapú feladat, mint a kód elemzés nem könnyen szerez előnyt a SIMD használatával; elméletileg azonban lehetséges az összehasonlítások és a "kötegelt áramlás" vektorizálása a gyorsítótár maximális optimalizálása érdekében, bár ez a technika több közbenső állapotot igényel.
  • A SIMD nagy regiszterfájlokat igényel, amelyek növelik az energiafogyasztást és a szükséges chipterületet.
  • Jelenleg egy algoritmus SIMD utasításokkal történő megvalósítása általában emberi munkát igényel; a legtöbb fordító nem generál SIMD utasításokat például egy tipikus C programból. Az automatikus vektorizálás a fordítókban a számítástechnika kutatásának egyik aktív területe.
  • Bizonyos SIMD utasításkészletekkel történő programozás számos alacsony szintű kihívást jelenthet.
    1. A SIMD korlátozhatja az adatstruktúrák igazítását; egy adott architektúrát ismerő programozók erre lehet, hogy nem számítanak.
    2. Az adatok begyűjtése a SIMD regiszterekbe és szétszórása a megfelelő rendeltetési helyekre bonyolult (néha permutációs műveleteket igényel) és nem hatékony.
    3. Bizonyos utasítások, például forgatás vagy háromoperandusos összeadás, nem állnak rendelkezésre egyes SIMD utasításkészletekben.
    4. Az utasításkészletek architektúra-specifikusak: egyes processzorokból hiányoznak a SIMD utasítások, ezért a programozóknak nem vektorizált megvalósításokat (vagy különböző vektorizált megvalósításokat) kell biztosítaniuk számukra.
    5. A különböző architektúrák különböző regiszterméreteket (pl. 64, 128, 256 és 512 bit) és utasításkészleteket biztosítanak, ami azt jelenti, hogy a programozóknak többféle vektorizált kódot kell megvalósítaniuk, hogy optimálisan működjenek bármely adott processzoron. Ezenkívül a lehetséges SIMD utasításkészlet minden új regisztermérettel növekszik.
    6. A korai MMX utasításkészlet megosztott egy regiszter fájlt a lebegőpontos veremmel, ami lassúságot okozott a lebegőpontos és az MMX kód keverésekor. Az SSE2 azonban ezt kijavítja.

Az 1. és 5. probléma orvoslására a RISC-V vektorkiterjesztése és az ARM skálázható vektorbővítménye alternatív megközelítést alkalmaznak: ahelyett, hogy az alregiszterszintű részleteket a programozó elé tárnák, az utasításkészlet néhány "vektorregiszterként" vonja ki őket, amelyek ugyanazt a interfészt használják az összes CPU-n ezzel az utasításkészlettel. A hardver kezeli az összes igazítási problémát. A különböző vektorméretű gépek képesek ugyanazt a kódot futtatni.[6] Az LLVM ezt vscale-nek nevezi.

Kronológia

[szerkesztés]

Példák a SIMD szuperszámítógépekre (a vektorprocesszorokat kihagyva):

Hardver

[szerkesztés]

A kis méretű (64 vagy 128 bites) SIMD az 1990-es évek elején népszerűvé vált az általános célú processzorokban, és 1997-ig és később, az Alpha Motion Video Instructions (MVI) alkalmazásával folytatódott. A SIMD utasítások bizonyos mértékben megtalálhatók a legtöbb processzoron (IBM AltiVec és SPE for PowerPC, a HP PA-RISC Multimedia Acceleration eXtensions (MAX), az Intel MMX és iwMMXt, SSE, SSE2, SSE3 SSSE3 és SSE4.x, az AMD 3DNow!, az ARC ARC Video alrendszere, SPARC VIS és VIS2, a Sun MAJC, az ARM Neon technológiája, MIPS MDMX (MaDMaX), MIPS-3D). Az IBM, a Sony, a Toshiba által közösen fejlesztett Cell Processor SPU utasításkészlete erősen SIMD alapú. A Philips, jelenleg NXP, számos Xetal nevű SIMD processzort fejlesztett ki. A Xetal 320 16 bites processzorelemmel rendelkezik, amelyeket kifejezetten a látási feladatokhoz terveztek.

A modern grafikus processzorok (GPU-k) gyakran széles SIMD-megvalósítások, amelyek egyszerre 128 vagy 256 biten képesek elágazásokra, betöltésekre és tárolásra.

Az Intel legújabb AVX-512 SIMD utasításai mostantól 512 bit adatot dolgoznak fel egyszerre.

Szoftver

[szerkesztés]
Négy 8 bites szám nem-SIMD háromszorozása. A processzor egy 8 bites számot tölt be az R1-be, megszorozza az R2-vel, majd az R3-ból visszamenti a választ a RAM-ba. Ez a folyamat megismétlődik minden számnál.
Négy 8 bites szám SIMD háromszorozása. A CPU egyszerre 4 számot tölt be, mindet egy SIMD-szorzásban megszorozza, és mindet egyszerre menti vissza a RAM-ba. Elméletileg a sebesség megszorozható 4-gyel.

A SIMD utasításokat széles körben használják a három dimenziós grafika feldolgozására, bár a beágyazott SIMD-el ellátott modern grafikus kártyák nagyrészt átvették ezt a feladatot a CPU-tól. Bizonyos rendszerek permutációs funkciókat is tartalmaznak, amelyek újracsomagolják az elemeket a vektorok belsejébe, ami különösen hasznos az adatfeldolgozáshoz és a tömörítéshez. A kriptográfiában is használják őket.[7][8][9] Az általános célú számítások a grafikus kártyán (GPGPU) gyakoribbá válása a SIMD szélesebb körű alkalmazásához vezethet a jövőben.

A SIMD rendszerek bevezetése a személyi számítógépes szoftverekben eleinte lassú volt számos probléma miatt. Az egyik az volt, hogy a korai SIMD utasításkészletek közül sokan lassították a rendszer teljes teljesítményét a meglévő lebegőpontos regiszterek újrafelhasználása miatt. Más rendszerek, például az MMX és a 3DNow!, támogatást kínált olyan adattípusokhoz, amelyek nem voltak hasznosak a széles közönség számára, és drága környezetváltási utasításokkal rendelkeztek az FPU és az MMX regiszterek közötti váltáshoz. A fordítóknak gyakran nem támogatták a SIMD-et, ezért a programozók csak Assembly-ben tudtak SIMD műveleteket használni.

Az x86-os SIMD lassan indult. A 3DNow! és SSE bevezetésével kissé megzavarodtak a dolgokat, de ma úgy tűnik, hogy a rendszer rendeződött (miután az AMD támogatni kezdte az SSE-t), és az újabb fordítók használatának több SIMD-kompatibilis szoftvert kell eredményeznie. Az Intel és az AMD most is kínál optimalizált matematikai könyvtárakat, amelyek SIMD utasításokat használnak, és nyílt forráskódú alternatívák jelentek meg, mint például a libSIMD, a SIMDx86 és a SLEEF (lásd még a libm-et).[10]

Az Apple Computer valamivel több sikert ért el, annak ellenére, hogy később léptek be a SIMD piacra, mint a többi. Az AltiVec gazdag rendszert kínált, és a Motorola, az IBM és a GNU egyre kifinomultabb fordítóinak segítségével programozhatóvá vált, ezért Assembly programozásra ritkán volt szükség. Ezenkívül számos olyan rendszert, amely számára előnyös lenne a SIMD, maga az Apple készítette, például az iTunes és a QuickTime. 2006-ban azonban az Apple számítógépei az Intel x86 processzorokhoz kerültek. Az Apple API-jait és fejlesztői eszközeit (XCode) úgy módosították, hogy támogassák az SSE2-t és SSE3-at, valamint az AltiVec-et. Az Apple volt a PowerPC chipek legnagyobb vásárlója az IBM-től és a Freescale Semiconductor-tól, és annak ellenére, hogy elhagyták a platformot, az AltiVec további fejlesztését a Freescale és az IBM számos PowerPC és Power ISA terv folytatja.

A SIMD a regiszterben (SWAR) egy olyan technikál és trükkök sorozata, amelyet a SIMD általános célú regiszterekben történő végrehajtására használnak olyan hardvereken, amelyek nem nyújtanak közvetlen támogatást a SIMD utasításainak. Ez felhasználható bizonyos algoritmusokban a párhuzamosság kihasználására olyan hardvereken is, amelyek nem támogatják közvetlenül a SIMD-et.

Gyakran előfordul, hogy a SIMD utasításkészletek kiadói saját C vagy C++ nyelvű kiterjesztéseket készítenek belső funkciókkal vagy speciális adattípusokkal, amelyek garantálják a vektorkód generálását. Az Intel, az AltiVec és az ARM NEON olyan kiterjesztéseket kínál, amelyeket a fordítók széles körben alkalmaznak a processzoraikat megcélozva. (A bonyolultabb műveletek a vektor matematikai könyvtárak feladata.)

A GNU C fordító egy lépéssel előbbre hozza a kiterjesztéseket, univerzális interfésszé elvonatkoztatva őket, amelyek bármely platformon használhatók, biztosítva a SIMD adattípusok definiálását.[11] Az LLVM Clang fordító szintén implementálja ezt a funkciót, az IR-ben definiált hasonló interfésszel.[12] A Rust pack_simd csomagja ezt a interfészt használja, és a Swift 2.0+ is.

A C ++ rendelkezik egy interfésszel, amely hasonlóan működik, mint a GCC kiterjesztése. Úgy tűnik, hogy az LLVM libcxx implementálja. A GCC és a libstdc++ esetén elérhető egy csomagoló könyvtár, amely a GCC kiterjesztés tetejére épít.[13]

A Microsoft hozzáadta a SIMD-t a .NET-hez a RyuJIT-ben.[14] A NuGeten elérhető System.Numerics.Vector csomag SIMD adattípusokat valósít meg.[15]

A SIMD adattípus megadása helyett a fordítóknak is fel lehet hívni a figyelmét, hogy egyes hurkok automatikusan vektorizálódjanak. Ez nem annyira rugalmas, mint a SIMD-változók közvetlen manipulálása, de könnyebben használható. Az OpenMP 4.0+ az alábbi tippet tartalmazza:[16]

#pragma omp simd

A Cilk hasonló tulajdonsággal rendelkezik:[17]

#pragma simd

A GCC-nek és a Clang-nak is vannak saját privát pragmái a hurkok vektorizálhatóvá tételéhez, de mindhármat elavulttá tette az OpenMP.

Több-verziós SIMD

[szerkesztés]

A fogyasztói szoftverek várhatóan általában több CPU-generációval működnek, ami korlátozhatja a programozó azon képességét, hogy új SIMD utasításokat használjon a program számítási teljesítményének javítására. A megoldás az, hogy ugyanannak a kódnak több verzióját tartalmazza, amely vagy régebbi, vagy újabb SIMD technológiákat használ, és kiválaszt egyet, amely a legjobban illeszkedik a felhasználó processzorához futás közben (dinamikus diszpécser). A megoldásoknak két fő tábora van:

  • Több funkció verzió: a program vagy egy könyvtár szubrutinját sok utasításkészlet-kiterjesztéshez lemásolják és összeállítják, és a program eldönti, hogy melyiket használja futás közben.
  • Több könyvtár verzió: a teljes programkönyvtár sok utasításkészlet-kiterjesztéshez duplikálva van, és az operációs rendszer vagy a program eldönti, hogy melyiket töltse be futás közben.

Az előbbi megoldást az Intel C ++ Compiler, a GNU Compiler Collection támogatja a GCC 6 óta, a Clang pedig a 7-es óta.[18]

SIMD az interneten

[szerkesztés]

2013-ban John McCutchan bejelentette, hogy nagy teljesítményű interfészt hozott létre a SIMD utasításkészleteihez a Dart programozási nyelv számára, és ezzel először hozta meg a SIMD előnyeit a webes programokban. Az interfész két típusból áll:[19]

  • Float32x4, 4 egypontos lebegőpontos érték.
  • Int32x4, 4 32 bites egész szám.

Az ilyen típusú példányok változhatatlanok, és az optimalizált kódban közvetlenül a SIMD regiszterekhez vannak hozzárendelve. A Dart-ban kifejezett műveleteket általában egyetlen utasításba állítják össze. Ez hasonló a C és a C++ működéséhez. A 4×4-es mátrixszorzás, a 3D-s csúcstranszformáció és a Mandelbrot-halmaz vizualizációjának benchmarkjai közel 400%-os gyorsulást mutatnak a Dartban írt skalárkódhoz képest.

McCutchan Dart-on való munkája, amit most SIMD.js-nek neveznek, már implementálta az ECMAScript és az Intel bejelentette, hogy implementálják McCutchan specifikációját a V8-ba és SpiderMonkey-ba.[20] Azonban 2017-re a SIMD.js-t kivették az ECMAScript szabvánból annak érdekében, hogy hasonló interfészt lehessen készíteni a WebAssemblyben.[21] 2020 augusztusától a WebAssembly interfész befejezetlen marad, de a hordozható, 128 bites SIMD-funkció sok motorban már látott némi felhasználást.

Az Emscripten, a Mozilla C/C++-JavaScript fordítója kiterjesztésekkel lehetővé teszi a C++ programok összeállítását, amelyek a GCC stílusú vektorkódot használják a JavaScript SIMD API-jához, ami egyenértékű gyorsulásokat eredményez a skalár kódhoz képest.[22] Támogatja a WebAssembly 128 bites SIMD javaslatát is.[23]

Kereskedelmi alkalmazások

[szerkesztés]

Bár a SIMD-processzorok számára általában nehéz fenntartható kereskedelmi alkalmazásokat találni, az egyik sikert a GAPP érte el, amelyet a Lockheed Martin fejlesztett ki, és a Teranex szállította a kereskedelmi szektorba. A GAPP nemrégi inkarnációi hatékony eszközzé váltak a valós idejű videófeldolgozó alkalmazásokban, például a különböző videostandardok és képsebességek közötti átalakításban (NTSC-ből PAL-ba / PAL-ból NTSC-be / NTSC-ből HDTV formátumokba / stb.), váltottsormentesítésben, képzaj-csökkentésben, videotömörítésben és képjavításban.

A SIMD számára mindenütt elérhetőbb alkalmazás található a videojátékokban található: 1998 óta szinte minden modern videojáték-konzol beépített egy SIMD processzort valahova az architektúrájába. A PlayStation 2 szokatlan volt abban az értelemben, hogy egyik vektor-lebegőpontos egysége önálló DSP-ként működhet a saját utasításfolyamát végrehajtva, vagy társprocesszorként, amelyet a szokásos CPU utasítások vezérelnek. A 3D grafikus alkalmazások általában jól alkalmazzák a SIMD-feldolgozást, mivel nagymértékben támaszkodnak a 4-dimenziós vektorokkal végzett műveletekre. A Microsoft Direct3D 9.0 futás közben processzor-specifikus implementációkat választ a saját matematikai műveletei közül, beleértve a SIMD-képes utasítások használatát is.

A vektorfeldolgozás egyik legutóbbi processzora az IBM által a Toshiba és a Sony együttműködésével kifejlesztett Cell. Számos SIMD processzort használ (egy NUMA architektúrát, mindegyik önálló helyi tárolóval rendelkezik, és egy általános célú processzor vezérli), és a 3D és videofeldolgozó alkalmazások által megkövetelt hatalmas adatkészletekhez igazodik. A hagyományos ISA-któl abban különbözik, hogy az alapoktól kezdve SIMD, külön skaláris regiszterek nélkül.

A Ziilabs egy olyan SIMD típusú processzort gyártott, amely mobil eszközökön, például médialejátszókon és mobiltelefonokon használható.[24]

Nagyobb méretű kereskedelmi SIMD processzorok a ClearSpeed Technology, Ltd. és a Stream Processors, Inc. cégtől kaphatók. A ClearSpeed CSX600 (2004) 96 magja két-két precíziós lebegőpontos egységgel rendelkezik, míg a CSX700 (2008) 192. A Stream Processors-t Bill Dally számítógép-építész vezeti. Storm-1 processzoruk (2007) 80 SIMD magot tartalmaz, amelyeket egy MIPS CPU vezérel.

Lásd még

[szerkesztés]

Hivatkozások

[szerkesztés]
  1. Patterson, David A.. Computer Organization and Design: the Hardware/Software Interface, 2nd, Morgan Kaufmann, 751. o. (1998). ISBN 155860491X 
  2. MIMD1 - XP/S, CM-5
  3. (2000) „The long and winding road to high-performance image processing with MMX/SSE”.. 
  4. Lee, R.B.. Realtime MPEG video via software decompression on a PA-RISC processor, digest of papers Compcon '95. Technologies for the Information Superhighway, 186–192. o.. DOI: 10.1109/CMPCON.1995.512384 (1995). ISBN 0-8186-7029-0 
  5. Mittal: A Survey on Evaluating and Optimizing Performance of Intel Xeon Phi, 2019. május 1.
  6. Patterson: SIMD Instructions Considered Harmful. SIGARCH, 2017. szeptember 18.
  7. RE: SSE2 speed, bemutatja, hogy az SSE2 használatával hogyan implementálhatók az SHA hash algoritmusok
  8. Salsa20 speed; Salsa20 software, showing a stream cipher implemented using SSE2
  9. Subject: up to 1.4x RSA throughput using SSE2 Archiválva 2011. április 2-i dátummal a Wayback Machine-ben, nem-SIMD SSE2 fixpontos szorzás utasítással megvalósított RSA bemutatása
  10. SIMD library math functions. Stack Overflow. (Hozzáférés: 2020. január 16.)
  11. Vector Extensions. Using the GNU Compiler Collection (GCC). (Hozzáférés: 2020. január 16.)
  12. Clang Language Extensions. Clang 11 documentation. (Hozzáférés: 2020. január 16.)
  13. VcDevel/std-simd. VcDevel, 2020. augusztus 6.
  14. RyuJIT: The next-generation JIT compiler for .NET
  15. The JIT finally proposed. JIT and SIMD are getting married
  16. SIMD Directives. www.openmp.org
  17. Tutorial pragma simd. CilkPlus, 2012. július 18. [2020. december 4-i dátummal az eredetiből archiválva]. (Hozzáférés: 2021. február 13.)
  18. Transparent use of library packages optimized for Intel® architecture (angol nyelven). Clear Linux* Project. (Hozzáférés: 2019. szeptember 8.)
  19. John McCutchan: Bringing SIMD to the web via Dart. [2013. december 3-i dátummal az eredetiből archiválva].
  20. SIMD in JavaScript. 01.org, 2014. május 8.
  21. tc39/ecmascript_simd: SIMD numeric type for EcmaScript.. GitHub. Ecma TC39, 2019. augusztus 22. (Hozzáférés: 2019. szeptember 8.)
  22. Jensen (2015). „SIMD in JavaScript via C++ and Emscripten” (PDF). 
  23. Porting SIMD code targeting WebAssembly. Emscripten 1.40.1 documentation
  24. ZiiLABS ZMS-05 ARM 9 Media Processor. ZiiLabs. [2011. július 18-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. május 24.)