İyi bir soru veya ilginç bir cevabı olan en az bir tane. Bu cevabın bir kısmı, CPU'ların çoklu çekirdekler yerine genişlikte verimli bir şekilde ölçeklenebilecekleri bir dünya görüntüler . Lisans / fiyat modelleri farklı olurdu!
Gerisi neden yapamadıklarını açıklar. Özet:
- Çok çekirdekli ölçeğin maliyeti doğrusal olarak yakın
- 1 çekirdeğin süperskalar boru hattını genişletmenin maliyeti ~ dörtlü olarak ölçeklenir Bu, yine de bir noktaya kadar yeterli kaba kuvvetle yapılabilir. Tek iş parçacıklı performans etkileşimli kullanım için çok önemlidir (bu nedenle, sadece çıkış için değil, uçtan uca gecikme önemlidir), bu nedenle mevcut büyük çekirdekli üst düzey CPU'lar bu fiyatı öder. örn. Skylake (4 genişliğinde), Ryzen (5 veya 6 genişliğinde) ve Apple A12 (büyük çekirdeklerde 7 genişliğinde, küçük enerji verimli göbeklerde 3 genişliğinde)
- Ciddi azalan IPC , ILP'yi bulmak için sıra dışı uygulamalarda bile boru hattını 3 veya 4 genişliğin ötesine genişletmekten geri döner . Şube özleri ve önbellek özleri zordur ve hala tüm boru hattını oyalar.
Frekanstan bahsetmediniz, sadece IPC, ancak ölçeklendirme frekansı da zor. Daha yüksek frekans daha yüksek voltaj gerektirir, bu nedenle güç kesilmiş frekanslı ölçekler : ^1
doğrudan frekanstan ve ^2
voltajdan. (Kondansatör depolanan enerji V ^ 2 ile ölçeklenir ve kaçak akımın ötesindeki dinamik gücün çoğu FET geçitlerinin + tellerin kapasitif yüklerine pompalama yükünden gelir.)
Performans = frekans süreleri IPC. (Aynı mimari içerisinde. Daha geniş SIMD, aynı işi daha az talimatla yapmanıza olanak tanır ve bazı ISA'lar diğerlerinden daha yoğundur, örneğin MIPS, aynı işi yapmak için genellikle x86 veya AArch64'ten daha fazla talimat alır.)
Maliyetler kalıp alanında (üretim maliyeti) ve / veya güçtedir (dolaylı olarak soğutmanın zor olması nedeniyle frekansı sınırlar). Ayrıca, Watt başına daha düşük güç ve performans, özellikle mobil (pil) ve sunucular (güç yoğunluğu / soğutma maliyetleri / elektrik maliyetleri) için kendi başına bir hedeftir.
Soket başına çok çekirdekli bir şey olmadan önce, üretilebilecek tek bir CPU ile elde edilebileceğinden daha fazla verim yapmak istediğiniz üst düzey kullanımlar için çok soketli sistemleriniz vardı, bu yüzden bunlar sadece SMP sistemleriydi. (Sunucular, yüksek kaliteli iş istasyonları).
Tek çekirdekli kadar verimli siz istediniz ölçek olsaydı, biz soket başına 1 fiziksel çekirdekli sistemlere sahip olur ve SMT (örn HyperThreading) onları çoklu mantıksal çekirdek olarak hareket izin vermek. Tipik masaüstü / dizüstü bilgisayarlar yalnızca 1 fiziksel çekirdeğe sahip olacaktı ve daha fazla çekirdekle doğrusal ölçeklenmeyen şeyleri paralelleştirmek için mücadele etmeyeceğiz. örneğin make -j4
, çok soketli sunuculardan yararlanmak ve / veya masaüstünde G / Ç gecikmesini gizlemek için. (Ya da boru hattı genişliği kolayca ölçeklenirse IPC olmasaydı, belki de hala çok paralellik yapmaya çalışırdık, bu yüzden daha fazla SMT ipliği kullanmak zorunda kaldık.) İşletim sistemi çekirdeğinizin, CPU yolu olmadığı sürece, tüm mantıksal çekirdeklerde çalışmasına ihtiyaç duyacaktı. SMT'yi işletim sistemine çok farklı buluyordu, bu yüzden paralel programlama algoritmaları ve kilitlemeye hala ihtiyaç duyuluyordu.
Donald Knuth 2008 röportajında söyledi
Çok çekirdekli mimariye yönelik mevcut eğilim ile kişisel mutsuzluğum hakkında biraz alev alabilirim. Bana göre, donanım tasarımcılarının fikirleri tükeniyor ve az da olsa daha hızlı çalışan makineler vererek , Moore Yasasının gelecekteki ölümü suçunu yazılım yazarlarına aktarmaya çalışıyor gibi görünüyorlar. temel kriterler!
Evet, gerçek programlarda 8 kat fazla işlem hacmine sahip mucize tek çekirdekli işlemcilere sahip olsaydık, muhtemelen hala onları kullanıyorduk. İki soketli sistemlerde yalnızca daha fazla iş hacmi için daha fazla ödeme yapmaya değdiğinde (tek iş parçacıklı performans değil).
Birden fazla CPU, birden fazla program çalışırken bağlam değiştirme maliyetlerini düşürür (aralarında hızlı geçiş yapmak yerine gerçekten paralel olarak çalışmasını sağlayarak); Böyle bir CPU'nun gerektireceği devasa sıra dışı makinelerin kesintiye uğramasına neden olan ön-işlemcili çoklu görev muhtemelen şimdi olduğundan daha fazla acı verirdi.
Fiziksel olarak tek çekirdekli (çekirdekler arasında birbirine bağlı olmayan basit bir önbellek hiyerarşisi için) olacaktı, ancak SMT'yi (örneğin Intel'in HyperThreading) desteklemesi için yazılım, iş akış kaynakları için dinamik olarak rekabet eden 8 mantıksal çekirdek olarak kullanabildi. Veya sadece 1 iş parçacığı çalışıyor / durmuyorsa, tam yararı olur.
Böylece, aslında daha kolay / doğal olduğunda (örneğin, aynı anda çalışan ayrı işlemler) veya bu canavara ait IPC'yi maksimize etmeyi önleyen bağımlılık zincirleri ile kolayca paralel hale getirilmiş problemler için birden fazla iplik kullanırsınız.
Fakat ne yazık ki Knuth'un çok çekirdekli işlemcilerin bu noktada bir şey olmayı bırakacağını düşünmesi arzulu.
Tek iş parçacığı performans ölçeklendirme
Sanırım 8 çekirdekli bir işlemciye 1 çekirdek eşdeğeri yaparlarsa, bir çekirdeğin IPC'de% 800 artış sağlayacağı için tüm programlarda tam performans elde edersiniz, sadece birden fazla çekirdek için optimize edilmiş olanları değil.
Evet bu doğru. Eğer böyle bir CPU kurmak mümkün olsaydı, çok şaşırtıcı olurdu. Ancak , aynı yarı iletken üretim sürecinde (yani, transistörlerin aynı kalite / verimlilikte) tam anlamıyla imkansız olduğunu düşünüyorum . Çekirdekleri birbirine yapıştırmak için mantıktan tasarruf etseniz ve çekirdek başına özel önbellek için çok fazla alana ihtiyaç duymayacak olsanız bile, 8 çekirdekli bir CPU ile aynı güç bütçesinde ve kalıp alanında kesinlikle mümkün değil.
Frekans artışlarına izin verseniz bile (asıl ölçüt saniyede çalışmak, saat başına çalışmak değildir), 2 kat daha hızlı bir CPU yapmak bile çok zor olacaktır.
Böyle bir CPU'yu inşa etmek için aynı güç ve kalıp alanı bütçesinin yakınında herhangi bir yerde (bu nedenle üretim maliyeti) mümkün olsaydı, evet işlemci satıcıları onları bu şekilde inşa ederdi.
Spesifik olarak Daha Fazla Çekirdek veya Daha Geniş Çekirdek? Bu cevabı anlamak için gerekli arka plan için; sıralı sıralı CPU'ların nasıl çalıştığıyla basit bir şekilde başlar, daha sonra süperskalar (saat başına çoklu komut). Sonra P4 döneminin etrafındaki güç duvarına nasıl çarptığımızı, kolay frekans ölçeklendirmenin sona erdiğini, çoğunlukla sadece IPC'yi bıraktığını ve daha küçük transistörlerde bile ileriye giden yol olarak talimat başına daha fazla iş yapıldığını (örn. SIMD) açıkladığını açıklıyor.
Bir boru hattının genişletilmesi (saat başına maksimum talimat) tipik olarak genişlik karesi kadar maliyeti ölçeklendirir . Bu maliyet, daha geniş paralel bağımlılık kontrolü (tehlike tespiti) ve çalışmaya hazır talimatları bulmak için daha geniş bir sıra dışı zamanlayıcı için kalıp alanında ve / veya güçte ölçülür. Ve daha başka talimatlar çalıştırmak istiyorsanız, kayıt dosyanızdaki ve önbellekteki okuma / yazma bağlantı noktaları nop
. Özellikle, FMA veya bir araya getirme ekli gibi 3 giriş talimatınız varsa (2 kayıt + bayrak).
CPU'ları genişletmek için azalan IPC iadeleri de var ; En iş yükü çok daha geniş bir çekirdek yapım küçük ölçekli / CPU yararlanmak için kısa menzilli İLP (komut seviyesi paralellik) sınırlı değildir IPC zaten sınırlı olup olmadığını daha genişliğinden daha IPC (saat başına talimatları) geliştirmek bağımlılık zincirleri, şube özlüyor, önbellek özlüyor, ya da diğer tezgahlara göre çekirdek. Bağımsız yinelemeli kontrolsüz döngülerde hız kazanacağınızdan emin olun, ancak çoğu zaman harcadığı kod bu değildir. Karşılaştırma / dallanma talimatları, "tipik" kod olan IIRC'deki talimat karışımının% 20'sini oluşturur. (Çeşitli veri kümeleri için% 15 - 25 arasında rakamlar okuduğumu düşünüyorum.)
Ayrıca, tüm bağımlı talimatları durduran bir önbellek özeti (ve ardından ROB kapasitesine ulaşıldığında her şey) daha geniş bir CPU için daha pahalı olur. (Daha fazla yürütme ünitesini boşta bırakma fırsatı;
IPC'yi 8 katına çıkarmak için, şube tahmin doğruluğunda ve önbellek vuruş oranlarında en az 8 kat iyileştirmeye ihtiyacımız var . Ancak önbellek isabet oranları, çoğu iş yükü için belirli bir noktadan sonra önbellek kapasitesiyle iyi ölçeklenmez. HW ön ayarlaması akıllıdır, ancak o kadar da akıllı olamaz . Ve 8x IPC'de, dal belirleyicilerinin döngü başına 8 kat daha fazla tahmin üretmesinin yanı sıra daha doğru olmaları gerekir.
Sıra dışı yürütme işlemcileri oluşturmak için mevcut teknikler yalnızca kısa mesafelerde ILP'yi bulabilir . Örneğin, Skylake'in ROB boyutu 224 kaynaşık alanlı etki alanı, yürütülmemiş işlerin zamanlayıcısı 97 kaynaşık etki alanıdır. Zamanlayıcı boyutunun ILP'nin çok uzun sürmesi durumunda 2 uzun komut zincirinden çıkarılmasında sınırlayıcı bir faktör olduğu bir durum için uzunlukların artması için , iki uzun bağımlılık zincirine sahip bir halka üzerindeki etkinin anlaşılması bölümüne bakınız . Ve / veya bu daha genel ve tanıtım cevabını görün ).
Dolayısıyla, iki ayrı uzun döngü arasında ILP'yi bulmak, donanımla yapabileceğimiz bir şey değildir. Döngü füzyonu için dinamik ikili yeniden derleme bazı durumlarda mümkün olabilir, ancak Transmeta Crusoe yoluna gitmedikleri sürece işlemcilerin yapabileceği bir şey yoktur. (farklı bir iç ISA'nın üstüne x86 öykünme katmanı; bu durumda VLIW). Ancak uop önbellekleri ve güçlü kod çözücüleri olan standart modern x86 tasarımları çoğu kod için kolay değildir.
Ve x86'nın dışında, hala kullanımda olan tüm ISA'ların kodunu çözmek nispeten kolaydır, bu nedenle uzun mesafeli optimizasyonlardan başka dinamik bir yeniden derleme için motivasyon yoktur. TL: DR: donanıma daha fazla ILP getirebilecek sihirli derleyiciler için umut, Itanium IA-64 için işe yaramadı ve seri bir yürütme modeline sahip mevcut herhangi bir ISA için süper geniş bir CPU için çalışma olasılığı düşük.
Süper geniş bir CPU'nuz olsaydı, SMT'yi desteklemesini kesinlikle isterdiniz, böylece birden çok düşük ILP iş parçacığı çalıştırarak yapılacak işle beslenmesini sağlayabilirsiniz.
Skylake şu anda 4 uop genişliğinde (ve saatte 2 ila 3 uop gerçek bir IPC elde etmekte, hatta yüksek verimli kodda 4'e yakın olsa da), varsayımsal 8x daha geniş bir CPU 32 genişlikte olacaktır!
Bunu, bu yürütme kaynaklarını dinamik olarak paylaşan 8 veya 16 mantıksal CPU'ya ayırabilmek harika olurdu: duraksamayan dişliler tüm ön uç bant genişliğini ve arka uç verimini elde eder.
Ancak 8 ayrı çekirdekle, bir iplik durduğunda yürütme birimlerini beslemek için başka hiçbir şey yoktur; diğer konular fayda sağlamıyor.
İnfaz çoğu zaman patlaktır: yüklenen bir önbellek boşalmasını bekler, sonra paralel olarak birçok talimat geldiğinde bu sonucu kullanabilir. Süper geniş bir CPU ile bu patlama daha hızlı ilerleyebilir ve aslında SMT'ye yardımcı olabilir.
Fakat büyülü süper geniş CPU'larımız olamaz.
Dolayısıyla, verim kazanmak için, bunun yerine donanıma donanım düzeyinde paralellik biçiminde göstermek zorundayız . Genelde derleyiciler çok büyük döngüler gibi basit durumlar dışında ne zaman / nasıl diş kullanılacağını bilmek konusunda mükemmel değildir. (OpenMP veya gcc'ler -ftree-parallelize-loops
). İşbirliği arası iletişimin pahalı olması ve iş parçacığı başlangıcı için aynı zamanda, verimli bir şekilde paralel işlerin verimli bir şekilde yapılması için kodun yeniden çalışılması hala insanın akıllılığını gerektirir.
TLP, HW'nin yararlanabileceği tek bir yürütme iş parçacığı içindeki ince taneli ILP'den farklı olarak kaba taneli paralelliktir.
Etkileşimli iş yüklerini hedefleyen CPU'lar (Intel / AMD x86 ve Apple / ARM AArch64 high-end core'lar gibi) kesinlikle IPC ölçeklemesinin azalan getirilerine itiyor, çünkü sadece iş parçacığı için gecikme söz konusu olduğunda , tek iş parçacıklı performans hala çok değerli büyük ölçüde paralel problemler.
Bir oyunun 8 kopyasının 15 fps'de paralel olarak çalıştırılabilmesi, her birinin 45 fps'de bir kopyasını çalıştırabilmekten çok daha az değerlidir. İşlemci satıcıları bunu bilir ve bu nedenle modern işlemciler, önemli bir güç ve kalıp alanına mal olmasına rağmen, sıra dışı çalıştırmayı kullanır. (Ancak GPU'lar iş yükleri zaten büyük ölçüde paralel olduğu için değil).
Intel'in çok çekirdekli Xeon Phi donanımı (Knight's Landing / Knight's Mill) ilginç bir yarı yol noktasıdır: AVT512 SIMD talimatlarıyla beslenen 2 genişliğindeki çekirdeği sayıları azaltmak için beslemek için çok sınırlı sıra dışı uygulama ve SMT. Çekirdekler, Intel'in düşük güçlü Silvermont mimarisine dayanıyor. (Sıra dışı çalıştırma, ancak büyük çekirdekli Sandybridge ailesinden çok daha küçük olan küçük bir yeniden düzenleme penceresi ve daha dar bir boru hattıyla.)
Btw, tüm bu simd için diktir. Her bir talimat için daha fazla iş yapılması her zaman yardımcı olur, eğer probleminiz mümkün ise.
Fiyatlandırma modelleri
Yazılım fiyatlandırma modelleri, şu anki donanım ortamına dayanmaktadır.
Çekirdek başına lisans modelleri, çok çekirdekli işlemcilerin ortaya çıkmasıyla daha yaygınlaştı (ve tek soketli masaüstü bilgisayarlarla bile alakalı). Ondan önce, sadece sunucular ve büyük iş istasyonları ile ilgiliydi.
Yazılımın en yüksek hızda çalışması için birden fazla çekirdeğe ihtiyacı olmasaydı, onu daha fazla işlem yapamayan insanlara daha ucuza satmanın bir yolu olmazdı çünkü daha zayıf bir CPU'da çalıştırdılar. Belki de yazılım / donanım ekosistemi "SMT kanalları" üzerindeki kontrolleri geliştirmediyse, bu mantıksal çekirdekte çalışan kod için maksimum yürütme genişliğini konfigüre etmenize izin verir. (Yine, CPU'ların birden fazla ayrı çekirdek yerine boru hattı genişliğinde ölçeklendiği bir dünya hayal etmek.)