SSE3'ü ilk kez sunan 90 nm Pentium 4 ailesinden bir işlemci | |
| Tasarımcı | Intel |
|---|---|
| Mimari | x86 |
| Tür | SIMD |
| Tanıtım | 2004 |
| İlk işlemci | Pentium 4 (90 nm) |
| Yazmaçlar | Yeni yazmaç yok; XMM0-XMM7 (64 bit kipinde 16), MXCSR |
| Buyruk sayısı | 13 |
| Öncel | SSE2 |
| Ardıl | SSSE3 |
SSE3 (İngilizce: Streaming SIMD Extensions 3), Intel'in x86 mimarisi için tanımladığı ve ilk kez 90 nm süreçle üretilen Pentium 4 işlemcisinde sunduğu, 13 buyruktan oluşan bir buyruk kümesi uzantısıdır. SSE ve SSE2 ile kurulan programlama ortamını değiştirmez; yeni bir veri türü ya da mimari durum eklemez.
Buyrukların onu XMM yazmaçlarını kullanır. Kalan üçünden FISTTP x87 kayan nokta biriminde çalışır, MONITOR ve MWAIT ise genel amaçlı yazmaçlarla iş parçacıkları arasında eşzamanlama sağlar. Pentium 4'ün tasarımcılarına göre uzantı karmaşık sayı aritmetiği, video kodlama, grafik ve iş parçacığı eşzamanlama alanlarında başarımı artırmak için tanımlandı.
Pentium 4'ün tasarımcıları 13 buyruğu başarımını artırmayı amaçladıkları alanlara göre şöyle gruplar:
| Alan | Buyruklar | Sayı |
|---|---|---|
| x87 kayan noktalı sayıdan tam sayıya dönüştürme | FISTTP | 1 |
| Karmaşık sayı aritmetiği | ADDSUBPS, ADDSUBPD, MOVSLDUP, MOVSHDUP, MOVDDUP | 5 |
| Video kodlama | LDDQU | 1 |
| Grafik | HADDPS, HSUBPS, HADDPD, HSUBPD | 4 |
| İş parçacığı eşzamanlama | MONITOR, MWAIT | 2 |
x87'de kayan noktalı bir sayı FISTP buyruğuyla tam sayıya dönüştürülür ve yuvarlama kipi kayan nokta denetim sözcüğünden alınır. Fortran, C ve C++ tam sayıya dönüştürmede sayının kesilmesini ister; oysa varsayılan yuvarlama kipi genellikle yuvarlama hatalarını azaltmak için en yakın çift sayıya yuvarlamadır. Bu yüzden program önce yuvarlama kipi kesme olan yeni bir denetim sözcüğü yükler, dönüştürmeyi yapar ve eski denetim sözcüğünü geri yükler. İşlem denetim sözcüğünü iki kez değiştirir ve bunu yapan FLDCW görece yavaş bir buyruk olduğu için uygulamanın başarımını düşürebilir.
FISTTP, denetim sözcüğünü yok sayan ve her zaman keserek dönüştüren bir FISTP sürümüdür. 16, 32 ve 64 bitlik tam sayılar için kullanılabilir. Intel'e göre buyruk, tam sayıya dönüştürmelerin sık olduğu ve bu yüzden denetim sözcüğünün sık değiştirildiği x87 kodunu hızlandırmak için tasarlandı.
Karmaşık sayı aritmetiği ayrık ve hızlı Fourier dönüşümü, çok tonlu modülatörler ve frekans uzayında süzgeçleme gibi işlemlerde yaygındır. Tasarımcıların verdiği örnek akustik yankı gidericidir. Yankı giderici, akustik kanalın tersini 1024 ya da daha çok katsayılı bir süzgeçle modeller. Zaman uzayında bu süzgeçin uyguladığı evrişim O(n²) işlem sürer. Frekans uzayında ise evrişim öğe öğe çarpmaya dönüşür ve O(n) sürer; dönüşümler hızlı Fourier dönüşümüyle O(n log n) işlemde yapıldığı için toplam iş O(n log n) olur. SPEC CPU2000 denektaşlarından 168.wupwise, 189.lucas ve 187.facerec karmaşık sayı aritmetiğini yoğun kullanır.
ADDSUBPS ve ADDSUBPD toplama ile çıkarmayı tek buyrukta birleştirir ve bazı işlenenlerin işaretini değiştirme gereğini ortadan kaldırır. Örneğin ADDSUBPD iki işlenenin ikinci çift duyarlıklı sayılarını toplar, birinci sayılarını çıkarır. MOVSLDUP, MOVSHDUP ve MOVDDUP ise yüklemeyi öğe çoğaltmayla birleştirir ve yüklenen veride ayrıca öğelerin yerini değiştirme gereğini kaldırır. MOVDDUP 64 bitlik bir sayıyı iki kez yazar; MOVSLDUP birinci ve üçüncü, MOVSHDUP ikinci ve dördüncü 32 bitlik öğeyi çoğaltır.
Tasarımcıların verdiği örnekte çift duyarlıklı iki karmaşık sayının çarpımı yalnız SSE2 ile 7, SSE3 ile 4 mikro işlem sürer. Bu kodun hızını belirleyen şey yürütülen mikro işlem sayısı olduğu için yeni buyruklar karmaşık sayı çarpmasını yüzde 75'e kadar hızlandırabilir. SPEC CPU2000'de derleyici SSE3'ü kullanarak 168.wupwise denektaşında yüzde 10-15 kazanç elde eder.
Bir video kodlayıcıda işlem yükünün en ağır kısmı genellikle hareket kestirimidir. Bu işlemde o anki çerçevenin blokları önceki çerçevenin bloklarıyla karşılaştırılır ve en iyi eşleşme aranır. En yaygın ölçüt mutlak farkların toplamıdır. Önceki çerçevenin blokları hizasız, o anki çerçevenin blokları hizalı yüklenir.
NetBurst mikromimarisinde 128 bitlik hizasız yükleme için bir mikro işlem yoktu; MOVUPS ve MOVDQU gibi buyruklar mikrokodla, iki 64 bitlik yüklemenin sonuçları birleştirilerek gerçekleniyordu. Erişim 64 baytlık bir sınırı aşarsa önbellek satırı bölünmesinin cezası da buna ekleniyordu. LDDQU bu sorunu çözmek için eklendi. Yükleme adresi 16 baytlık sınıra hizalıysa istenen baytları yükler; değilse hemen altındaki 16 baytlık sınırdan başlayan 32 baytlık bir öbek yükler ve istenen 16 baytı içinden alır. İstenenden fazla bayt yüklediği için önbelleğe alınmayan (UC ve USWC) bellek bölgelerinde ve bir yazmanın hemen ardından aynı verinin yüklenmesinin beklendiği durumlarda kullanılmamalıdır.
Tasarımcılar, hizasız yüklemelerin dörtte birinin önbellek satırı sınırını aştığı varsayımıyla LDDQU buyruğunun hareket kestirimini yüzde 30'a kadar hızlandırabildiğini, MPEG-4 kodlayıcılarında yüzde 10'dan büyük hızlanmalar görüldüğünü bildirdi.
SIMD buyruklarının çoğu dikey çalışır. Bu buyruklarda sonucun i. öğesi iki işlenenin i. öğelerinden hesaplanır. Yatay toplama ve çıkarma ise aynı işlenenin yan yana duran öğelerini birleştirir. Örneğin HADDPD sonucun birinci öğesine birinci işlenenin iki sayısının toplamını, ikinci öğesine ikinci işlenenin iki sayısının toplamını yazar.
Tasarımcılar bu buyrukları grafik yükleri için ekledi. Köşe verileri çoğunlukla bir yapı dizisi olarak tutulur. Her köşenin yapısında koordinatlar, normal vektör, renk ve doku koordinatları yan yana durur. SSE ise her alanın ayrı bir dizide tutulduğu dizi yapılarında daha iyi çalışır. Köşe gölgelendiricilerinde en sık yapılan işlem, üç ya da dört sayı çiftinin çarpılıp sonuçların toplandığı nokta çarpımdır ve veri yapı dizisi olarak tutulduğunda yatay buyruklar olmadan bu işlemi SSE ile hesaplamak zordur. Dört tek duyarlıklı sayı çiftinin nokta çarpımı yalnız SSE ile yedi buyruk, SSE3 ile üç buyruk tutar:
; SSE3 olmadan
mulps xmm0, xmm1 ; dört çarpım
movaps xmm1, xmm0
shufps xmm0, xmm1, 0xb1
addps xmm0, xmm1
movaps xmm1, xmm0
shufps xmm0, xmm0, 0x0a
addps xmm0, xmm1
; SSE3 ile
mulps xmm0, xmm1 ; dört çarpım
haddps xmm0, xmm0 ; komşu çiftler toplanır
haddps xmm0, xmm0 ; iki toplam birleştirilir
MONITOR ve MWAIT, işletim sisteminin boşta bekleme döngüsünün ve işletim sistemleri ile aygıt sürücülerindeki öteki meşgul bekleme döngülerinin Hyper-Threading teknolojili işlemcilerdeki başarımını iyileştirmek için eklendi. Yazılım bu buyruklarla bir iş parçacığının yararlı bir iş yapmadığını, örneğin iş beklediğini bildirir; işlemci de düşük güç tüketen ve başarım açısından eniyilenmiş özel bir duruma geçebilir. İşlemciyi bu durumdan uyandırmak için belirlenen bir bellek adresine, örneğin bir iş kuyruğuna, yazmak yeterlidir.
MONITOR, EAX yazmacında verilen adresten başlayan ve genellikle bir önbellek satırı büyüklüğündeki bir bölgeye yapılan yazmaları algılayacak donanımı kurar ve işlemcinin içindeki bekleyen izleme olayı bayrağını sıfırlar. Bölgeye bir yazma, bir kesme ya da sayfa tablolarını değiştirebilecek bir olay bu bayrağı işaretler. MWAIT işlemciyi, izlenen bölgeye bir yazma algılanana ya da işlenmesi gereken bir kesme veya kural dışı durum oluşana dek bu özel duruma sokar. Mimari açıdan MWAIT bir NOP buyruğuyla özdeştir, yalnızca işlemciye verilen bir ipucudur. Hyper-Threading destekli bir işlemci öteki iş parçacığının daha hızlı çalışmasına izin veren, daha az güç tüketen ya da ikisini birden sağlayan bir duruma geçebilir.
MWAIT izlenen adres bölgesini temizlediği için iki buyruk aynı döngü içinde kullanılmalıdır; MONITOR bir kez çalıştırılıp MWAIT döngüde yinelenemez. Tasarımcılar, işletim sistemlerinin bu buyruklarla boşta bekleme döngülerini belirgin biçimde hızlandıracağını ve daha düşük güçte daha yüksek başarım sağlayacağını öngörüyordu. İlk gerçeklemede iki buyruk en ayrıcalıklı düzeyde (halka 0) kullanılabilir, daha az ayrıcalıklı düzeylerde ise koşula bağlıdır.
Linux çekirdeğinin Intel işlemciler için boşta bekleme sürücüsü intel_idle, bir mantıksal işlemcinin boşta olduğunu işlemciye MWAIT buyruğuyla bildirir. EAX yazmacında geçirilen ipucu değeri işlemcinin enerji tasarrufu için kendini nasıl yapılandırabileceğini belirler; bu yapılandırmalara ACPI terimiyle C durumları denir. Sürücü, MWAIT desteği olmayan ya da bu desteği donanım yazılımı ayarlarından kapatılmış işlemcilerde çalışmaz.
90 nm Pentium 4'te x87, MMX, SSE, SSE2 ve SSE3 işlemleri iki kayan nokta yürütme öbeğinde çalışır. Öbeklerden biri SSE yazmaçları arası taşımalar gibi basit işlemleri, öteki daha karmaşık işlemleri yürütür. Tasarımcılar bu işlemcide x87, SSE, SSE2 ve SSE3 buyruklarının mikro işlemlerini yürütülmeden önce bekleten iki birimi büyüterek çokluortam algoritmalarında koşut yürütülebilecek işlemleri bulma olanağını artırdı.
AMD'nin Opteron işlemcisinin Mart 2007 tarihli veri sayfası, işlemcinin SSE, SSE2 ve SSE3 buyruklarını desteklediğini ve SSE3 desteğinin E sürümü ve sonraki işlemcilerde bulunduğunu belirtir.
GCC'nin -msse3 seçeneği MMX, SSE, SSE2 ve SSE3 yerleşik işlevlerini ve bu buyruklarla kod üretimini açar.
SSE ve SSE2'yi destekleyen bir işletim sistemi uygulamalar için SSE3'e de yeterli desteği sağlar. MONITOR ve MWAIT ise işletim sisteminin bu buyrukları desteklemesini gerektirir.
Bir program SSE3'ün SIMD 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 0. bitine bakar. Yalnız FISTTP kullanılacaksa bu bit yeterlidir. MONITOR ve MWAIT için aynı yazmacın 3. biti denetlenir; izlenen bölgenin en küçük ve en büyük boyu ise 5 numaralı CPUID işleviyle öğrenilir.