Share to: share facebook share twitter share wa share telegram print page

 

SSE3

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]

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

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

Intel által[5]

  • 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

  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.)
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya