factograf
TR

Advanced Vector Extensions

Advanced Vector Extensions
All data from the card 8
Tasarımcı
Intel
Mimari
x86
Tür
SIMD
Tanıtım
2011
İlk işlemci
İkinci kuşak Intel Core (Sandy Bridge)
Yazmaçlar
16 × 256 bit (YMM0-YMM15); AVX-512 ile 32 × 512 bit (ZMM0-ZMM31)
Sürümler
AVX2 (2013), AVX-512 (2016), AVX10 (2023)
Öncel
SSE4

Advanced Vector Extensions (AVX), Intel'in x86 mimarisi için tanımladığı ve ilk kez 2011'de ikinci kuşak Intel Core işlemcilerle sunduğu bir tek buyruk, çoklu veri (SIMD) buyruk kümesi uzantısıdır. SSE ailesinin 128 bitlik XMM yazmaçlarını 256 bitlik YMM yazmaçlarına genişletir ve VEX adlı yeni bir buyruk kodlaması getirir. Intel önerisini Nisan 2008'de yayımladı; AMD 2009'da AVX'i destekleyeceğini açıkladı ve 2011'de Bulldozer çekirdekli işlemcilerinde destekledi.

Aile sonradan AVX2, AVX-512 ve AVX10 uzantılarıyla genişledi. AVX ve AVX2, 64 bitlik x86 için tanımlanan x86-64-v3 mikromimari düzeyinin; AVX-512'nin temel alt uzantıları da x86-64-v4 düzeyinin gerektirdiği özellikler arasındadır.

Tarihçe

Uzantı Yıl Yazmaçlar Intel'de ilk işlemciler AMD'de ilk destek Başlıca yenilik
AVX 2011 16 × 256 bit (YMM) Sandy Bridge (ikinci kuşak Core) Bulldozer (2011) VEX öneki, üç işlenenli buyruklar, 256 bitlik kayan nokta işlemleri
AVX2 2013 16 × 256 bit (YMM) Haswell (dördüncü kuşak Core) Excavator 256 bitlik tam sayı işlemleri, dağınık yükleme, öğe başına kaydırma
AVX-512 2016 32 × 512 bit (ZMM), 8 maske yazmacı P çekirdekli Xeon işlemciler Zen 4 (EPYC 9004) EVEX öneki, maskeyle koşullu işlem, gömülü yuvarlama denetimi
AVX10 2023 (belirtim) AVX-512 ile aynı Granite Rapids (AVX10.1) – Başarım ve verimlilik çekirdeklerinde ortak buyruk kümesi, sürüm numarasıyla sınama

Intel, Nisan 2008'de AVX ve FMA önerisini yayımladı. AMD'ye göre bu öneri, AMD'nin 2007'de duyurduğu SSE5 uzantısının üç ve dört işlenenli buyruklarını, çarpma ile toplamayı birleştiren buyruklarını ve bazı yer değiştirme buyruklarını farklı bir biçimde içeriyordu. Öneri ayrıca kayan noktalı SIMD işlemlerinin genişliğini iki katına çıkarıyor, kaynağı bozmayan üç işlenenli yazımı eski SSE buyruklarının çoğuna uyguluyor ve yeni uzantılar için işlem kodu alanını büyük ölçüde genişletiyordu.

İki önerinin işlevleri örtüştüğü için AMD, Mayıs 2009'da AVX'i gelecekteki işlemcilerinde destekleyeceğini açıkladı ve SSE5'i AVX çerçevesine uyarlayarak XOP, CVT16 ve FMA4 uzantılarına dönüştürdü. AMD, ilk ürünlerinin AVX belirtiminin Ocak 2009 tarihli beşinci sürümüyle uyumlu olmasını beklediğini, FMA buyruklarında ise Ağustos 2008 tarihli üçüncü sürümü izleyeceğini belirtti. Gerekçe, Intel'in Aralık 2008'de FMA tanımında yaptığı ve AMD'nin ürün takvimine sığdıramadığı büyük değişikliklerdi.

AVX ilk kez 2011'de ikinci kuşak Intel Core işlemcilerde, aynı yıl AMD'nin Bulldozer çekirdekli AMD FX, Opteron 6200 ve Opteron 4200 işlemcilerinde yer aldı. AVX2, 2013'te Haswell mikromimarisine dayanan dördüncü kuşak Core işlemcilerle geldi. Intel AVX-512'yi 2016'da sundu; Haziran 2023'te yayımladığı teknik raporla da AVX-512'yi temel alan ve sonraki vektör buyruklarını toplayacak AVX10'u tanımladı.

Yazmaçlar

XMM yazmacı YMM yazmacının, YMM yazmacı da ZMM yazmacının alt bitleridir. AVX-512 bunlara sekiz maske yazmacı ekler.
XMM yazmacı YMM yazmacının, YMM yazmacı da ZMM yazmacının alt bitleridir. AVX-512 bunlara sekiz maske yazmacı ekler.

AVX, 32 bit ve daha dar çalışma kiplerinde YMM0-YMM7, 64 bit kipinde YMM0-YMM15 olmak üzere 256 bitlik SIMD yazmaçları getirir. YMM yazmaçlarının alt 128 biti SSE'nin XMM yazmaçlarıdır. VEX öneki taşımayan eski SSE buyrukları yalnız XMM yazmaçlarını görür ve YMM yazmaçlarının üst bitlerine dokunmaz; VEX ile kodlanan 128 bitlik AVX buyrukları ise bu üst bitleri sıfırlar.

İşletim sistemi bağlam değiştirmede bu ek durumu da saklamak zorundadır. Intel'in XSAVE buyrukları işlemci durumunu bileşenlere ayırır; 1 numaralı bileşen SSE'nin XMM yazmaçlarını ve MXCSR'yi, 2 numaralı bileşen AVX'in ek yazmaç durumunu tutar. x87 ve SSE buyruklarının aksine AVX buyrukları, işletim sistemi AVX durumunu XCR0 denetim yazmacında açmadıkça çalıştırılamaz ve geçersiz işlem kodu kural dışı durumu üretir.

VEX kodlaması

SSE'nin iki işlenenli ADDPS buyruğu sonucu kaynaklardan birinin üzerine yazar, AVX'in üç işlenenli VADDPS buyruğu kaynakları korur.
SSE'nin iki işlenenli ADDPS buyruğu sonucu kaynaklardan birinin üzerine yazar, AVX'in üç işlenenli VADDPS buyruğu kaynakları korur.

x86 buyruklarında iki işlenenli yazım yaygındır ve sonuç işlenenlerden birinin üzerine yazılır. AVX'in getirdiği VEX öneki bir yazmaç işlenenini doğrudan önekin içinde kodlayabildiği için kaynağı bozmayan üç işlenenli buyrukları mümkün kılar. Örneğin SSE'deki ADDPS xmm1, xmm2/m128 buyruğunun AVX karşılığı VADDPS xmm1, xmm2, xmm3/m128 biçimindedir. Intel'e göre kaynağı bozmayan işlenen, tipik SSE döngülerinde gereken yazmaç sayısını, yazmaçlar arası kopyalamaları ve açık yükleme işlemlerini azaltır, kodu da küçültür. Bazı buyruklarda anlık değer baytının üst dört biti üçüncü bir kaynak işleneni kodlar ve dört işlenenli yazım elde edilir; VBLENDVPS ve VBLENDVPD bunlardandır.

VEX öneki ayrıca 64 bit kipinin REX önekinin işlevini, SIMD önekleri olarak kullanılan 66H, F2H ve F3H baytlarını ve 0FH, 0F38H, 0F3AH kaçış baytlarını daha sıkışık biçimde içinde taşır. VEX ile kodlanan buyrukların çoğunda bellek işleneninin 16 ya da 32 baytlık sınıra hizalanması gerekmez. VEX öneki MMX ve x87 yazmaçlarıyla çalışan buyruklarda kullanılamaz; bu yüzden MMX yazmaçlarını kullanan eski SIMD buyrukları dışında 128 bitlik SIMD buyruklarının neredeyse hepsinin üç işlenenli bir AVX karşılığı vardır.

Buyruklar

Intel'e göre AVX'in 256 bitlik kayan nokta buyrukları, 128 bitlik SSE buyruklarına göre iki kata varan başarım kazancı sağlar. AVX, toplama, çıkarma, çarpma, bölme, karekök, karşılaştırma, en büyük ve en küçük değer ile yuvarlama işlemlerini tek ve çift duyarlıklı sayılar üzerinde yapan 35 adet 256 bitlik kayan nokta aritmetiği buyruğu içerir. Kayan nokta karşılaştırma buyrukları SSE ve SSE2'deki 8 koşul yerine 32 koşuldan birini seçebilir.

Yeni veri taşıma buyrukları arasında bellekteki bir değeri YMM yazmacının bütün öğelerine yayan VBROADCASTSS ve VBROADCASTSD, 128 bitlik bir parçayı YMM yazmacına yerleştiren ya da ondan çıkaran VINSERTF128 ve VEXTRACTF128, bir maskeye göre bellekten yükleyen ya da belleğe yazan VMASKMOVPS ve VMASKMOVPD, öğelerin yerini değiştiren VPERMILPS, VPERMILPD ve VPERM2F128 ile YMM yazmaçlarının üst yarısını ya da tamamını sıfırlayan VZEROUPPER ve VZEROALL bulunur.

AVX'te tam sayı SIMD buyrukları yalnız 128 bitlik VEX kodlu sürümler kazandı; 256 bitlik tam sayı işlemleri AVX2 ile geldi. Paketlenmiş buyrukların 256 bitlik sürümleri çoğunlukla yazmacı iki 128 bitlik yarıya ayırarak her yarıda ayrı çalışır.

AVX2

AVX2, 128 bitlik SIMD tam sayı buyruklarının büyük çoğunluğunu 256 bitlik YMM yazmaçlarına taşır; AVX ile aynı VEX kodlamasını ve aynı işletim sistemi desteğini kullanır. AVX'in kayan noktalı buyruklarının 32 ve 64 bitlik tam sayılar için eksiksiz karşılıklarını da ekler. AVX2'nin yeni işlevleri şunlardır:

  • Dağınık yükleme (İngilizce: gather). VPGATHERDD ve VGATHERDPS gibi buyruklar, bellekteki bitişik olmayan öğeleri bir taban yazmacı ile bir vektör yazmacındaki indisleri kullanan yeni bir adresleme biçimiyle yükler.
  • Yarılar arasında öğe taşıma. VPERMD, VPERMQ, VPERMPS ve VPERMPD öğeleri YMM yazmacının iki yarısı arasında da taşıyabilir; yayma buyrukları tam sayılar için de tanımlandı.
  • Öğe başına kaydırma. VPSLLVD, VPSRLVD ve VPSRAVD gibi buyruklar her öğeyi, ikinci işlenenin karşılık gelen öğesinde verilen miktar kadar kaydırır.

Muła ve Lemire'ye göre VPSHUFB gibi buyruklar baytların yerini yalnız 256 bitlik yazmacın her 16 baytlık yarısının içinde değiştirebilir; AVX ve AVX2 buyruklarının çoğu verileri iki yarı arasında taşıyamaz. AVX2'nin genişliği bazı algoritmalarda özel buyrukları geride bırakır. Muła, Kurz ve Lemire, AVX2 ile yazılan bir bit sayma işlevinin büyük dizilerde POPCNT buyruğuna dayanan eniyilenmiş bir işlevin yaklaşık iki katı hızla çalıştığını, sekiz bayt başına 1,02 yerine 0,52 çevrim harcadığını gösterdi.

FMA

FMA buyrukları çarpma ile toplamayı ya da çıkarmayı tek buyrukta birleştirir. Intel'in FMA uzantısı 256 bitlik vektörler için 36, 128 bitlik vektörler ve tek öğeli sayılar için 60 kayan nokta buyruğu içerir. Buyruk adlarındaki 132, 213 ve 231 sayıları işlenenlerin çarpma ve toplamaya hangi sırayla girdiğini gösterir; örneğin VFMADD231PD paketlenmiş çift duyarlıklı sayılar üzerinde birleşik çarpma-toplama yapar.

AMD'nin belgesine göre bu buyruklar işlem sayısını azaltmanın yanında duyarlığı da artırabilir, çünkü ayrı çarpma ve toplama işlemlerinde her ara sonuç ayrı yuvarlanır. AMD, birleşik çarpma-toplamayı ilk olarak Bulldozer çekirdeğinde dört işlenenli FMA4 buyruklarıyla donanıma aldı; Piledriver çekirdeği Intel'in FMA3 buyruklarını da ekledi. AMD'ye göre Intel'in sonraki tanımı, sonucu işlenenlerden birinin üzerine yazan üç işlenenli bir biçim kullanır. Zen çekirdekleri FMA'yı destekler, FMA4'ü desteklemez.

AVX-512

Maskeyle koşullu toplama. Maske biti 0 olan öğeler toplanmaz; {z} yazılmazsa eski değerlerini korur, yazılırsa sıfırlanır.
Maskeyle koşullu toplama. Maske biti 0 olan öğeler toplanmaz; {z} yazılmazsa eski değerlerini korur, yazılırsa sıfırlanır.

AVX-512 ailesi, AVX-512 Foundation buyruklarının yanında üstel ve çarpmaya göre ters değer, çakışma algılama ve önceden getirme buyrukları ile ek 512 bitlik buyruk kümelerinden oluşur. Uzantı 64 bit kipinde ZMM0'dan ZMM31'e kadar 32 adet 512 bitlik yazmaç getirir. Bu yazmaçların alt 256 biti YMM, alt 128 biti XMM yazmaçlarıdır; 32 bit kipinde kullanılabilen yazmaç sayısı sekizde kalır. EVEX adlı yeni önek, VEX'in olanaklarının yanında maske yazmaçlarını, gömülü yaymayı, buyruğa gömülü yuvarlama denetimini ve sıkıştırılmış adres uzaklığını kodlar. AVX-512'nin durumu XSAVE'in üç bileşenine dağılır; bunlar maske yazmaçları, ZMM0-ZMM15 yazmaçlarının üst 256 biti ve ZMM16-ZMM31 yazmaçlarıdır.

Sekiz 64 bitlik maske yazmacından k1-k7 koşullu işlem için kullanılır. Örneğin VADDPS zmm1 {k1}{z}, zmm2, zmm3 buyruğu yalnız k1 yazmacında biti 1 olan öğeleri toplar; {z} belirteci öteki öğeleri sıfırlar, belirteç yazılmazsa bu öğeler hedefte olduğu gibi kalır. AVX-512 zamanla 128 ve 256 bitlik vektör boylarını da destekleyecek biçimde genişledi ve her biri ayrı bir CPUID biti taşıyan birçok alt uzantıya bölündü. Intel'e göre Granite Rapids kod adlı Xeon işlemcilerde bu bitlerin sayısı 20'yi aşacaktı.

AMD, AVX-512'yi dördüncü kuşak EPYC işlemcilerindeki Zen 4 çekirdekleriyle destekledi. AMD'nin ayar kılavuzuna göre bu işlemcilerin veri yolu 512 değil 256 bit genişliğindedir ve 512 bitlik bir vektörün yüklenmesi iki çevrim sürer. AMD bu yolla güç tasarrufu sağlandığını ve kazanılan gücün saat sıklığını artırmak için kullanılabildiğini belirtir; kılavuz bu işlemcilerin AVX-512 desteğinin BFLOAT16 ve VNNI buyruklarını da kapsadığını yazar. GCC belgeleri, Intel'in Alder Lake, Raptor Lake ve Meteor Lake işlemcileri için AVX2 ve AVX-VNNI uzantılarını sayar, AVX-512 uzantılarını saymaz.

AVX10

AVX10, AVX-512'nin bütün yeteneklerini içerir ve Intel'in gelecekteki başarım (P) ve verimlilik (E) çekirdeklerinin hepsinde desteklenecek ortak bir vektör buyruk kümesi olarak tasarlandı. Intel, AVX10'un üç amacını AVX-512'nin zengin yeteneklerini sürdürmek, gelecekteki bütün Intel işlemcilerde desteklenecek ortak bir vektör buyruk kümesi oluşturmak ve geliştiricinin CPUID özellik bitlerini denetleme yükünü azaltmak olarak sayar.

Destek, her yeni buyruk için ayrı bir CPUID biti yerine önceki sürümleri kapsayan ve hep artan bir sürüm numarasıyla bildirilir. AVX-512'nin buyruk kümesi AVX10 ile birlikte dondurulur; AVX-512'nin özellik bitleri eski yazılımlar için gelecekteki P çekirdekli işlemcilerde açık kalır, sonraki yeni vektör buyrukları ise yalnız AVX10'un parçası olarak tanımlanır. İlk sürüm AVX10.1, Granite Rapids işlemcilerdeki AVX-512 buyruklarının AVX10 ile ileriye uyumlu alt kümesini kapsar. AVX10.2 ise yapay zekâ veri türleri ve dönüşümleri, veri taşıma ve standart desteği için yeni buyruklar ekler; bu buyruklar küçük ayrıklar dışında 128, 256 ve 512 bitlik vektör boylarının hepsinde desteklenir.

Intel'e göre AVX2 için derlenmiş uygulamalar AVX10 için yeniden derlendiğinde ek bir ayar yapılmadan başarım kazanmalıdır; vektör yazmacı sayısının yetmediği AVX2 uygulamaları 16 ek yazmaçtan en çok yararlanacaktır. Raporun Mart 2025'teki üçüncü düzeltmesinde en büyük vektör yazmacı boyunu 256 bitle sınırlayan ifadeler belgeden çıkarıldı.

SSE ile birlikte kullanım

Intel'in 2011 tarihli raporuna göre eski SSE buyrukları ile AVX buyrukları arasındaki geçişlerde doğan saklama ve geri yükleme cezaları
Intel'in 2011 tarihli raporuna göre eski SSE buyrukları ile AVX buyrukları arasındaki geçişlerde doğan saklama ve geri yükleme cezaları

256 bitlik AVX buyrukları ile VEX öneki taşımayan eski SSE buyrukları arasında geçiş başarım cezasına yol açabilir. Intel'in 2011 tarihli raporuna göre eski SSE buyrukları YMM yazmaçlarının üst 128 bitinden habersiz olduğu için donanım 256 bitlik AVX'ten SSE'ye geçerken bu bitleri saklar, yeniden AVX'e dönerken geri yükler; saklama ve geri yükleme işlemlerinin her biri onlarca saat çevrimi süren bir ceza doğurur.

Rapora göre geçişler, 256 bitlik AVX kodunun 128 bitlik yerleşik işlevlerle, SSE ile yazılmış çevirici dil koduyla, SSE için derlenmiş kayan nokta koduyla ya da bunları içeren kütüphanelerle karışmasından doğabilir. SSE buyrukları içeren bir kesme hizmet yordamı da geçişe yol açabilir ve bu durumda uygulama geliştiricisinin yapabileceği bir şey yoktur. Cezadan kaçınmak için eski SSE buyrukları VEX kodlu karşılıklarına çevrilebilir ya da geçişten önce VZEROUPPER veya VZEROALL ile YMM yazmaçlarının üst bitleri sıfırlanabilir. Üst bitler sıfırsa donanımın bunları saklaması gerekmez. Raporda Intel derleyicisinin AVX seçenekleriyle derlenen işlevlerin başına ve sonuna VZEROUPPER buyruğunu kendiliğinden eklediği belirtilir.

İşletim sistemi desteği ve sınanma

Intel'in önerdiği sınama sırasına göre bir uygulama AVX'i kullanmadan önce üç koşulu denetler. EAX yazmacına 1 yüklenerek çağrılan CPUID buyruğunun ECX yazmacındaki 27. bit (OSXSAVE) 1 olmalı, XGETBV buyruğuyla okunan XCR0 yazmacının 1. ve 2. bitleri işletim sisteminin XMM ve YMM durumunu açtığını göstermeli, aynı CPUID çıktısındaki 28. bit (AVX) de 1 olmalıdır. Intel, yalnız AVX bitine bakmanın yeterli olmadığını, işletim sistemi YMM durumunu yönetmiyorsa AVX buyruklarının bu bitten bağımsız olarak geçersiz işlem kodu kural dışı durumu üreteceğini vurgular.

Windows'ta AVX desteği Windows 7 Service Pack 1 ve Windows Server 2008 R2 Service Pack 1 ile geldi. Microsoft, uygulamaların kural dışı durumlarda AVX yazmaçlarının içeriğine erişebilmesi ve hata ayıklayıcıların bu durumu okuyup değiştirebilmesi için XState işlevleri adlı arayüzleri ekledi.

Yazılımda kullanım

Derleyiciler

GCC'nin -mavx ve -mavx2 seçenekleri ilgili uzantıların yerleşik işlevlerini ve bu buyruklarla kod üretimini açar. GCC, AVX'i açan bir seçenekle derlenen kodda SSE buyrukları yerine yeni AVX buyruklarını ya da SSE buyruklarının AVX karşılıklarını üretir. Microsoft Visual C++ derleyicisinde /arch:AVX, /arch:AVX2, /arch:AVX512, /arch:AVX10.1 ve /arch:AVX10.2 seçenekleri vardır. Microsoft'un belgesine göre AVX2 tam sayı işlemlerinin çoğunu 256 bitlik vektörlere genişletir ve FMA buyruklarının kullanımını açar; /arch:AVX10.1 seçeneği Visual Studio 2022'nin 17.13 sürümüyle geldi.

Mikromimari düzeyleri

2020 yazında AMD, Intel, Red Hat ve SUSE, 64 bitlik x86'nın taban özellik kümesinin üzerinde üç mikromimari düzeyi tanımladı. x86-64-v3 düzeyi AVX, AVX2, FMA, F16C, BMI1, BMI2, LZCNT, MOVBE ve OSXSAVE özelliklerini; x86-64-v4 düzeyi AVX512F, AVX512BW, AVX512CD, AVX512DQ ve AVX512VL özelliklerini gerektirir.

Red Hat, Red Hat Enterprise Linux 9 için x86-64-v3 yerine x86-64-v2 düzeyini seçti. Şirketin gerekçeleri arasında x86 için tek bir birleşik dağıtım oluşturma hedefi, 2020'de çıkan bazı yeni sunucu sınıfı işlemcilerin AVX'i gerçeklememesi ve AVX buyruklarının bazı yazılım gerçeklemelerinde, örneğin benzetim araçlarında, bulunmaması vardı.

Read next

In 16 languages

Text from Wikipedia, CC BY-SA 4.0 · Source article