bélyegkép|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 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.

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, 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. 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. 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.

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 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

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. 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. 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. Bizonyos utasítások, például forgatás vagy háromoperandusos összeadás, nem állnak rendelkezésre egyes SIMD utasításkészletekben. 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. 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. 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. Az LLVM ezt vscale-nek nevezi.

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

ILLIAC IV, c. 1974 ICL Distributed Array Process (DAP; elosztott tömb processzor), c. 1974 Burroughs Scientific Processor (Burroughs Tudományos Processzor), c. 1976 Geometric Arithmetic Parallel Processor (Geometriai-Aritmetikai Párhuzamos Processzor), Martin Mariettától, 1981-től kezdve a Lockheed Martinnál, majd a Teranexnél és a Silicon Optix-nál folytatta. Massively Parallel Processor (MPP; masszívan párhuzamos processzor), a NASA / Goddard Űrközponttól, c. 1983-1991 Connection Machine, 1. és 2. modell (CM-1 és CM-2), a Thinking Machines Corporation-től, c. 1985 MasPar MP-1 és MP-2, c. 1987-1996 Zephyr DC számítógép a Wavetracertől, c. 1991 Xplor, a Pyxsys, Inc.-től, c. 2001.

Hardver 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 bélyegkép|307x307px| 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. jobbra|bélyegkép|307x307px| 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.RE: SSE2 speed, bemutatja, hogy az SSE2 használatával hogyan implementálhatók az SHA hash algoritmusokSalsa20 speed; Salsa20 software, showing a stream cipher implemented using SSE2Subject: up to 1.4x RSA throughput using SSE2 , nem-SIMD SSE2 fixpontos szorzás utasítással megvalósított RSA bemutatása 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.