„SSE3” változatai közötti eltérés
[nem ellenőrzött változat] | [ellenőrzött változat] |
a Az Intel link javítása Címke: 2017-es forrásszöveg-szerkesztő |
→Források: +{{Utasításkészlet kiterjesztések}} |
||
(10 közbenső módosítás, amit 6 másik szerkesztő végzett, nincs mutatva) | |||
1. sor: | 1. sor: | ||
Az |
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 |
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.<ref>{{Cite web|url=https://www.intel.com/content/www/us/en/support/processors/000005779.html|title=Intel® Streaming SIMD Extensions Technology|accessdate=2017-08-23|work=Intel|language=angol}}</ref> |
||
== Új utasítások<ref>{{Cite web|url=https://software.intel.com/sites/landingpage/IntrinsicsGuide|title=Intel Intrinsics Guide|accessdate=2017-08-23|work=software.intel.com|language=angol}}</ref><ref>{{Cite web|url=http://x86.renejeschke.de/|title=Mirror of: Into the Void: x86 Instruction Set Reference|accessdate=2017-08-23|work=x86.renejeschke.de|language=angol}}</ref> == |
== Új utasítások<ref>{{Cite web|url=https://software.intel.com/sites/landingpage/IntrinsicsGuide|title=Intel Intrinsics Guide|accessdate=2017-08-23|work=software.intel.com|language=angol}}</ref><ref>{{Cite web|url=http://x86.renejeschke.de/|title=Mirror of: Into the Void: x86 Instruction Set Reference|accessdate=2017-08-23|work=x86.renejeschke.de|language=angol|archiveurl=https://web.archive.org/web/20170827004412/http://x86.renejeschke.de/#|archivedate=2017-08-27}}</ref> == |
||
'''<big>addsubpd</big>''' |
|||
=== addsubpd === |
|||
Dupla pontosságú (64 bites) lebegőpontos elemek összeadása és kivonása. |
Dupla pontosságú (64 bites) lebegőpontos elemek összeadása és kivonása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
22. sor: | 22. sor: | ||
xmm1[64..127] = xmm1[64..127] + xmm2/m128[64..127] |
xmm1[64..127] = xmm1[64..127] + xmm2/m128[64..127] |
||
|} |
|} |
||
'''<big>addsubps</big>''' |
|||
=== addsubps === |
|||
Szimpla pontosságú (32 bites) lebegőpontos elemek összeadása és kivonása. |
Szimpla pontosságú (32 bites) lebegőpontos elemek összeadása és kivonása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
44. sor: | 44. sor: | ||
xmm1[96..127] = xmm1[96..127] + xmm2/m128[96..127] |
xmm1[96..127] = xmm1[96..127] + xmm2/m128[96..127] |
||
|} |
|} |
||
'''<big>haddpd</big>''' |
|||
=== haddpd === |
|||
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális összeadása. |
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális összeadása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
62. sor: | 62. sor: | ||
xmm1[64..127] = xmm2/m128[0..63] + xmm2/m128[64..127] |
xmm1[64..127] = xmm2/m128[0..63] + xmm2/m128[64..127] |
||
|} |
|} |
||
'''<big>haddps</big>''' |
|||
=== haddps === |
|||
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális összeadása. |
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális összeadása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
84. sor: | 84. sor: | ||
xmm1[96..127] = xmm2/m128[64..95] + xmm2/m128[96..127] |
xmm1[96..127] = xmm2/m128[64..95] + xmm2/m128[96..127] |
||
|} |
|} |
||
'''<big>hsubpd</big>''' |
|||
=== hsubpd === |
|||
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális kivonása. |
Dupla pontosságú (64 bites) lebegőpontos elemek horizontális kivonása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
102. sor: | 102. sor: | ||
xmm1[64..127] = xmm2/m128[0..63] - xmm2/m128[64..127] |
xmm1[64..127] = xmm2/m128[0..63] - xmm2/m128[64..127] |
||
|} |
|} |
||
'''<big>hsubps</big>''' |
|||
=== hsubps === |
|||
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális kivonása. |
Szimpla pontosságú (32 bites) lebegőpontos elemek horizontális kivonása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
124. sor: | 124. sor: | ||
xmm1[96..127] = xmm2/m128[64..95] - xmm2/m128[96..127] |
xmm1[96..127] = xmm2/m128[64..95] - xmm2/m128[96..127] |
||
|} |
|} |
||
'''<big>lddqu</big>''' |
|||
=== lddqu === |
|||
128 bites adat beolvasása a regiszterbe. |
128 bites adat beolvasása a regiszterbe. |
||
{| class="wikitable" |
{| class="wikitable" |
||
141. sor: | 141. sor: | ||
|xmm[0..127] = m128 |
|xmm[0..127] = m128 |
||
|} |
|} |
||
'''<big>loadddup</big>''' |
|||
=== loadddup === |
|||
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer. |
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer. |
||
{| class="wikitable" |
{| class="wikitable" |
||
159. sor: | 159. sor: | ||
xmm1[64..127] = m64 |
xmm1[64..127] = m64 |
||
|} |
|} |
||
'''<big>monitor</big>''' |
|||
=== monitor === |
|||
Monitorozás. |
Monitorozás. |
||
{| class="wikitable" |
{| class="wikitable" |
||
171. sor: | 171. sor: | ||
|<code>void _mm_monitor (void const* p, unsigned extensions, unsigned hints)</code> |
|<code>void _mm_monitor (void const* p, unsigned extensions, unsigned hints)</code> |
||
|} |
|} |
||
'''<big>movddup</big>''' |
|||
=== movddup === |
|||
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer. |
Dupla pontosságú (64 bites) lebegőpontos elemek másolása kétszer. |
||
{| class="wikitable" |
{| class="wikitable" |
||
189. sor: | 189. sor: | ||
xmm1[64..127] = xmm2[0..63] |
xmm1[64..127] = xmm2[0..63] |
||
|} |
|} |
||
'''<big>movshdup</big>''' |
|||
=== movshdup === |
|||
Páratlan indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása. |
Páratlan indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
211. sor: | 211. sor: | ||
xmm1[96..127] = xmm2[96..127]/m128[96..127] |
xmm1[96..127] = xmm2[96..127]/m128[96..127] |
||
|} |
|} |
||
'''<big>movsldup</big>''' |
|||
=== movsldup === |
|||
Páros indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása. |
Páros indexű szimpla pontosságú (32 bites) lebegőpontos elemek duplázása. |
||
{| class="wikitable" |
{| class="wikitable" |
||
233. sor: | 233. sor: | ||
xmm1[96..127] = xmm2[64..95]/m128[64..95] |
xmm1[96..127] = xmm2[64..95]/m128[64..95] |
||
|} |
|} |
||
'''<big>mwait</big>''' |
|||
=== mwait === |
|||
Várakozóállásba helyezi a processzort a monitorozáshoz. |
Várakozóállásba helyezi a processzort a monitorozáshoz. |
||
{| class="wikitable" |
{| class="wikitable" |
||
247. sor: | 247. sor: | ||
== Használat, fordítás == |
== Használat, fordítás == |
||
Az alábbi példa az {{ |
Az alábbi példa az {{Kód2i|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:<syntaxhighlight lang="c" line="1"> |
||
#include <stdio.h> |
#include <stdio.h> |
||
#include <pmmintrin.h> |
#include <pmmintrin.h> |
||
259. sor: | 259. sor: | ||
void C_Version (double xmm1[2], double xmm2[2]) { |
void C_Version (double xmm1[2], double xmm2[2]) { |
||
// az addsubpd utasítás egy lehetséges helyettesítése |
// 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]}; |
double xmm3[2] = {xmm1[0] - xmm2[0], xmm1[1] + xmm2[1]}; |
||
271. sor: | 271. sor: | ||
return 0; |
return 0; |
||
} |
} |
||
</syntaxhighlight>Amennyiben használni szeretnénk az új SSE utasításokat, akkor meg kell adni a fordítónak, hogy támogassa. Pl. [[GCC (informatika)|GCC]] esetén {{Code|gcc -msse3 sse3_test.c}} paranccsal kell fordítanunk, ha nem akarjuk, hogy {{Code|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.: {{Code|1=gcc -march= |
</syntaxhighlight>Amennyiben használni szeretnénk az új SSE utasításokat, akkor meg kell adni a fordítónak, hogy támogassa. Pl. [[GCC (informatika)|GCC]] esetén {{Code|gcc -msse3 sse3_test.c}} paranccsal kell fordítanunk, ha nem akarjuk, hogy {{Code|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.: {{Code|1=gcc -march=core2 sse3_test.c}}.<ref>{{Cite web|url=https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/x86-Options.html#x86-Options|title=Using the GNU Compiler Collection (GCC): x86 Options|accessdate=2017-08-23|work=gcc.gnu.org|language=angol|archiveurl=https://web.archive.org/web/20170823210214/https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/x86-Options.html#x86-Options|archivedate=2017-08-23}}</ref> |
||
== Támogatás == |
== Támogatás == |
||
290. sor: | 290. sor: | ||
== Források == |
== Források == |
||
<references /> |
<references /> |
||
{{Utasításkészlet kiterjesztések}} |
|||
[[Kategória:Mikroprocesszorok]] |
A lap jelenlegi, 2024. július 3., 16:36-kori változata
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]Intel által[5]
[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
Források
[szerkesztés]- ↑ Intel® Streaming SIMD Extensions Technology (angol nyelven). Intel. (Hozzáférés: 2017. augusztus 23.)
- ↑ Intel Intrinsics Guide (angol nyelven). software.intel.com. (Hozzáférés: 2017. augusztus 23.)
- ↑ 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.)
- ↑ 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.)
- ↑ 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.)