Az SSE3 Intel Streaming SIMD Extensions harmadik generációs utasításkészlete és nem keverendő össze az SSSE3 (Supplemental Streaming SIMD Extensions 3) jelöléssel, ami tulajdonképpen a negyedik változat az SSE4 előtt.
A 90 nm-es csíkszélességű Intel Pentium 4 processzorral vezették be, mely az SSE2-n felül 13 új SIMD instrukcióval rendelkezik. Az új utasításokat elsősorban a szálak szinkronizációjának, valamint a médiatartalmak és játékok teljesítményének növelése céljából tervezték meg.
Új utasítások addsubpd
Dupla pontosságú (64 bites) lebegőpontos elemek összeadása és kivonása. GépikódAssembler utasításC prototípus66 0F D0 /rADDSUBPD xmm1, xmm2/m128__m128d _mm_addsub_pd (__m128d a, __m128d b) Működési elvxmm1[0..63] = xmm1[0..63] - xmm2/m128[0..63] xmm1[64..127] = xmm1[64..127] + xmm2/m128[64..127] addsubps
Szimpla pontosságú (32 bites) lebegőpontos elemek összeadása és kivonása. GépikódAssembler utasításC prototípusF2 0F D0 /rADDSUBPS xmm1, xmm2/m128__m128 _mm_addsub_ps (__m128 a, __m128 b) Működési elvxmm1[0..31] = xmm1[0..31] - xmm2/m128[0..31] xmm1[32..63] = xmm1[32..63] + xmm2/m128[32..63]
xmm1[64..95] = xmm1[64..95] - xmm2/m128[64..95]
xmm1[96..127] = xmm1[96..127] + xmm2/m128[96..127] haddpd
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális összeadása. GépikódAssembler utasításC prototípus66 0F 7C /rHADDPD xmm1, xmm2/m128__m128d _mm_hadd_pd (__m128d a, __m128d b) Működési elvxmm1[0..63] = xmm1[0..63] + xmm1[64..127] xmm1[64..127] = xmm2/m128[0..63] + xmm2/m128[64..127] haddps
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális összeadása. GépikódAssembler utasításC prototípusF2 0F 7C /rHADDPS xmm1, xmm2/m128__m128 _mm_hadd_ps (__m128 a, __m128 b) Működési elvxmm1[0..31] = xmm1[0..31] + xmm1[32..63] xmm1[32..63] = xmm1[64..95] + xmm1[96..127]
xmm1[64..95] = xmm2/m128[0..31] + xmm2/m128[32..63]
xmm1[96..127] = xmm2/m128[64..95] + xmm2/m128[96..127] hsubpd
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális kivonása. GépikódAssembler utasításC prototípus66 0F 7D /rHSUBPD xmm1, xmm2/m128__m128d _mm_hsub_pd (__m128d a, __m128d b) Működési elvxmm1[0..63] = xmm1[0..63] - xmm1[64..127] xmm1[64..127] = xmm2/m128[0..63] - xmm2/m128[64..127] hsubps
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális kivonása. GépikódAssembler utasításC prototípusF2 0F 7D /rHSUBPS xmm1, xmm2/m128__m128 _mm_hsub_ps (__m128 a, __m128 b) Működési elvxmm1[0..31] = xmm1[0..31] - xmm1[32..63] xmm1[32..63] = xmm1[64..95] - xmm1[96..127]
xmm1[64..95] = xmm2/m128[0..31] - xmm2/m128[32..63]
xmm1[96..127] = xmm2/m128[64..95] - xmm2/m128[96..127] lddqu
128 bites adat beolvasása a regiszterbe. GépikódAssembler utasításC prototípusF2 0F F0 /rLDDQU xmm, mem__m128i _mm_lddqu_si128 (__m128i const* mem_addr) Működési elvxmm[0..127] = m128 loadddup
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer. GépikódAssembler utasításC prototípusF2 0F 12 /rMOVDDUP xmm1, m64__m128d _mm_loaddup_pd (double const* mem_addr) Működési elvxmm1[0..63] = m64 xmm1[64..127] = m64 monitor
Monitorozás. GépikódAssembler utasításC prototípus0F 01 C8MONITORvoid _mm_monitor (void const* p, unsigned extensions, unsigned hints) movddup
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer. GépikódAssembler utasításC prototípusF2 0F 12 /rMOVDDUP xmm1, xmm2__m128d _mm_movedup_pd (__m128d a) Működési elvxmm1[0..63] = xmm2[0..63] xmm1[64..127] = xmm2[0..63] movshdup
Páratlan indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása. GépikódAssembler utasításC prototípusF3 0F 16 /rMOVSHDUP xmm1, xmm2/m128__m128 _mm_movehdup_ps (__m128 a) Működési elvxmm1[0..31] = xmm2[32..63]/m128[32..63] xmm1[32..63] = xmm2[32..63]/m128[32..63]
xmm1[64..95] = xmm2[96..127]/m128[96..127]
xmm1[96..127] = xmm2[96..127]/m128[96..127] movsldup
Páros indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása. GépikódAssembler utasításC prototípusF3 0F 12 /rMOVSLDUP xmm1, xmm2/m128__m128 _mm_moveldup_ps (__m128 a) Működési elvxmm1[0..31] = xmm2[0..31]/m128[0..31] xmm1[32..63] = xmm2[0..31]/m128[0..31]
xmm1[64..95] = xmm2[64..95]/m128[64..95]
xmm1[96..127] = xmm2[64..95]/m128[64..95] mwait
Várakozóállásba helyezi a processzort a monitorozáshoz. GépikódAssembler utasításC prototípus0F 01 C9MWAITvoid _mm_mwait (unsigned extensions, unsigned hints)
Használat, fordítás Az alábbi példa az használatát mutatja be C nyelven, valamint az utasításkészlet hiányában egy lehetséges helyettesítési módot, mellyel az utasítás eredményét lehet bemutatni:#include <stdio.h> #include <pmmintrin.h>
void SSE3_Version (__m128d xmm1, __m128d xmm2) { // az addsubpd utasítás használata __m128d xmm3 = _mm_addsub_pd (xmm1, xmm2);
printf("SSE3 Version: %.0lf, %.0lf\n", xmm3, xmm3); }
void C_Version (double xmm1, double xmm2) { // az addsubpd utasítás egy lehetséges helyettesítése annak hiányában double xmm3 = {xmm1 - xmm2, xmm1 + xmm2};
printf("C Version: %.0lf, %.0lf\n", xmm3, xmm3); }
int main () { SSE3_Version ((__m128d){10, 10}, (__m128d){3, 3}); C_Version ((double){10, 10}, (double){3, 3});
return 0; }Amennyiben használni szeretnénk az új SSE utasításokat, akkor meg kell adni a fordítónak, hogy támogassa. Pl. GCC esetén paranccsal kell fordítanunk, ha nem akarjuk, hogy hibaüzenettel álljon le a fordítás. Szintén üdvözítő megoldás, ha olyan beépített architektúra támogatást választunk, mely már tartalmazza ezt az optimalizációt pl.: .
Támogatás
Intel által Dual-Core Intel® Xeon® 70XX, 71XX, 50XX Series Dual-Core Intel® Xeon® (ULV and LV) 1.66, 2.0, 2.16 Dual-Core Intel® Xeon® 2.8 Intel® Xeon® (nem mindegyik) Intel® Core™ Duo Intel® Core™ Solo Intel® Pentium® dual-core T21XX, T20XX series Intel® Pentium® Extreme Edition Intel® Pentium® D Intel® Pentium® 4 (nem mindegyik) valamint az újabb SIMD instrukcióval rendelkező processzorok
Források
Kategória:Mikroprocesszorok