SSSE3'ü destekleyen Intel Core 2 Quad Q6600 işlemcisi | |
| Tasarımcı | Intel |
|---|---|
| Mimari | x86 |
| Tür | SIMD |
| Tanıtım | 2006 |
| İlk işlemci | Xeon 5100 serisi, Core 2 |
| Yazmaçlar | Yeni yazmaç yok; 64 bitlik MMX ve 128 bitlik XMM yazmaçları |
| Buyruk sayısı | 32 (16 buyruk adı, MMX ve XMM sürümleriyle) |
| Öncel | SSE3 |
| Ardıl | SSE4 |
SSSE3 (İngilizce: Supplemental Streaming SIMD Extensions 3), Intel'in x86 mimarisi için tanımladığı ve ilk kez 2006'da Xeon 5100 serisi ile Core 2 işlemci ailesinde sunduğu bir tek buyruk, çoklu veri (SIMD) buyruk kümesi uzantısıdır. Uzantı paketlenmiş tam sayılar üzerinde çalışan 32 buyruk içerir ve Intel'e göre çokluortam ve sinyal işleme uygulamalarındaki tam sayı SIMD işlemlerini hızlandırmak için tanımlandı.
Adı SSE4'e benzese de ondan ayrı bir uzantıdır. Intel'in SSE4 başvuru belgesi SSE4'ün programlama ortamını SSE, SSE2, SSE3 ve SSSE3'ünkine benzer olarak tanımlar. SSSE3, 64 bitlik x86 için tanımlanan x86-64-v2 mikromimari düzeyinin gerektirdiği uzantılardan biridir.
Yazmaçlar ve veri türleri
SSSE3 yeni bir veri türü ya da mimari durum eklemez. Buyrukların işlenenleri 8, 16 ya da 32 bitlik paketlenmiş tam sayılardır ve 64 bitlik MMX yazmaçlarında, 128 bitlik XMM yazmaçlarında ya da bellekte durabilir. Bu yüzden 16 buyruk adının her biri, biri MMX biri XMM yazmaçlarıyla çalışan iki buyruğa karşılık gelir ve toplam 32 buyruk eder. 64 bit kipinde REX önekiyle XMM8-XMM15 yazmaçlarına da erişilir.
SSE'yi destekleyen bir işletim sistemi SSSE3 için de yeterli desteği sağlar; uzantı için ayrıca bir durum saklama gerekmez.
Buyruklar
Intel'in el kitabı SSSE3'ün 32 buyruğunu yedi gruba ayırır:
| Sayı | Buyruklar | İşlev |
|---|---|---|
| 12 | PHADDW, PHADDD, PHADDSW, PHSUBW, PHSUBD, PHSUBSW |
Tam sayılarda yatay toplama ve çıkarma, doymalı biçimleriyle |
| 6 | PABSB, PABSW, PABSD |
Mutlak değer |
| 2 | PMADDUBSW |
Çarpıp toplama; nokta çarpımlarını hızlandırır |
| 2 | PMULHRSW |
Ölçekli tam sayı çarpması |
| 2 | PSHUFB |
İkinci işlenendeki denetim baytlarına göre baytların yerini değiştirme |
| 6 | PSIGNB, PSIGNW, PSIGND |
Kaynaktaki karşılık gelen öğe eksiyse hedef öğenin eksisini alma |
| 2 | PALIGNR |
İki işlenenin birleşiminden veri hizalama |
Çizelgedeki sayılar MMX ve XMM sürümleri birlikte sayılarak verilmiştir.
Yatay toplama ve çıkarma
Bu buyruklar, SSE3'ün kayan noktalı yatay toplama ve çıkarma buyruklarının paketlenmiş tam sayılar için karşılığıdır. Çoğu SIMD buyruğu iki işlenenin aynı konumdaki öğeleri arasında çalışırken yatay buyruklar aynı işlenenin yan yana duran öğelerini birleştirir. PHADDW ve PHADDD komşu 16 ve 32 bitlik işaretli tam sayıları toplar; PHADDSW 16 bitlik toplamları doymalı olarak paketler. PHSUBW, PHSUBD ve PHSUBSW ise her çiftte daha anlamlı öğeyi daha az anlamlı öğeden çıkarır.
Mutlak değer ve işaret
PABSB, PABSW ve PABSD, kaynaktaki 8, 16 ya da 32 bitlik işaretli her tam sayının mutlak değerini hedefe işaretsiz bir sonuç olarak yazar. PSIGNB, PSIGNW ve PSIGND, kaynakta karşılık gelen öğe sıfırdan küçükse hedefteki işaretli tam sayının eksisini alır.
Çarpma
PMADDUBSW, hedefteki işaretsiz baytları kaynaktaki karşılık gelen işaretli baytlarla çarparak 16 bitlik işaretli ara sonuçlar üretir, ardından komşu ara sonuç çiftlerini doymalı olarak toplar. PMULHRSW ise 16 bitlik işaretli sayıları çarpar; 32 bitlik her ara sonucun en anlamlı 18 bitini alır, bu 18 bitlik değerin en düşük bitine 1 ekleyerek yuvarlar ve en anlamlı bitin hemen sağındaki 16 biti sonuç olarak yazar.
Bayt karıştırma ve hizalama
PSHUFB, kaynak işleneni bir denetim maskesi olarak kullanıp hedefteki baytların yerini değiştirir. Denetim baytlarının en düşük üç ya da dört biti, sonuç baytına hangi baytın yazılacağını gösteren sırayı oluşturur; denetim baytının en anlamlı biti 1 ise sonuç baytına sıfır yazılır. Denetim maskesi değişmez. PALIGNR kaynak işleneni hedef işlenenin arkasına ekleyerek iki kat genişlikte bir ara değer oluşturur ve bu değerden, anlık değerin belirlediği bayt konumuna sağa hizalı 128 ya da 64 bitlik bir değeri hedefe yazar.
PSHUFB ile tablo araması
PSHUFB, yalnız baytların yerini değiştiren bir buyruk olarak değil, bir tablo araması olarak da kullanılabilir. Muła ve Lemire'nin 2018'de yayımlanan çalışmasına göre birinci işlenen bir arama tablosu, ikinci işlenen ise dört bitlik indisler olarak düşünülebilir. Böylece yalnız iki yazmaçla ve başka bir bellek erişimi olmadan eşleme işlemleri yazılabilir; çalışmada bu buyrukların yeni Intel işlemcilerde saat çevrimi başına bir buyruk işlem hacmine sahip olduğu belirtilir.
Bu yöntemin bilinen bir uygulaması bir sayıdaki 1 bitlerini saymaktır. Muła, Kurz ve Lemire'ye göre Intel işlemciler için yayımlanan ilk vektörleştirilmiş bit sayma yöntemi 2008'de Muła'nın önerdiği ve SSSE3'ün PSHUFB buyruğuna dayanan yöntemdir. Yöntem her baytın alt ve üst dört bitini ayırır, 0'dan 15'e kadar her dört bitlik değerin 1 bitlerini tutan 16 baytlık bir tabloda iki kez PSHUFB ile arama yapar ve iki sonucu toplar. 16 baytın bit sayıları böylece altı buyrukla hesaplanır. Yazarlara göre 128 bitlik vektörlerle bu yöntem x86'nın POPCNT buyruğuna yakın hızda çalışır; AVX2'nin 256 bitlik vektörleriyle ise ondan hızlıdır. Çalışmada LLVM'nin Clang derleyicisinin bu tekniği kullandığı belirtilir. Aşağıdaki işlev yöntemi yerleşik işlevlerle gösterir; _mm_shuffle_epi8, PSHUFB buyruğuna karşılık gelen yerleşik işlevdir:
/* v içindeki 16 baytın her birinde kaç bitin 1 olduğunu hesaplar */
__m128i bayt_bit_say(__m128i v)
{
__m128i tablo = _mm_setr_epi8(0, 1, 1, 2, 1, 2, 2, 3,
1, 2, 2, 3, 2, 3, 3, 4);
__m128i maske = _mm_set1_epi8(0x0f);
__m128i alt = _mm_and_si128(v, maske); /* alt dört bit */
__m128i ust = _mm_and_si128(_mm_srli_epi16(v, 4), maske); /* üst dört bit */
return _mm_add_epi8(_mm_shuffle_epi8(tablo, alt), /* iki arama */
_mm_shuffle_epi8(tablo, ust));
}
Sonraki uzantılarda
AVX2 ile SSE, SSE2, SSE3, SSSE3 ve SSE4'ün vektör tam sayı buyruklarının çoğu 256 bitlik YMM yazmaçlarıyla çalışan VEX kodlu sürümler kazandı. PSHUFB'nin AVX2 sürümü VPSHUFB, aynı yer değiştirmeyi 32 baytlık yazmacın iki 16 baytlık yarısının her birinin içinde ayrı ayrı yapar. MMX yazmaçlarıyla çalışan SSSE3 buyruklarının ise VEX karşılığı yoktur, çünkü VEX öneki MMX ve x87 yazmaçlarıyla çalışan buyruklarda kullanılamaz.
İşlemci desteği
Intel'de SSSE3 ilk kez 2006'da 65 nm süreçle üretilen, Intel Core mikromimarisine dayanan Xeon 5100 serisi ve Core 2 işlemcilerle geldi. Intel'in el kitabına göre 45 nm Atom işlemciler de SSSE3'e kadarki buyrukları destekler.
AMD'nin işlemcilerinde SSSE3 daha geç yer aldı. GCC belgeleri, AMD'nin Family 10h çekirdekleri için SSE3 ve SSE4a uzantılarını sayar ama SSSE3'ü saymaz; SSSE3'ü Family 14h ve Family 15h (Bulldozer) çekirdeklerinin desteklediği uzantılar arasında sayar.
2020'de AMD, Intel, Red Hat ve SUSE'nin tanımladığı x86-64-v2 mikromimari düzeyi SSSE3'ü SSE3, SSE4.1, SSE4.2 ve POPCNT ile birlikte gerektirir. Red Hat, Red Hat Enterprise Linux 9 için bu düzeyi uygun seçim olarak belirledi.
Yazılımda kullanım
Derleyiciler
GCC'nin -mssse3 seçeneği MMX, SSE, SSE2, SSE3 ve SSSE3 yerleşik işlevlerini ve bu buyruklarla kod üretimini açar.
Desteğin sınanması
Bir program SSSE3 buyruklarını kullanmadan önce SSE ve SSE2 desteğini sınar, ardından EAX yazmacına 1 yüklenerek çağrılan CPUID buyruğunun ECX yazmacına döndürdüğü değerin 9. bitine bakar. Bu bit 0 iken çalıştırılan bir SSSE3 buyruğu, CR0 yazmacının TS bitinden bağımsız olarak geçersiz işlem kodu kural dışı durumu üretir.
Kaynakça
- ^ a b c d e f g h i j k l m n o "Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1: Basic Architecture (253665-039US)" (PDF). Intel. Mayıs 2011. 28 Haziran 2011 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 13 Eylül 2026.
- ^ "Intel SSE4 Programming Reference (D91561-003)" (PDF). Intel. Temmuz 2007. 15 Şubat 2020 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 13 Eylül 2026.
- ^ a b "System V Application Binary Interface: AMD64 Architecture Processor Supplement, Low Level System Information". x86-64 psABI. 14 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Eylül 2026.
- ^ a b Muła, Wojciech; Lemire, Daniel (2018). "Faster Base64 Encoding and Decoding Using AVX2 Instructions". ACM Transactions on the Web. 12 (3). ss. 1-26. doi:10.1145/3132709.
- ^ a b Muła, Wojciech; Kurz, Nathan; Lemire, Daniel (2018). "Faster Population Counts Using AVX2 Instructions". The Computer Journal. 61 (1). ss. 111-120. doi:10.1093/comjnl/bxx046.
- ^ "Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1: Basic Architecture (253665-060US)" (PDF). Intel. Eylül 2016. 9 Mayıs 2026 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 13 Eylül 2026.
- ^ a b "x86 Options". Using the GNU Compiler Collection. GNU Project. 13 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Eylül 2026.
- ^ Larabel, Michael (3 Mart 2017). "The Impact Of GCC Zen Compiler Tuning On AMD Ryzen Performance". Phoronix. 13 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Eylül 2026.
- ^ a b Weimer, Florian (5 Ocak 2021). "Building Red Hat Enterprise Linux 9 for the x86-64-v2 microarchitecture level". Red Hat Developer. 20 Şubat 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Eylül 2026.
