(Translated by https://www.hiragana.jp/)
SSE3 – Wikipédia

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.[1]

Új utasítások[2][3]

szerkesztés

addsubpd

Dupla pontosságú (64 bites) lebegőpontos elemek összeadása és kivonása.

Gépikód Assembler utasítás C prototípus
66 0F D0 /r ADDSUBPD xmm1, xmm2/m128 __m128d _mm_addsub_pd (__m128d a, __m128d b)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
F2 0F D0 /r ADDSUBPS xmm1, xmm2/m128 __m128 _mm_addsub_ps (__m128 a, __m128 b)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
66 0F 7C /r HADDPD xmm1, xmm2/m128 __m128d _mm_hadd_pd (__m128d a, __m128d b)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
F2 0F 7C /r HADDPS xmm1, xmm2/m128 __m128 _mm_hadd_ps (__m128 a, __m128 b)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
66 0F 7D /r HSUBPD xmm1, xmm2/m128 __m128d _mm_hsub_pd (__m128d a, __m128d b)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
F2 0F 7D /r HSUBPS xmm1, xmm2/m128 __m128 _mm_hsub_ps (__m128 a, __m128 b)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
F2 0F F0 /r LDDQU xmm, mem __m128i _mm_lddqu_si128 (__m128i const* mem_addr)
Működési elv
xmm[0..127] = m128

loadddup

Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer.

Gépikód Assembler utasítás C prototípus
F2 0F 12 /r MOVDDUP xmm1, m64 __m128d _mm_loaddup_pd (double const* mem_addr)
Működési elv
xmm1[0..63] = m64

xmm1[64..127] = m64

monitor

Monitorozás.

Gépikód Assembler utasítás C prototípus
0F 01 C8 MONITOR void _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ód Assembler utasítás C prototípus
F2 0F 12 /r MOVDDUP xmm1, xmm2 __m128d _mm_movedup_pd (__m128d a)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
F3 0F 16 /r MOVSHDUP xmm1, xmm2/m128 __m128 _mm_movehdup_ps (__m128 a)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
F3 0F 12 /r MOVSLDUP xmm1, xmm2/m128 __m128 _mm_moveldup_ps (__m128 a)
Működési elv
xmm1[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ód Assembler utasítás C prototípus
0F 01 C9 MWAIT void _mm_mwait (unsigned extensions, unsigned hints)

Használat, fordítás

szerkesztés

Az alábbi példa az addsubpd 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[0], xmm3[1]);
}

void C_Version (double xmm1[2], double xmm2[2]) {
    // az addsubpd utasítás egy lehetséges helyettesítése annak hiányában
    double xmm3[2] = {xmm1[0] - xmm2[0], xmm1[1] + xmm2[1]};

    printf("C Version: %.0lf, %.0lf\n", xmm3[0], xmm3[1]);
}

int main () {
    SSE3_Version ((__m128d){10, 10}, (__m128d){3, 3});
    C_Version ((double[2]){10, 10}, (double[2]){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

gcc -msse3 sse3_test.c

paranccsal kell fordítanunk, ha nem akarjuk, hogy

target specific option mismatch

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

gcc -march=core2 sse3_test.c

.[4]

Támogatás

szerkesztés
  • 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
  1. Intel® Streaming SIMD Extensions Technology (angol nyelven). Intel. (Hozzáférés: 2017. augusztus 23.)
  2. Intel Intrinsics Guide (angol nyelven). software.intel.com. (Hozzáférés: 2017. augusztus 23.)
  3. Mirror of: Into the Void: x86 Instruction Set Reference (angol nyelven). x86.renejeschke.de. [2017. augusztus 27-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 23.)
  4. Using the GNU Compiler Collection (GCC): x86 Options (angol nyelven). gcc.gnu.org. [2017. augusztus 23-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. augusztus 23.)
  5. Intel® Compiler Options for Intel® SSE and Intel® AVX generation (SSE2, SSE3, SSSE3, ATOM_SSSE3, SSE4.1, SSE4.2, ATOM_SSE4.2, AVX, AVX2, AVX-512) and processor-specific optimizations | Intel® Software (angol nyelven). software.intel.com. (Hozzáférés: 2017. augusztus 23.)