SSE4

A Wikipédiából, a szabad enciklopédiából

Az SSE4 (Streaming SIMD Extensions 4) egy SIMD CPU utasításkészlet, amelyet az Intel Core mikroarchitektúrában és az AMD K10 (K8L) processzorokban használnak. 2006. szeptember 27-én jelentették be, a 2006-os őszi Intel Developer Forumon, egy általános tájékoztatóban;[1] a készlet 47 utasításának pontosabb részletei a 2007 tavaszi pekingi Intel Developer Forumon bemutatott prezentációban váltak ismertté.[2] Az SSE4 teljesen kompatibilis az Intel 64 (azaz x86-64) és IA-32 architektúrájú mikroprocesszorok korábbi generációihoz írt szoftverekkel. Minden meglévő szoftver továbbra is megfelelően, módosítás nélkül fut az SSE4-et tartalmazó mikroprocesszorokon, az SSE4-et tartalmazó alkalmazások jelenlétében is.[3]

Az SSE4 részleges megvalósításai[szerkesztés]

Az Intel SSE4 összesen 54 utasításból áll. Ennek első kiadása 47 utasításból áll, SSE4.1 néven szerepel néhány Intel dokumentációban, és a Penryn Core 2 magokban jelent meg. Nem sokkal később megjelent az SSE4.2 jelű utasításcsoport, amely a maradék 7 utasítást tartalmazza; ez először a Nehalem-alapú Core i7 processzorokban vált elérhetővé. Az Intel figyelembe vette a fejlesztők visszajelzéseit az utasításkészlet fejlesztésében.[4]

Az AMD a Barcelona alapú processzorokkal kezdve bevezette az SSE4a utasításkészlet, amely négy SSE4 utasítást és négy új SSE utasítást tartalmaz. Ezek az utasítások nincsenek meg az Intel SSE4.1-et támogató processzoraiban. Az AMD processzorok a teljes SSE4 utasításkészletet (ami az Intel SSE4.1 és SSE4.2 együtt) csak a Bulldozer alapú FX processzorok megjelenésétől kezdve támogatja. Az SSE4a-val bevezetésre került a „rosszul igazított” (misaligned) SSE funkció is, ami azt jelenti, hogy a nem megfelelően igazított adatok betöltése ugyanolyan gyors, mint az igazított címeken elhelyezkedő adatokat töltő utasítások. Ez lehetővé tette továbbá az igazítás/illesztés ellenőrzésének letiltását a nem betöltő memóriahozzáférést végző SSE műveleteknél.[5] Az Intel később hasonló rendszert vezetett be a Nehalem processzorokban a nem igazított SSE sebességének javítására, de a nem igazított adathozzáférést a nem betöltő SSE utasításoknál nem vezette be egészen az AVX megjelenéséig.[6]

Névzavar[szerkesztés]

A ma már SSSE3 (Supplemental Streaming SIMD Extensions 3) néven ismert, az Intel Core 2 processzorcsaládban (2006) bevezetett utasításkészletet egyes médiumok SSE4 néven emlegették, míg az Intel elő nem állt az SSSE3 elnevezéssel. A belsőleg Merom New Instructions elnevezésű készletnek az Intel eredetileg nem is akart külön nevet adni, de ezt a tervet nyilvános kritika érte.[7] A cég végül a zavar tisztázása érdekében kijelentette, hogy az SSE4 nevet fenntartja a rákövetkező utasításkészlet-kiterjesztésekhez.[8]

Az Intel a HD Boost marketingkifejezést használja az SSE4-re.[9]

Új utasítások[szerkesztés]

Az SSE minden korábbi iterációjával ellentétben, az SSE4 olyan utasításokat tartalmaz, amelyek nem kifejezetten multimédia-alkalmazásokban alkalmazott műveleteket hajtanak végre. Több olyan utasítást tartalmaz, amelyek működését egy konstans mező határozza meg, valamint egy sor olyan utasítást, amelyek az XMM0 regisztert implicit harmadik operandusként használják.

Az utasítások közül többet a Penryn processzor egyciklusos permutációs motorja hajt végre. A permutációs (keverés, 'shuffle') műveletek átrendezik a bájtokat egy regiszteren belül.

SSE4.1[szerkesztés]

Ezek az utasítások a Penryn mikroarchitektúrában voltak bevezetve, amely az Intel Core mikroarchitektúra 45 nm-re történt zsugorításával készült. A készlet támogatását a CPUID.01H:ECX.SSE41[Bit 19] bit jelzi.

Utasítás Leírás
MPSADBW Összegzi az xmm1 és xmm2/m128 négy bájtos egész számok szomszédos csoportjainak 8 bites egész számok különbségének abszolút értékét, és az eredményeket az xmm1-be írja. Az xmm1-en és xmm2/m128-on belüli kezdő eltolásokat az imm8 határozza meg. (Azaz: |x0−y0|+|x1−y1|+|x2−y2|+|x3−y3|, |x0−y1|+|x1−y2|+|x2−y3|+|x3−y4|,..., |x0−y7|+|x1−y8|+|x2−y9|+|x3−y10|); ez művelet fontos néhány HD kodek esetén, lehetővé teszi egy 8×8-as blokk különbségének számítását kevesebb mint hét ciklus alatt.[10] Egy három bites közvetlen operandus egy bitje jelzi, hogy az y0.. y10 vagy y4.. y14 lesz a céloperandus, a másik kettő azt, hogy x0..x3, x4..x7, x8..x11 vagy x12..x15 csoportokat kell használni a forrásból.
PHMINPOSUW Keresi a forrásoperandusban a legkisebb előjel nélküli 16 bites szót (minimum), az eredmény a céloperandus alsó 16 bites szavába kerül, a minimális érték szóindexe a céloperandus 16-18. bitjeiben tárolódik.
PMULDQ Csomagolt 32 bites előjeles „hosszú” szorzás. Az xmm1-ben lévő csomagolt előjeles kétszavas egészek szorzása az xmm2/m128-ban lévő csomagolt előjeles kétszavas egész számokkal, a négyszavas eredményeket (2×64 bit) az xmm1-be helyezi.
PMULLD Csomagolt 32 bites előjeles „alacsony” szorzás: szorozza az xmm1 és xmm2/m128 csomagolt dword (32 bit/4 bájt) előjeles egész számokat, és tárolja a szorzat alacsony 32 bitjét az xmm1-ben (négy csomagolt 32 bites eredmény).
DPPS, DPPD Skalárszorzat AOS (Array of Structs, struktúratömb) adatokkal. A DPPS egyszeres pontosságú, a DPPD kétszeres pontosságú lebegőpontos értékekkel dolgozik. Szelektíven szorozza az xmm1-ből származó csomagolt lebegőpontos értékeket az xmm2-ből származó csomagolt lebegőpontos értékekkel, összeadja és szelektíven tárolja a csomagolt lebegőpontos vagy a nulla értékeket az xmm1-be. A szelekciót a közvetlen operandus 2×4 (DPPS) vagy 2×2 (DPPD) bitje vezérli.
BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDW Elemek feltételes másolása az operandusok között, a forráselemek másolását egy közvetlen operandus bitjei, vagy az xmm0 regiszteroperandus bitjei vezérlik.
PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINSD, PMAXSD Csomagolt elemenkénti minimum/maximum gyűjtés különböző egész típusú operandusokkal. Pl. PMINSB: az xmm1 és xmm2/m128 csomagolt előjeles bájtok összehasonlítása és a csomagolt minimum értékek tárolása az xmm1-ben (bájtonként).
ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD Csomagolt lebegőpontos értékek kerekítése egész számokká, a közvetlen operandusban megadott kerekítési mód szerint
INSERTPS, PINSRB, PINSRD, PINSRQ, EXTRACTPS, PEXTRB, PEXTRD, PEXTRQ Az INSERTPS és PINSR utasítások 8, 16 vagy 32 bitet olvasnak egy x86 regiszterből vagy memóriahelyről és beillesztik azt a célregiszter közvetlen operandus által meghatározott mezőjébe. Az EXTRACTPS és PEXTR olvas egy mezőt a forrásregiszterből és és beilleszti azt egy x86 regiszterbe vagy memóriahelyre. Például a PEXTRD eax, [xmm0], 1; EXTRACTPS [addr+4*eax], xmm1, 1 az xmm0 első mezője által meghatározott címre tárolja az xmm1 első mezőjét.
PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ Csomagolt előjel- / nulla-kiterjesztés szélesebb típusokra
PTEST Ez hasonló a TEST utasításhoz, mivel beállítja a Z jelzőbitet az operandusok közötti AND művelet eredménye szerint: Z beállítva, ha DEST AND SRC eredménye nulla. Ezenkívül a C jelzőbitet is beállítja, ha (NOT DEST) AND SRC egyenlő nullával. Tehát a Z jelzőbit 1, ha a SRC által maszkolt bitek egyike sincs beállítva, és a C jelzőbit 1, ha az SRC által maszkolt összes bit be van állítva.
PCMPEQQ Négyszavas (quadword, 64 bit) egyenlőségvizsgálat
PACKUSDW Előjeles duplaszavak (dword) átalakítása előjel nélküli egyszeres szavakká (word), telítéssel
MOVNTDQA Hatékony olvasás az írást kombináló memóriaterületről az SSE regiszterbe; hasznos a memóriabuszra csatlakoztatott perifériák eredményeinek lekérdezésénél

SSE4.2[szerkesztés]

Az SSE4.2 az STTNI (String and Text New Instructions, string és szöveg[kezelő] új utasítások) bővítményt tartalmazza,[11] melynek 4 új utasítása karakterkeresést és összehasonlítást végez két, egyenként 16 bájtos operanduson. Ezeket – többek között – az XML dokumentumok elemzésének felgyorsítására tervezték.[12] A készlethez tartoznak még a PCMPGTQ, CRC32, POPCNT utasítások. A CRC32 utasítás egyes adatátviteli protokollokban használt ciklikus redundancia-ellenőrzés kiszámítására szolgál. Ezek az utasítások először a Nehalem-alapú Intel Core i7 termékcsaládban voltak bevezetve, és kiegészítik az SSE4 utasításkészletet. A készlet támogatását a CPUID.01H:ECX.SSE42[Bit 20] bit jelzi.

Az SSE 4.2 CRC32 utasítása a Castagnoli-polinomot (CRC32-C) használja, és nem kompatibilis az IEEE 802.3 szabványosított CRC32 változattal, amelyet hálózati protokollok (például Ethernet, V.42), SATA, MPEG-2, PNG és UNIX parancsok, vagy a Gzip, Bzip2 és zip tömörítés használnak. A Castagnoli-polinomot a Btrfs, az Ext4, az iSCSI, az SCTP és más formátumok használják.[13][14]

Utasítás Leírás
CRC32 A CRC32C érték meghatározása a 0x11EDC6F41 polinom felhasználásával (vagy a legmagasabb helyiértékű bit nélkül: 0x1EDC6F41).[15][16][14]
PCMPESTRI Csomagolt explicit hosszú karakterláncok összehasonlítása, index visszaadása
PCMPESTRM Csomagolt explicit hosszú karakterláncok összehasonlítása, maszk visszaadása
PCMPISTRI Csomagolt implicit hosszú karakterláncok összehasonlítása, index visszaadása
PCMPISTRM Csomagolt implicit hosszú karakterláncok összehasonlítása, maszk visszaadása
PCMPGTQ Csomagolt előjeles 64 bites adatok (négyszavas egészek) összehasonlítása „nagyobb mint” relációval
POPCNT 1 értékű bitek számlálása, alkalmazásgyorsító utasítás

POPCNT és LZCNT[szerkesztés]

Ezek az utasítások nem SSE regisztereken, hanem egész számokon működnek, mivel nem SIMD utasítások, de egyidőben jelentek meg, és bár az AMD az SSE4a utasításkészlettel vezette be őket, mégis különálló kiterjesztéseknek számítanak, saját dedikált CPUID bitekkel, amelyek jelzik a támogatást az adott processzorban. Az Intel a Nehalem mikroarchitektúrától kezdve megvalósítja a POPCNT utasítást, a Haswell mikroarchitektúrától kezdve pedig a LZCNT utasítást. Az AMD mindkettőt megvalósítja az Barcelona mikroarchitektúrától kezdve.

Az utasításpár AMD szerinti elnevezése Advanced Bit Manipulation, fejlett bitmanipulásiós utasítások, röviden ABM.

Utasítás Leírás
POPCNT Populációszám (population count): a nem-nulla (1-re beállított) bitek száma. Az utasítás támogatását a CPUID.01H:ECX.POPCNT[Bit 23] bit jelzi.[17]
LZCNT Vezető nullák száma. Az utasítás támogatását a CPUID.80000001H:ECX.ABM[Bit 5] bit jelzi.[18]

Az LZCNT kódolása ugyanazt a kódolási mintát követi, mint a BSR (fordított bit pásztázás, bit scan reverse) utasítás. Az LZCNT utasítás meghívása problémát okoz néhány, az utasítást nem támogató processzoron, például a Haswell előtti Intel CPU-kon, ahol helytelenül BSR művelet hajtódik végre, ahelyett, hogy a processzor érvénytelen utasítás kivételt dobna. Ez azért probléma, mert az LZCNT és a BSR utasítások eredménye különböző.

Az operandus végén álló nullákat a BSF (bit pásztázás előre, bit scan forward) vagy a TZCNT utasításokkal lehet számolni.

SSE4a[szerkesztés]

A 4 utasítást tartalmazó SSE4a utasításcsoportot az AMD a Barcelona mikroarchitektúrában vezette be. Ezek az utasítások nem elérhetők az Intel processzorokban. Ezek támogatását a CPUID.80000001H:ECX.SSE4A[Bit 6] bit jelzi.[18]

Utasítás Leírás
EXTRQ, INSERTQ Kombinált maszkolás-eltolás utasítások.[19]
MOVNTSD, MOVNTSS Skalár adatfolyamtároló utasítások, egyszeres és kétszeres pontosságú lebegőpontos adatokra.[20]

Támogató CPU-k[szerkesztés]

Jegyzetek[szerkesztés]

  1. Intel Streaming SIMD Extensions 4 (SSE4) Instruction Set Innovation Archiválva 2009. május 30-i dátummal a Wayback Machine-ben., Intel.
  2. Tuning for Intel SSE4 for the 45nm Next Generation Intel Core Microarchitecture Archiválva 2021. március 8-i dátummal a Wayback Machine-ben., Intel.
  3. Intel SSE4 Programming Reference. [2020. február 15-i dátummal az eredetiből archiválva]. (Hozzáférés: 2014. december 26.)
  4. https://www.intel.com/content/www/us/en/support/articles/000005779/processors.html
  5. "Barcelona" Processor Feature: SSE Misaligned Access. AMD. [2016. augusztus 9-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. március 3.)
  6. Inside Intel Nehalem Microarchitecture. [2015. április 2-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. március 3.)
  7. My Experience With "Conroe" Archiválva 2013. október 15-i dátummal a Wayback Machine-ben., DailyTech
  8. Extending the World’s Most Popular Processor Architecture Archiválva 2011. november 24-i dátummal a Wayback Machine-ben., Intel
  9. Intel - Data Center Solutions, IOT, and PC Innovation. Intel. [2013. február 7-i dátummal az eredetiből archiválva]. (Hozzáférés: 2009. szeptember 17.)
  10. Motion Estimation with Intel Streaming SIMD Extensions 4 (Intel SSE4) Archiválva 2018. június 16-i dátummal a Wayback Machine-ben., Intel.
  11. Schema Validation with Intel® Streaming SIMD Extensions 4 (Intel® SSE4). [2018. június 17-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. február 6.)
  12. XML Parsing Accelerator with Intel® Streaming SIMD Extensions 4 (Intel® SSE4). [2018. június 17-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. február 6.)
  13. CRC-32 (angol nyelven). wuffs. Google Code, 2018
  14. a b Félix Cloutier: CRC32 — Accumulate CRC32 Value (angol nyelven). online x86 reference, 2024. február 18. (Hozzáférés: 2024. március 1.)
  15. Intel SSE4 Programming Reference Archiválva 2020. február 15-i dátummal a Wayback Machine-ben. p. 61. Nézze szintén RFC 3385 Archiválva 2008. június 19-i dátummal a Wayback Machine-ben. #>nak# elemzés/vita a CRC32C-nek többtag/többtagú/polinom/polinomiális.
  16. Fast, Parallelized CRC Computation Using the Nehalem CRC32 Instruction — Dr. Dobbs, 2011. április 12.
  17. Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2B: Instruction Set Reference, N–Z Archiválva 2011. március 8-i dátummal a Wayback Machine-ben..
  18. a b AMD CPUID Specification. [2013. november 1-i dátummal az eredetiből archiválva]. (Hozzáférés: 2013. október 30.)
  19. Rahul Chaturvedi: "Barcelona" Processor Feature: SSE4a Instruction Set, 2007. szeptember 17. [2013. október 25-i dátummal az eredetiből archiválva].
  20. Rahul Chaturvedi: "Barcelona" Processor Feature: SSE4a, part 2, 2007. október 2. [2013. október 25-i dátummal az eredetiből archiválva].
  21. AMD FX-Series FX-6300 - FD6300WMW6KHK / FD6300WMHKBOX. [2017. augusztus 17-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. október 9.)

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a SSE4 című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Források[szerkesztés]

További információk[szerkesztés]

Kapcsolódó szócikkek[szerkesztés]