SSE3
From Wikipedia, the free encyclopedia
Remove ads
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]
Remove ads
Új utasítások[2][3]
addsubpd
Dupla pontosságú (64 bites) lebegőpontos elemek összeadása és kivonása.
addsubps
Szimpla pontosságú (32 bites) lebegőpontos elemek összeadása és kivonása.
haddpd
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális összeadása.
haddps
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális összeadása.
hsubpd
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális kivonása.
hsubps
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális kivonása.
lddqu
128 bites adat beolvasása a regiszterbe.
loadddup
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer.
monitor
Monitorozás.
movddup
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer.
movshdup
Páratlan indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása.
movsldup
Páros indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása.
mwait
Várakozóállásba helyezi a processzort a monitorozáshoz.
Remove ads
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]
Remove ads
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
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads