Intel, CPU'ya derin öğrenme talimatları ekleyecektir. İşlemcide AVX talimatları desteği - neden gerekli

  • 27.06.2019

C++ kodum SSE kullanıyor ve şimdi bunu mümkün olduğunda AVX'i destekleyecek şekilde geliştirmek istiyorum. Bu yüzden AVX'in kullanılabilir olduğunu tespit ediyorum ve AVX komutlarını kullanarak bir işlev çağırıyorum. Win7 SP1 + VS2010 SP1 ve AVX ile bir işlemci kullanıyorum.

AVX'i kullanmak için aşağıdakiler etkinleştirilmelidir:

#include "immintrin.h"

ve sonra _mm256_mul_ps , _mm256_add_ps vb. gibi yerleşik AVX işlevlerini kullanabilirsiniz. Sorun, varsayılan olarak VS2010'un çok yavaş olan ve bir uyarı gösteren kod üretmesidir:

uyarı C4752: Intel(R) genişletilmiş vektör uzantıları bulundu; /arch:avx kullanmayı düşünün

Görünüşe göre VS2010 aslında AVX talimatlarını kullanmıyor, bunun yerine onları taklit ediyor. Derleyici seçeneklerine /arch:AVX ekledim ve iyi sonuçlar aldım. Ancak bu seçenek, derleyiciye mümkün olduğunda AVX komutlarını kullanmasını söyler. Bu yüzden kodum AVX'i desteklemeyen bir CPU'da çökebilir!

Öyleyse soru şu ki, VS2010 derleyicisinin AVX kodu üretmesini nasıl sağlayabilirim, ancak yalnızca yerleşik AVX işlevlerini doğrudan belirttiğimde. SSE için çalışıyor, sadece SSE dahililerini kullanıyorum ve /arch:SSE gibi herhangi bir derleyici seçeneği olmadan SSE kodu üretiyor. Ancak AVX için bir nedenden dolayı çalışmıyor.

2 yanıt

Gördüğünüz davranış, pahalı durum değiştirmenin sonucudur.

Agner Fog kılavuzunun 102. sayfasına bakın:

SSE ve AVX komutları arasında her hatalı geçiş yaptığınızda, son derece yüksek bir para cezası (~70) ödersiniz.

/arch:AVX olmadan derlediğinizde, VS2010 SSE talimatları oluşturacaktır, ancak AVX yerleşiklerine sahip olduğunuz her yerde AVX'i kullanmaya devam edecektir. Bu nedenle, bu tür durum değiştirme cezalarına sahip olacak SSE ve AVX komutları ile kod alacaksınız. (VS2010 bunu biliyor, bu yüzden gördüğünüz uyarıyı veriyor.)

Bu nedenle, ya tüm SSE'yi ya da tüm AVX'i kullanmalısınız. /arch:AVX belirtilmesi, derleyiciye tüm AVX'leri kullanmasını söyler.

Biri SSE ve diğeri AVX için olmak üzere birden çok kod yolu oluşturmaya çalışıyorsunuz gibi görünüyor. Bunun için SSE ve AVX kodunuzu iki farklı derleme birimine ayırmanızı öneririm. (biri /arch:AVX ile ve diğeri olmadan derlenmiştir). Ardından bunları birbirine bağlayın ve hangi donanımda çalıştığına göre seçilecek bir dağıtım programı oluşturun.

SSE ve AVX'i birleştirmeniz gerekiyorsa, durum değiştirme cezalarından kaçınmak için _mm256_zeroupper() veya _mm256_zeroall() kullandığınızdan emin olun.

/* AVX'ten SSE'ye geçiş cezasını önlemek için VZEROUPPER kullanın. Intel Optimizasyon Kılavuzu'na bakın (Nisan 2011, sürüm 248966), Bölüm 11.3 */ #define VLEAVE _mm256_zeroupper

Ardından VLEAVE(); AVX için yerleşik yönergeler kullanılarak her işlevin sonunda çağrılır.

Genişletilmiş AVX-512 komut seti ile çalışmak için bir programcı kılavuzu. Intel'in 14 nm nesil Skylake işlemcilerinin bir parçası olarak, 512 bitlik talimatları destekleyen tamsayı değerleri ve kayan nokta değerlerinin işlenmesi için blokların ortaya çıkması bekleniyordu. Daha sonra Skylake neslinde AVX-512 desteğinin yalnızca Intel Xeon sunucu işlemcilerinin ve Xeon Phi hesaplama hızlandırıcılarının (14 nm Knights Landing hızlandırıcı neslinde) bir parçası olacağı biliniyordu. Knights Landing hızlandırıcılarının bir parçası olarak, genel amaçlı Xeon işlemcilere kıyasla daha geniş bir AVX-512 uzantı seti için destek sözü verilmektedir. Bu, genişletilmiş AVX-512 komut setinin, hesaplama hızlandırıcılarında bu aşamada uygulanması daha kolay olan (ve daha iyi getirilerle) hesaplamalarda paralellik geliştirmeyi amaçladığı gerçeğiyle açıklanmaktadır.

Bu arada, Intel Knights Landing hızlandırıcıları, önemli ölçüde yeniden tasarlanmış bir Atom Silvermont mimarisine dayanıyor. 72 çekirdekli bir yapılandırmada Knights Landing işlemcileri aynı anda 288'e kadar iş parçacığı işleyebilir ve çift duyarlıklı işlemlerde 3 teraflop'a kadar ve tek duyarlıklı işlemlerde 6 teraflop'a kadar teslim edebilir. Bu tür çözümler için AVX-512 desteği, doktorun sipariş ettiği şeydir. Paralellik onların özüdür. Knights Landing sevkiyatının bu çeyrekte başlamasıyla, AVX-512 SIMD-etkin yazılım bugünün sorunudur. Skylake-EP işlemcileri, birkaç istisna dışında Knights Landing ile aynı AVX-512 setlerini kullanacağından, Skylake-EP modelleri piyasaya çıktığında yeni uzantılar için önemli yazılım desteği olacaktır. Hatırladığımız kadarıyla Skylake-EP'nin piyasaya sürülmesi 2017'nin ikinci yarısında bekleniyor.

Intel masaüstü ve sunucu platformlarında AVX yönergeleri için destek derinliği (Intel, ComputerBase.de)

Yine 2017'nin ikinci yarısında, bugün Cannon Lake kod adıyla aşina olduğumuz Intel'in ilk 10 nm işlemcileri karşımıza çıkacak. Programcılar için yakın tarihli bir Intel belgesinde ComputerBase.de'nin yazarları, Cannon Lake istemci işlemcilerinin de AVX-512'yi destekleyeceğini buldu. En azından AVX512IFMA, AVX512VBMI, SHA ve UMPI uzantılarından bahsediyoruz. Hep birlikte, 2017'nin sonunda programcılardan AVX-512 için yaygın bir destek bekleyebileceğimizi gösteriyor. İstemci uygulamaları için, AVX-512'nin kullanılması, çok büyük medya verilerinin işlenmesinin daha az işlemci yükü ile gerçekleşeceği anlamına gelecektir. Daha doğrusu, AVX-512 ile uyumlu donanım kaynaklarını kullanarak operasyon mümkün olduğunca verimli olacaktır. Bu görevlerde tüketim azalacak ve performans artacaktır.

AVX-512'yi AVX-256/128 ve önceki "multimedya" yönergeleri üzerinden uygulamanın faydaları

Ayrıca 2016 yılı sonunda veya 2017 yılı başında şirketin ürünlerinde hayatına başlayacak olan AMD Zen işlemcilerinin mimarisi, saat başına iki adet 256 bit AVX komutu ile çalışacak. Bunu yapmak için, her Zen çekirdeği iki adet 256-bit FMAC (birleştirilmiş çarpma - ekleme yeteneği) alacaktır. Pratikte, böyle bir mimari, bir 512 bitlik talimatın bir saat döngüsünde yürütülmesine izin verecektir. Bunun Intel Cannon Lake işlemcilerde nasıl uygulandığını henüz söyleyemeyiz.

İyileştirmeler

  • Yeni VEX talimat kodlama şeması
  • SIMD vektör kayıtlarının boyutu 128'den (XMM) 256 bite yükseltildi (YMM0 - YMM15 kayıtları). Mevcut 128-bit SSE komutları, yüksek kısmı değiştirmeden yeni YMM kayıtlarının alt yarısını kullanacaktır. YMM kayıtları ile çalışmak için yeni 256 bit AVX talimatları eklendi. Gelecekte, SIMD vektör kayıtlarını 512 veya 1024 bit'e genişletmek mümkündür.

Yeni kodlama şeması

Yeni VEX komut kodlama şeması, VEX önekini kullanır. Şu anda 2 ve 3 bayt uzunluğunda iki VEX öneki vardır. 2 baytlık VEX öneki için, ilk bayt 3 baytlık 0xC4 için 0xC5'tir. 64 bit modunda VEX önekinin ilk baytı benzersizdir. 32 bit modunda, ikinci baytın yüksek biti tarafından çözülen LES ve LDS talimatlarıyla bir çakışma vardır, bu yalnızca 64 bit modunda, LES ve LDS talimatlarının desteklenmeyen biçimleri aracılığıyla önemlidir. VEX öneki ile birlikte mevcut AVX talimatlarının uzunluğu 11 baytı geçmez. Gelecekteki sürümlerde daha uzun talimatlar bekleniyor.

Yeni talimatlar

Talimat Tanım
VBROADCASTSS, VBROADCASTSD, VBROADCASTF128 32 bit, 64 bit veya 128 bit işleneni bellekten XMM veya YMM vektör kaydının tüm öğelerine kopyalar.
VINSERTF128 256 bit YMM kaydının düşük veya yüksek yarısını 128 bit işlenenin değeriyle değiştirir. Alıcı kaydının diğer kısmı değiştirilmez.
VEXTTRACTF128 256 bitlik bir YMM kaydının düşük veya yüksek yarısını alır ve bunu 128 bitlik bir hedef işlenene kopyalar.
VMASKMOVPS, VMASKMOVPD Vektör işleneninden herhangi bir sayıda öğeyi koşullu olarak bellekten hedef kaydına okur, kalan öğeleri okunmamış halde bırakır ve hedef kaydın karşılık gelen öğelerini sıfırlar. Ayrıca, bir vektör kaydından herhangi bir sayıda öğeyi, bellek işleneninin kalan öğelerini değiştirmeden bırakarak, bellekteki bir vektör işlenenine koşullu olarak yazabilir.
VPERMILPS, VPERMILPD 32 bit veya 64 bit vektör öğelerini seçici işlenene göre yeniden düzenler (bellekten veya kayıttan).
VPERM2F128 Seçici olarak bir anlık sabit (imm) kullanarak iki 256 bitlik kaydın 4 128 bitlik girişini 256 bitlik bir hedef işlenene değiştirir.
VZEROALL Tüm YMM kayıtlarını siler ve kullanılmamış olarak işaretler. 128-bit ve 256-bit modu arasında geçiş yaparken kullanılır.
VZEROUPPER Tüm YMM kayıtlarının yüksek yarısını sıfıra ayarlar. 128-bit ve 256-bit modu arasında geçiş yaparken kullanılır.

AVX spesifikasyonu ayrıca PCLMUL komut grubunu da açıklar (Parallel Carry-Less Multiplication, Parallel CLMUL)

  • PCLMULLQLQDQ xmmreg,xmmrm
  • PCLMULHQLQDQxmmreg,xmmrm
  • PCLMULLQHQDQxmmreg,xmmrm
  • PCLMULHQHQDQxmmreg,xmmrm
  • PCLMULQDQ xmmreg,xmmrm,mm

Başvuru

Multimedya programlarında ve bilimsel görevlerde yoğun kayan nokta hesaplamaları için uygundur. Daha yüksek derecede bir paralellik mümkün olduğunda, gerçek sayılarla performansı artırır.

İşletim sistemlerinde destek

YMM kayıtlarının kullanımı, işletim sisteminden destek gerektirir. Aşağıdaki sistemler YMM kayıtlarını destekler:

AVX'li mikroişlemciler

Intel ve AMD uygulamaları arasındaki uyumluluk, XOP talimat setinde tartışılmaktadır.

Gelecekteki genişlemeler

VEX komut kodlama şeması, AVX komut setinin daha da genişletilmesine kolaylıkla izin verir. Bir sonraki sürüm olan AVX2'de, tamsayılarla çalışma, FMA3 (kayan noktalı sayıları işlerken performansı 2 kat artıracak), belleğe dağıtılmış bir vektör yükleme (toplama) vb. için talimatlar eklenmesi planlanmaktadır.

x86 komut setine çeşitli planlanmış eklemeler:

  • CLMUL
  • AMD FMA4
  • AMDXOP
  • AMD CVT16

Notlar


x86 işlemci temel yönerge uzantısı kümeleri
MMX | MMXEXT | SSE | SSE2 | SSE3 | SSSE3 | SSE4 | ATA | 3DŞimdi! | 3DNowExt | SSE5 | AVX| AES

Wikimedia Vakfı. 2010 .

  • Devlet Güvenlik Ofisi (Macaristan)

Diğer sözlüklerde "AVX" in ne olduğunu görün:

    avx- (((image))) İkili Romanlar Büyük Harfler > AAA à DZZ EAA à HZZ IAA à LZZ MAA à PZZ QAA à TZZ UAA à XZZ ... Wikipédia tr Français

    AVX- Sigles d'une seule lettre Sigles deux lettre > Sigles de trois lettres > Sigles de trois lettres, Dört harfli Sigles de cinq lettres Altı harfli Sigles de sept… … Wikipedia tr Français

Bugün bir işlemcide avx komutlarının ne olduğu, nerede ve ne için kullanıldığı konusunda bir sohbet başlatmak istiyorum.

Ortalama bir müşteri mağazaya gidiyor ve iş ve oyun için bir bilgisayar/dizüstü bilgisayar satın almak istiyor. Pratikte, bir Word'de bir özet yazıp sonra onu oynatmak daha güçlü ve daha ucuzdur.
İşlemcilere gelince, raflarda üçüncü güce eşit kızgın kütükler var. i3 bir pazarlama komplosu mu? Gerçekten Pentium "böyle ah üç sadece daha ucuz"? Evet ve hayır. Ve işte olay.

Word'de bir özet yazmak için, en ucuz Celeron yeterlidir (ve bir çek ve geri kalan garanti ile bir bit pazarından alırsanız daha ucuza bir "işlemci fişi" alabilirsiniz).
Özetten sonra tüm oyunları oynamak için, AI-üçte bir (2 çekirdek 4 iş parçacığı) yapımına sahip bir Pentium uygundur. Oyunlar için AVX talimatları gerekli değildir (gerekli SSE'ler mevcut olduğu sürece).

Ancak profesyonel görevler için donanım sanallaştırması ve AVX talimatları için destek kullanışlı olacaktır, bu nedenle en az bir AI-üçte bir almak daha iyidir.

AVX talimatları neden gereklidir?

Bir dizi profesyonel göreve neler dahildir? Kural olarak, AVX'ten yoksun olan taşlar, sanallaştırmanın donanım hızlandırmasından da yoksundur.
Bu çok kovanın sanal bir makinesini gerektirecek android için geliştirme (bazı emülatörler başlamaz bile, bazıları ne yazık ki çalışır, çekirdekleri yoğun bir şekilde yükler).
Multimedya verilerini çiğnemek (fotoğrafları işlemekten videoları kodlamaya ve 3D grafikleri dosyalamaya kadar, bu yüzden hadi oynayalım oyuncular daha pahalı bir işlemciye geçmelidir).

AVX olmadan

İşlemci, talimatlar için kayıtlara sahiptir.
SSE kaydı 128 bit ve AVX kaydı 256 bittir.
Böylece kimsenin beynine bir taş anatomisi ile tahammül etmemek için sadece diyelim ki - 256 128'e sığmaz.

AVX olmadan, fotoğrafları işleyebilir, videoları çiğneyebilir ve üçlü testereyi de görebilirsiniz. Ama nüanslar var ...
Basitçe söylemek gerekirse, eski 8 çekirdekli Xeon (AXV yapamıyor), videoları modern i3 (AVX yapabilen) ile aynı hızda kesecek.

İşlemcinin bir ardışık düzeni var: onu bellekten nereden alacağını öğrendi, bellekten aldı, hesapladı, sonuçları belleğe gönderdi.
Basitleştirilmiş, AVX'li ve AVX'siz boru hattı aşağıdaki gibi gösterilebilir.

Gördüğünüz gibi, ikinci durumda daha az işlem var. AVX sayacının daha hızlı çalıştığını varsaymak mantıklıdır (her hesaplama döngüsünde). Ve her döngüde bir kez daha hızlı - daha az gigahertz ile daha hızlı hesaplayabilirsiniz.

AVX ile ilgili bir başka iyi şey de ekstra işlenendir. 2 işlenen değil, boru hattını da azaltan 3 işlenen kullanılır. Diyelim ki X ve Y'yi eklemek istiyoruz.
Kod: 2 işlenenin (X=X+Y) işlenenlerden birinin üzerine yazılmasına neden olacağı normal işlem.
3 işlenenin (Z=X+Y) sonucu üçüncü işlenene yazmanıza izin verdiği AVX işlemi.
Karmaşık? Tamam, kolay patlayalım.

AVX ile videoları kesmek daha hızlı olacaktır. Çünkü, yukarıdakilere ek olarak, bir optimal çerçeve dökümü bonusu eklenir.
Bilgisayar her kareyi saymaz. Çerçeveyi dikdörtgenlere bölerek karşılaştırır ve uygun olanı bulunursa bitmiş parçayı kullanır.
Burada AVX, videolarla nasıl daha iyi çalışılacağını öğrendi (ilgilenenler için, profesyonellerden okuyun ve kendimi güzel bir resimle sınırlayacağım).

Daha önce, döküm - solda gösterildiği gibi. AVX arızası daha akıllıdır - sağda gösterildiği gibi.

Özetleme

Bir Word'de özet yazmak için herhangi bir işlemci yapacaktır.
Böylece bir oyun oynamak için bir deneme yerine, üçte birlik bir yapıya sahip bir kütük yapacaktır.
İçeriği kesmek için - üçte birini ayırmak daha iyidir.

İyileştirmeler

  • Yeni VEX talimat kodlama şeması
  • SIMD vektör kayıtlarının boyutu 128'den (XMM) 256 bite yükseltildi (YMM0 - YMM15 kayıtları). Mevcut 128-bit SSE komutları, yüksek kısmı değiştirmeden yeni YMM kayıtlarının alt yarısını kullanacaktır. YMM kayıtları ile çalışmak için yeni 256 bit AVX talimatları eklendi. Gelecekte, SIMD vektör kayıtlarını 512 veya 1024 bit'e genişletmek mümkündür.

Yeni kodlama şeması

Yeni VEX komut kodlama şeması, VEX önekini kullanır. Şu anda 2 ve 3 bayt uzunluğunda iki VEX öneki vardır. 2 baytlık VEX öneki için, ilk bayt 3 baytlık 0xC4 için 0xC5'tir. 64 bit modunda VEX önekinin ilk baytı benzersizdir. 32 bit modunda, ikinci baytın yüksek biti tarafından çözülen LES ve LDS talimatlarıyla bir çakışma vardır, bu yalnızca 64 bit modunda, LES ve LDS talimatlarının desteklenmeyen biçimleri aracılığıyla önemlidir. VEX öneki ile birlikte mevcut AVX talimatlarının uzunluğu 11 baytı geçmez. Gelecekteki sürümlerde daha uzun talimatlar bekleniyor.

Yeni talimatlar

Talimat Tanım
VBROADCASTSS, VBROADCASTSD, VBROADCASTF128 32 bit, 64 bit veya 128 bit işleneni bellekten XMM veya YMM vektör kaydının tüm öğelerine kopyalar.
VINSERTF128 256 bit YMM kaydının düşük veya yüksek yarısını 128 bit işlenenin değeriyle değiştirir. Alıcı kaydının diğer kısmı değiştirilmez.
VEXTTRACTF128 256 bitlik bir YMM kaydının düşük veya yüksek yarısını alır ve bunu 128 bitlik bir hedef işlenene kopyalar.
VMASKMOVPS, VMASKMOVPD Vektör işleneninden herhangi bir sayıda öğeyi koşullu olarak bellekten hedef kaydına okur, kalan öğeleri okunmamış halde bırakır ve hedef kaydın karşılık gelen öğelerini sıfırlar. Ayrıca, bir vektör kaydından herhangi bir sayıda öğeyi, bellek işleneninin kalan öğelerini değiştirmeden bırakarak, bellekteki bir vektör işlenenine koşullu olarak yazabilir.
VPERMILPS, VPERMILPD 32 bit veya 64 bit vektör öğelerini seçici işlenene göre yeniden düzenler (bellekten veya kayıttan).
VPERM2F128 Seçici olarak bir anlık sabit (imm) kullanarak iki 256 bitlik kaydın 4 128 bitlik girişini 256 bitlik bir hedef işlenene değiştirir.
VZEROALL Tüm YMM kayıtlarını siler ve kullanılmamış olarak işaretler. 128-bit ve 256-bit modu arasında geçiş yaparken kullanılır.
VZEROUPPER Tüm YMM kayıtlarının yüksek yarısını sıfıra ayarlar. 128-bit ve 256-bit modu arasında geçiş yaparken kullanılır.

AVX spesifikasyonu ayrıca PCLMUL komut grubunu da açıklar (Parallel Carry-Less Multiplication, Parallel CLMUL)

  • PCLMULLQLQDQ xmmreg,xmmrm
  • PCLMULHQLQDQxmmreg,xmmrm
  • PCLMULLQHQDQxmmreg,xmmrm
  • PCLMULHQHQDQxmmreg,xmmrm
  • PCLMULQDQ xmmreg,xmmrm,mm

Başvuru

Multimedya programlarında ve bilimsel görevlerde yoğun kayan nokta hesaplamaları için uygundur. Daha yüksek derecede bir paralellik mümkün olduğunda, gerçek sayılarla performansı artırır.

İşletim sistemlerinde destek

YMM kayıtlarının kullanımı, işletim sisteminden destek gerektirir. Aşağıdaki sistemler YMM kayıtlarını destekler:

AVX'li mikroişlemciler

Intel ve AMD uygulamaları arasındaki uyumluluk, XOP talimat setinde tartışılmaktadır.

Gelecekteki genişlemeler

VEX komut kodlama şeması, AVX komut setinin daha da genişletilmesine kolaylıkla izin verir. Bir sonraki sürüm olan AVX2'de, tamsayılarla çalışma, FMA3 (kayan noktalı sayıları işlerken performansı 2 kat artıracak), belleğe dağıtılmış bir vektör yükleme (toplama) vb. için talimatlar eklenmesi planlanmaktadır.

x86 komut setine çeşitli planlanmış eklemeler:

  • CLMUL
  • AMD FMA4
  • AMDXOP
  • AMD CVT16

Notlar


x86 işlemci temel yönerge uzantısı kümeleri
MMX | MMXEXT | SSE | SSE2 | SSE3 | SSSE3 | SSE4 | ATA | 3DŞimdi! | 3DNowExt | SSE5 | AVX| AES

Wikimedia Vakfı. 2010 .

Diğer sözlüklerde "AVX" in ne olduğunu görün:

    avx- (((image))) İkili Romanlar Büyük Harfler > AAA à DZZ EAA à HZZ IAA à LZZ MAA à PZZ QAA à TZZ UAA à XZZ ... Wikipédia tr Français

    AVX- Sigles d'une seule lettre Sigles deux lettre > Sigles de trois lettres > Sigles de trois lettres, Dört harfli Sigles de cinq lettres Altı harfli Sigles de sept… … Wikipedia tr Français