İçeriğe atla

SSE2

Vikipedi, özgür ansiklopedi
SSE2
SSE2'yi ilk kez sunan Intel Pentium 4 (Willamette) işlemcisi
TasarımcıIntel
Mimarix86
TürSIMD
Tanıtım2000
İlk işlemciPentium 4
Yazmaçlar8 × 128 bit (XMM0-XMM7), 64 bit kipinde 16; MXCSR
Buyruk sayısı144
ÖncelSSE
ArdılSSE3

SSE2 (İngilizce: Streaming SIMD Extensions 2), Intel'in x86 mimarisi için tanımladığı ve ilk kez Pentium 4 ile Xeon işlemcilerinde sunduğu bir tek buyruk, çoklu veri (SIMD) buyruk kümesi uzantısıdır.[1] Pentium 4'ün tasarımcılarına göre uzantı 144 yeni buyruk içerir ve çokluortam, içerik üretimi, bilim ve mühendislik uygulamalarının başarımını artırmayı amaçlar.[2]

SSE2, SSE ile gelen 128 bitlik XMM yazmaçlarını kullanır ve bu yazmaçlara iki çift duyarlıklı kayan noktalı sayı ile 128 bite paketlenmiş tam sayılar üzerinde koşut işlem yapan buyruklar ekler. Aynı yazmaçları kullandığı için SSE'nin gerektirdiğinin ötesinde bir işletim sistemi desteği istemez.[1] 64 bitlik x86 için yazılan System V uygulama ikili arayüzü double türü için SSE2'yi gerekli sayar.[3] Microsoft da Windows 8'in kurulabilmesi için işlemcinin SSE2 desteklemesini şart koştu.[4]

Yazmaçlar ve veri türleri

[değiştir | kaynağı değiştir]
128 bitlik bir XMM yazmacının SSE ve SSE2 ile taşıyabildiği veri türleri.

SSE2 yeni bir yazmaç ya da yürütme durumu tanımlamaz. Buyrukları SSE'nin sekiz 128 bitlik XMM yazmacını, 32 bitlik MXCSR denetim ve durum yazmacını, MMX yazmaçlarını ve genel amaçlı yazmaçları kullanır. MMX ve XMM yazmaçları belleği adreslemek için kullanılamaz; bellekteki işlenenlere genel amaçlı yazmaçlarla erişilir. 64 bit kipinde REX önekiyle erişilen XMM8-XMM15 yazmaçlarıyla XMM yazmaçlarının sayısı on altıya çıkar.[1]

Uzantı x86'ya beş yeni 128 bitlik veri türü getirdi. Biri IEEE 754 biçiminde iki çift duyarlıklı kayan noktalı sayıyı yan yana paketler. Öteki dördü paketlenmiş tam sayı türleridir ve 16 adet 8 bitlik, 8 adet 16 bitlik, 4 adet 32 bitlik ya da 2 adet 64 bitlik tam sayı taşır.[1] 128 bitlik paketlenmiş bir bellek işleneninin adresi 16 baytlık sınıra hizalanmış olmalıdır. Hizasız erişime izin veren MOVUPD buyruğu ile 8 baytlık bellek işleneni kullanan tek öğeli buyruklar bu kuralın dışında kalır.[1]

MXCSR yazmacının 6. biti olan ve olağanlaştırılmamış işlenenleri sıfır sayan bayrak mimariye SSE2 ile girdi. Intel, bu bayrağın Pentium 4 ve Xeon işlemcilerinin çoğunda bulunduğunu, ancak bazı erken sürümlerde bulunmadığını belirtir.[1]

Mimari, XMM yazmaçlarındaki verinin türünü denetlemez. İşlemci bellekten yüklediği verinin buyruğun beklediği türde olup olmadığına bakmaz; örneğin iki tek duyarlıklı işlenen üzerinde çift duyarlıklı toplama yapan ADDPD buyruğu kural dışı durum üretmeden çalışır ve sorunun kaynağı fark edilmez. Türün gözetilmesi bu yüzden programcıya, çeviriciye ya da derleyiciye düşer. Türü uymayan bir buyruk bazen doğru sonuç verir, ama mikromimari düzeyindeki gerçekleme yüzünden gecikme cezasına yol açabilir.[1]

Intel'in el kitabı SSE2 buyruklarını dört işlev grubuna ayırır:[1]

GrupÖrnek buyruklarKapsam
Paketlenmiş ve tek öğeli çift duyarlıklı kayan nokta buyruklarıMOVAPD, ADDPD, SQRTSD, CMPPD, CVTPD2PS, SHUFPDVeri taşıma, aritmetik, karşılaştırma, dönüştürme, mantık, öğelerin yerini değiştirme
64 ve 128 bitlik yeni SIMD tam sayı buyruklarıMOVDQA, PADDQ, PMULUDQ, PSHUFD, PSLLDQ64 bitlik toplama ve çıkarma, 32 bitten 64 bite çarpma, öğelerin yerini değiştirme, bayt düzeyinde kaydırma
MMX ve SSE tam sayı buyruklarının 128 bitlik sürümleriPADDB, PCMPEQB, PSRAWPSHUFW dışındaki bütün 64 bitlik SIMD tam sayı buyrukları
Önbellek denetimi ve bellek sırası buyruklarıCLFLUSH, MOVNTPD, MASKMOVDQU, LFENCE, MFENCE, PAUSEÖnbellek satırının boşaltılması, önbelleğe yazmadan belleğe yazma, yükleme ve yazma sırası

Kayan nokta buyrukları

[değiştir | kaynağı değiştir]

Paketlenmiş buyruklar işlenendeki iki sayının ikisinde de aynı işlemi yapar. Tek öğeli buyruklar ise yalnız alttaki 64 bit üzerinde çalışır ve birinci işlenenin üstteki sayısını hedefe olduğu gibi aktarır. Intel'e göre tek öğeli işlemler, kayan nokta biriminin duyarlık denetim alanı çift duyarlığa (53 bitlik anlamlı kısım) ayarlandığında yaptığı işlemlere benzer; fark, x87 yığıt işlemlerinin sonuç için 15 bitlik, SSE2 işlemlerinin ise 11 bitlik üs aralığı kullanmasıdır.[1]

Aritmetik buyruklar toplama, çıkarma, çarpma, bölme, karekök, en büyük ve en küçük değer işlemlerini kapsar. CMPPD ve CMPSD buyrukları anlık değerle seçilen sekiz karşılaştırma koşulundan birini uygular ve her karşılaştırma için bitlerinin tümü 1 ya da tümü 0 olan 64 bitlik bir maske döndürür. COMISD ve UCOMISD ise sonucu EFLAGS yazmacındaki ZF, PF ve CF bayraklarına yazar; ikisi, işlenenlerden biri NaN olduğunda geçersiz işlem kural dışı durumunu hangi koşulda ürettikleriyle ayrılır.[1]

Dönüştürme buyrukları çift ve tek duyarlıklı sayılar arasında, çift duyarlıklı sayılar ile 32 bitlik tam sayılar arasında ve tek duyarlıklı sayılar ile 32 bitlik tam sayılar arasında çalışır. CVTPD2DQ gibi buyruklar sonucu MXCSR yazmacındaki yuvarlama kipine göre yuvarlar; adında fazladan T harfi bulunan CVTTPD2DQ gibi sürümleri ise sayıyı keser.[1]

Tam sayı buyrukları

[değiştir | kaynağı değiştir]

PADDQ ve PSUBQ 64 bitlik tam sayıları toplar ve çıkarır; işaretli ve işaretsiz işlenenlerde aynı biçimde çalışır. PMULUDQ iki işaretsiz 32 bitlik tam sayıyı çarparak 64 bitlik sonuç üretir. PSHUFD, PSHUFLW ve PSHUFHW 8 bitlik bir anlık değerin belirlediği sıraya göre öğelerin yerini değiştirir; PSLLDQ ve PSRLDQ işleneni bayt düzeyinde sola ya da sağa kaydırır. MOVQ2DQ ve MOVDQ2Q 64 bitlik tam sayıyı MMX ve XMM yazmaçları arasında taşır.[1]

MMX ve SSE ile gelen 64 bitlik SIMD tam sayı buyruklarının hepsi, PSHUFW dışında, SSE2 ile XMM yazmaçlarında çalışan 128 bitlik sürümler kazandı. Bu sürümler paketlenmiş işlenenlerde aynı kuralları izler; örneğin PADDB buyruğunun 64 bitlik sürümü 8 baytı, 128 bitlik sürümü 16 baytı birlikte toplar.[1]

Önbellek ve bellek sırası buyrukları

[değiştir | kaynağı değiştir]

CLFLUSH, verilen doğrusal adrese karşılık gelen önbellek satırını belleğe yazıp önbellek hiyerarşisinin bütün düzeylerinde geçersiz kılar. Buyruk SSE2 ile gelmiş olsa da SSE2'yi gerçeklemeyen işlemcilerde de bulunabilir; bu yüzden CPUID çıktısında ayrı bir biti vardır.[1] MOVNTDQ, MOVNTPD, MOVNTI ve MASKMOVDQU buyrukları veriyi, mümkün olduğunda önbellek hiyerarşisine yazmadan belleğe yazması için işlemciye ipucu verir.[1]

SSE ile gelen SFENCE buyruğuna iki eş eklendi. LFENCE yüklemeler için bir bellek engeli kurar. Engelden önce belirtilen bütün yüklemeler bitmeden öngörüye dayalı hiçbir yükleme engeli geçemez. MFENCE bu işlevi yazmalarla birleştirir ve engelden önceki bütün yükleme ve yazmaların, engelden sonrakilerden önce gözlemlenebilir olmasını güvenceye alır.[1] PAUSE buyruğu Pentium 4 ve Xeon işlemcilerinde meşgul bekleme döngülerinin başarımını artırmak için tanımlandı; Pentium 4'te böyle bir döngü sürerken güç tüketimini de azaltır. SSE2 ayrıca 2EH ve 3EH öneklerini koşullu dallanma buyruklarında işlemciye dallanma ipucu verecek biçimde tanımlar. Bu önekler çevirici dilde bir karşılığı olmadan, yalnız makine kodu düzeyinde kullanılır.[1]

LFENCE buyruğu 2018'de Spectre saldırılarına karşı önlemler arasında ele alındı. Saldırıları tanıtan makalenin yazarları, Intel'in listelediği kullanıcı kipi buyruklarından yalnız CPUID'nin olağan kodda kullanılabildiğini ve birçok yazmacı bozduğunu, LFENCE ile MFENCE'in ise yazmaçları bozmadan öngörüye dayalı yürütmeyi sınırlamada işe yarar göründüğünü belirtti. Bu davranış buyrukların tanımında yer almadığı için her işlemcide çalışacağı güvence altında değildi; yazarlara göre Intel mühendisleri LFENCE'in tanımının öngörüye dayalı yürütmeyi engellediğini belirtecek biçimde değiştirileceğini bildirdi.[5]

Pentium 4'te gerçekleme

[değiştir | kaynağı değiştir]

Pentium 4'te x87, MMX, SSE ve SSE2 buyrukları aynı kayan nokta yürütme öbeğinde çalışır. Bu öbeğin yazmaç öbeği 128 girişlidir ve her girişi 128 bit genişliğindedir.[2]

Tasarımcılar kayan nokta ve SSE yürütme donanımının tamamını boru hattına dönüştürmenin maliyetinden kaçınarak 128 bitlik işlemleri iki saat çevrimine yaydı. Kayan nokta toplayıcısı bir saat çevriminde bir çift duyarlıklı ya da iki tek duyarlıklı toplama yapabildiği için paketlenmiş bir SSE2 toplaması iki çevrimde tamamlanır. Çarpıcı da bir çevrimde bir çift duyarlıklı ya da iki tek duyarlıklı çarpma yapar; bu, 1,5 GHz'de tek duyarlıkta saniyede 6 milyar, çift duyarlıkta 3 milyar kayan nokta işlemi üst sınırı verir. Tam sayı SIMD işlemlerinde aritmetik mantık birimi bir çevrimde 64 bit işlediği için 128 bitlik paketlenmiş bir tam sayı toplaması da iki çevrim sürer; öğelerin yerini değiştirme ve iç içe yerleştirme işlemleri için ayrı bir birim vardır, tam sayı çarpmaları ise kayan nokta çarpıcısını kullanır.[2]

Aynı makaleye göre 1,5 GHz'lik Pentium 4'te SSE ve SSE2 buyrukları, SPEC 2000'in kayan nokta denektaşlarında yalnız x87 kullanan sürüme göre yaklaşık yüzde 5 başarım kazancı sağlıyordu. Yazarlar derleyiciler geliştikçe bu kazancın artacağını öngörüyordu.[2]

AMD işlemcilerde

[değiştir | kaynağı değiştir]

AMD'nin 64 bitlik x86 genişletmesini taşıyan Opteron işlemcisinin Nisan 2003 tarihli veri sayfası SSE ve SSE2 desteğini sayar ve genişletmenin 128 bitlik SSE/SSE2 yazmaçlarının sayısını sekizden on altıya çıkardığını belirtir.[6] GCC belgeleri de SSE'nin çift duyarlıklı aritmetiği destekleyen sürümünün Pentium 4 ile AMD'nin x86-64 yongalarında bulunduğunu yazar.[7]

x87 ile karşılaştırma

[değiştir | kaynağı değiştir]

SSE2 ile çift duyarlıklı kayan nokta hesabı da x87 kayan nokta biriminin dışında, XMM yazmaçlarında yapılabilir hâle geldi. Intel'e göre SSE ve SSE2, x87 kayan nokta biriminin işlediği tek ve çift duyarlıklı veri türlerini doğal biçimleriyle işler. x87 ise hesabı 80 bitlik genişletilmiş duyarlıklı biçimde yapar ve sonucu belleğe yazmadan önce tek ya da çift duyarlığa yuvarlar. Bu yüzden aynı işlem iki birimde biraz farklı sonuç verebilir; fark yalnız anlamlı kısmın en düşük bitlerinde görülür.[1]

XMM yazmaçları x87 ve MMX yazmaçlarından bağımsız olduğu için yalnız XMM yazmaçlarını kullanan SSE ve SSE2 buyrukları x87 ya da MMX buyruklarıyla aynı kod içinde kısıtsız çalışabilir. Intel'in verdiği örnekte bir uygulama kayan nokta hesabının çoğunu XMM yazmaçlarında yaparken trigonometrik ve öteki aşkın işlevleri x87 ile hesaplayabilir. MMX yazmaçlarını kullanan SSE2 buyrukları ise MMX ile x87 arasındaki geçiş kurallarına uymak zorundadır.[1]

Yazılımda kullanım

[değiştir | kaynağı değiştir]

Çağrı kuralları

[değiştir | kaynağı değiştir]

64 bitlik x86 için yazılan System V uygulama ikili arayüzü, bu arayüze uyan programlar için float türüne SSE'yi, double türüne SSE2'yi gerekli işlemci özelliği sayar ve kayan noktalı argümanları XMM yazmaçlarında geçirir.[3] Microsoft'un x64 çağrı kuralları da bütün kayan nokta işlemlerini 16 XMM yazmacıyla yapar ve ilk dört argümandan kayan noktalı olanları XMM0-XMM3 yazmaçlarında geçirir.[8]

GCC'nin -mfpmath=sse seçeneği kayan nokta aritmetiği için SSE buyruklarını kullanır. Bu seçenek x86-64 derleyicisinde varsayılandır; 32 bitlik x86 derleyicisinde ise etkili olması için -msse2 ya da uygun bir -march seçeneğiyle SSE uzantılarının açılması gerekir. GCC belgelerine göre ortaya çıkan kod çoğu durumda belirgin biçimde daha hızlıdır ve x87 kodunun sayısal kararsızlık sorunlarından kaçınır, ama ara sonuçların 80 bitlik olmasını bekleyen kodu bozabilir.[7]

Microsoft Visual C++ derleyicisinin 32 bitlik x86 sürümünde /arch seçeneği verilmezse varsayılan buyruk kümesi SSE2'dir. /arch:IA32 seçeneği ise gelişmiş buyrukları kapatır ve kayan nokta hesabını x87 ile yapar.[9]

İşletim sistemleri

[değiştir | kaynağı değiştir]

SSE2, SSE ile aynı yazmaçları kullandığı için bağlam değiştirmede SSE'nin gerektirdiğinin ötesinde bir işletim sistemi desteği gerekmez; işletim sisteminin SSE'yi desteklemesi SSE2'yi de desteklediği anlamına gelir.[1] Microsoft, Windows 8'in kurulabilmesi için işlemcinin SSE2 desteklemesini şart koştu ve gerekçe olarak üçüncü taraf uygulamaların ve sürücülerin bu buyruk kümesini giderek daha çok kullanmasını gösterdi.[4]

Desteğin sınanması

[değiştir | kaynağı değiştir]

Bir program SSE2 buyruklarını kullanmadan önce işlemcinin CPUID buyruğunu desteklediğini, ardından EAX yazmacına 1 yüklenerek çağrılan CPUID buyruğunun EDX yazmacına döndürdüğü değerin 26. bitinin 1 olduğunu sınar. İşletim sistemi SSE durumunu ve kural dışı durumlarını desteklemiyorsa ya da işlemci SSE2'yi tanımıyorsa SSE2 buyrukları geçersiz işlem kodu kural dışı durumu üretir.[1]

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 "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.
  2. 1 2 3 4 Hinton, Glenn; Sager, Dave; Upton, Mike; Boggs, Darrell; Carmean, Doug; Kyker, Alan; Roussel, Patrice (2001). "The Microarchitecture of the Pentium 4 Processor" (PDF). Intel Technology Journal. 5 (1). 12 Ocak 2022 tarihinde kaynağından arşivlendi (PDF)13 Eylül 2026.
  3. 1 2 Matz, Michael; Hubička, Jan; Jaeger, Andreas; Mitchell, Mark (7 Ekim 2013). "System V Application Binary Interface: AMD64 Architecture Processor Supplement, Draft Version 0.99.6" (PDF). 1 Ağustos 2016 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 13 Eylül 2026.
  4. 1 2 "What is PAE, NX, and SSE2 and why does my PC need to support them to run Windows 8?". Microsoft. 11 Nisan 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Eylül 2026.
  5. ↑ Paul Kocher, Daniel Genkin, Daniel Gruss ve diğerleri (3 Ocak 2018). "Spectre Attacks: Exploiting Speculative Execution". arXiv. 9 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Eylül 2026.
  6. ↑ "AMD Opteron Processor Data Sheet (23932 Rev. 3.00)". AMD. Nisan 2003. Erişim tarihi: 13 Eylül 2026.
  7. 1 2 "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.
  8. ↑ "x64 calling convention". Microsoft. 19 Mart 2025. Erişim tarihi: 13 Eylül 2026.
  9. ↑ "/arch (x86)". Microsoft. 21 Ekim 2025. Erişim tarihi: 13 Eylül 2026.