Remove ads
From Wikipedia, the free encyclopedia
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]
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) |
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]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.