Intel neden işlemcilerinde dahili RISC çekirdeğini saklar?


90

Pentium Pro'dan (P6 mikro mimarisi) başlayarak Intel, mikro işlemcilerini yeniden tasarladı ve eski CISC talimatları uyarınca dahili RISC çekirdeğini kullandı. Pentium Pro'dan beri, tüm CISC komutları daha küçük parçalara (uops) bölünür ve ardından RISC çekirdeği tarafından yürütülür.

Başlangıçta Intel’in yeni iç mimariyi gizlemeye ve programcıları "CISC kabuğu" kullanmaya zorlamaya karar verdiği açıktı. Bu karar sayesinde Intel, mikroişlemci mimarisini uyumluluğu bozmadan tamamen yeniden tasarlayabilir, makul.

Ancak bir şeyi anlamıyorum, Intel neden bu kadar uzun yıllar boyunca dahili bir RISC talimatlarını saklı tutuyor? Neden programcıların eski x86 CISC komut seti gibi RISC komutlarını kullanmalarına izin vermiyorlar?

Intel, geriye dönük uyumluluğu bu kadar uzun süre koruyorsa (64 bit modun yanında hala sanal 8086 moduna sahibiz), CISC talimatlarını atlayıp doğrudan RISC çekirdeğini kullanmaları için programları derlememize neden izin vermiyorlar? Bu, günümüzde kullanımdan kaldırılan x86 komut kümesini yavaşça terk etmenin doğal yolunu açacaktır (Intel'in RISC çekirdeğini içeride kullanmaya karar vermesinin ana nedeni budur, değil mi?)

Yeni Intel 'Core i' serisine baktığımda, sadece CISC komutlarını AVX, SSE4 ve diğerlerini ekleyerek genişlettiklerini görüyorum.


Yanıtlar:


93

Hayır, x86 komut seti kesinlikle kullanımdan kaldırılmadı. Her zamanki gibi popüler. Intel’in dahili olarak bir dizi RISC benzeri mikro talimat kullanmasının nedeni, bunların daha verimli bir şekilde işlenebilmesidir.

Bu nedenle, bir x86 CPU, ön uçta oldukça ağır bir kod çözücüye sahip olarak çalışır, bu da x86 talimatlarını kabul eder ve bunları arka ucun işleyebileceği optimize edilmiş bir dahili formata dönüştürür.

Bu formatı "harici" programlara maruz bırakmaya gelince, iki nokta vardır:

  • kararlı bir format değil. Intel, belirli mimariye en iyi uyacak şekilde CPU modelleri arasında değiştirebilir. Bu, verimliliği en üst düzeye çıkarmalarına olanak tanır ve dahili kullanımın yanı sıra harici kullanım için sabit, kararlı bir talimat formatına yerleşmeleri gerektiğinde bu avantaj kaybolur.
  • bunu yaparak kazanılacak hiçbir şey yok. Günümüzün devasa, karmaşık CPU'ları ile kod çözücü, CPU'nun nispeten küçük bir parçasıdır. X86 komutlarının kodunu çözmek, bunu daha karmaşık hale getirir, ancak CPU'nun geri kalanı etkilenmez, bu nedenle genel olarak, kazanılması gereken çok az şey vardır, özellikle de "eski" kodu yürütmek için x86 ön ucunun hala orada olması gerekeceği için . Böylece, şu anda x86 ön ucunda kullanılan transistörleri bile kaydetmezsiniz.

Bu tam olarak mükemmel bir düzenleme değil, ancak maliyeti oldukça düşük ve CPU'yu tamamen farklı iki komut setini destekleyecek şekilde tasarlamaktan çok daha iyi bir seçim . (Bu durumda, muhtemelen dahili kullanım için üçüncü bir mikro işlem seti icat edeceklerdi , çünkü bunlar CPU'nun dahili mimarisine en iyi şekilde uyacak şekilde serbestçe ayarlanabiliyordu)


1
Güzel nokta. RISC, İYİ'nin hızlı çalışır ve doğru bir şekilde uygulanmasının mümkün olduğu anlamına geldiği ve CISC mimari geçmişine sahip olan x86 ISA'nın yalnızca artık, muazzam bir geçmişe sahip bir komut seti düzeni ve kendisi için kullanılabilen muhteşem ikili yazılım zenginliği olduğu iyi bir çekirdek mimari depolama ve işleme için verimli olmanın yanı sıra. Bu bir CISC kabuğu değil, endüstri standardı ISA'dır.
Warren P

2
@Warren: Son kısımda, aslında öyle düşünmüyorum. Bir iyi tasarlanmış CISC komut kümesi evet, depolama açısından daha verimli, ama gördüğüm birkaç testlerden, "ortalama" x86 komut olan 4.3 gibi bir şey geniş bayt olduğunu daha tipik olurdu daha bir RISC mimarisi. x86, çok gelişigüzel bir şekilde tasarlandığı ve yıllar içinde genişletildiği için çok fazla depolama verimliliğini kaybeder. Ama sizin de söylediğiniz gibi, ana gücü geçmiş ve mevcut ikili kodun büyük miktarıdır.
jalf

1
Bunun "iyi tasarlanmış CISC" olduğunu söylemedim, sadece "büyük bir tarih". GOOD parçaları, RISC çip tasarım parçalarıdır.
Warren P

2
@jalf - Gerçek ikili dosyaları inceleyerek, x86'daki komut boyutu her biri ortalama olarak yaklaşık 3 bayttır. Elbette çok daha uzun talimatlar var, ancak daha küçük olanlar gerçek kullanımda baskın olma eğilimindedir.
srking

1
Ortalama komut uzunluğu, kod yoğunluğunun iyi bir ölçüsü değildir: tipik koddaki en yaygın x86 talimatı türü yükleme ve depolamadır (yalnızca verileri işlenebileceği yere ve belleğe geri taşımak, RISC işlemcileri ve CISC'nin yaklaşık ½ çok sayıda yazmaç bu yüzden bu kadar yapmaya gerek yok. Ayrıca bir komut ne kadar yapabilir (silah komutları yaklaşık 3 şey yapabilir).
ctrl-alt-delor

20

Gerçek cevap basit.

RISC işlemcilerinin uygulanmasının arkasındaki ana faktör, karmaşıklığı azaltmak ve hız kazanmaktı. RISC'nin dezavantajı, azaltılmış komut yoğunluğudur; bu, RISC benzeri formatta ifade edilen aynı kodun, eşdeğer CISC kodundan daha fazla talimat gerektirdiği anlamına gelir.

Bu yan etki, CPU'nuz bellek ile aynı hızda çalışıyorsa veya en azından ikisi de makul ölçüde benzer hızlarda çalışıyorsa, pek bir şey ifade etmez.

Şu anda CPU hızına kıyasla bellek hızı, saatlerde büyük bir fark göstermektedir. Mevcut CPU'lar bazen ana bellekten beş kat veya daha hızlıdır.

Teknolojinin bu durumu, CISC'nin sağladığı bir şey olan daha yoğun bir kodu destekliyor.

Önbelleklerin RISC CPU'ları hızlandırabileceğini iddia edebilirsiniz. Ancak aynı şey CISC cpus için de söylenebilir.

CISC ve önbellekleri kullanarak RISC ve önbelleklerden daha büyük bir hız iyileştirmesi elde edersiniz, çünkü aynı boyuttaki önbelleğin CISC'nin sağladığı yüksek yoğunluklu kod üzerinde daha fazla etkisi vardır.

Diğer bir yan etki, RISC'nin derleyici uygulamasında daha zor olmasıdır. Derleyicileri CISC cpus için optimize etmek daha kolaydır. vb.

Intel ne yaptıklarını biliyor.

Bu o kadar doğrudur ki, ARM'de Thumb adı verilen daha yüksek bir kod yoğunluğu modu vardır.


1
Ayrıca dahili bir RISC çekirdeği, bir CISC CPU'daki transistör sayısını azaltır. Her CISC talimatını sert kablolama yapmak yerine, bunları yürütmek için mikro kodu kullanabilirsiniz. Bu, farklı CISC talimatları için RISC mikro kod talimatlarının yeniden kullanılmasına ve dolayısıyla daha az kalıp alanı kullanılmasına yol açar.
Sil

16

Intel, geriye dönük uyumluluğu bu kadar uzun süre koruyorsa (64 bit modun yanında hala sanal 8086 moduna sahibiz), CISC talimatlarını atlayıp doğrudan RISC çekirdeğini kullanmaları için programları derlememize neden izin vermiyorlar? Bu, günümüzde kullanımdan kaldırılan x86 komut kümesini yavaşça terk etmenin doğal yolunu açacaktır (Intel'in RISC çekirdeğini içeride kullanmaya karar vermesinin ana nedeni budur, değil mi?)

Bunun iş açısına bakmanız gerekiyor. Intel aslında x86'dan uzaklaşmaya çalıştı, ancak şirket için altın yumurta bırakan kaz. XScale ve Itanium, temel x86 işlerinin sahip olduğu başarı düzeyine hiçbir zaman yaklaşamadı.

Temelde istediğiniz şey, Intel'in geliştiricilerin sıcak tüyleri karşılığında bileklerini kesmesi. X86'nın zarar görmesi onların çıkarına değil. Daha fazla geliştiricinin x86'yı hedeflemeyi seçmek zorunda kalmamasını sağlayan her şey, x86'yı zayıflatır. Bu da onlara zarar veriyor.


6
Evet, Intel bunu (Itanium) yapmaya çalıştığında, pazar sadece omuz silkerek yanıt verdi.
Warren P

Itanium başarısız olurken çeşitli faktörlerin olduğu unutulmamalıdır, sadece yeni bir mimari olduğu için değil. Örneğin, hedefine hiçbir zaman ulaşmamış bir derleyiciye CPU planlamasını boşaltmak. Itanium, x86 CPU'lardan 10x veya 100x daha hızlı olsaydı, sıcak kek gibi satılırdı. Ama daha hızlı değildi.
Katastic Voyage

5

Cevap basit. Intel, geliştiriciler için CPU geliştirmiyor ! Onları satın alma kararlarını veren insanlar için geliştiriyorlar ki bu BTW, dünyadaki her şirketin yaptığı şeydir!

Intel uzun zaman önce, CPU'larının geriye dönük uyumlu kalacağına dair (tabii ki mantık çerçevesinde) taahhütte bulundu. İnsanlar Intel tabanlı yeni bir bilgisayar satın aldıklarında , mevcut tüm yazılımlarının eski bilgisayarlarında olduğu gibi çalışacağını bilmek istiyor . (Yine de umarım daha hızlıdır!)

Dahası, Intel bu taahhüdün ne kadar önemli olduğunu tam olarak biliyor , çünkü bir zamanlar farklı bir yoldan gitmeye çalıştılar. Tam olarak kaç kişi yok sen Itanium işlemcili biliyor?!?

Hoşunuza gitmemiş olabilir, ancak Intel'i dünyanın en tanınmış ticari isimlerinden biri yapan şey, x86'da kalma kararı oldu!


2
Intel işlemcilerin geliştirici dostu olmadığı imasına katılmıyorum. PowerPC ve x86'yı uzun yıllar programladıktan sonra, CISC'nin çok daha programcı dostu olduğuna inandım. (Şu anda Intel için çalışıyorum, ancak işe alınmadan önce bu konuya karar verdim.)
Jeff Hammond

1
@Jeff Bu benim niyetim değildi! Soru şuydu, Intel neden geliştiricilerin kullanabilmesi için RISC komut setini açmadı. X86'nın geliştirici dostu olmadığı konusunda hiçbir şey söylemedim . Söylediğim şey, bunun gibi kararların geliştiriciler göz önünde bulundurularak kararlaştırılmadığını , daha ziyade kesinlikle iş kararları olduğuydu.
geo

5

@ jalf'ın cevabı nedenlerin çoğunu kapsıyor, ancak bahsetmediği ilginç bir ayrıntı var: Dahili RISC benzeri çekirdek, ARM / PPC / MIPS gibi bir komut setini çalıştırmak için tasarlanmamıştır. X86 vergisi yalnızca güce aç kod çözücülerde değil, bir dereceye kadar çekirdek genelinde ödenir. yani bu sadece x86 komut kodlaması değildir; tuhaf anlamlara sahip her talimat.

Intel'in, talimat akışının x86 dışında bir şey olduğu ve komutlarla doğrudan uops'la eşleştiği bir işletim modu oluşturduğunu varsayalım. Ayrıca, her bir CPU modelinin bu mod için kendi ISA'sına sahip olduğunu varsayalım, bu nedenle iç kısımları istedikleri zaman değiştirmekte özgürler ve bu alternatif formatın komut-kod çözme işlemi için minimum miktarda transistör ile bunları açığa çıkarıyorlar.

Muhtemelen yalnızca x86 mimari durumuna eşlenmiş aynı sayıda kayda sahip olursunuz, böylece x86 işletim sistemleri, CPU'ya özgü komut setini kullanmadan bağlam anahtarlarına kaydedebilir / geri yükleyebilir. Ancak bu pratik sınırlamayı atarsak, evet, birkaç tane daha yazmaçımız olabilir çünkü normalde mikrokod 1 için ayrılmış gizli geçici yazmaçları kullanabiliriz .


Daha sonraki ardışık düzen aşamalarında (yürütme birimleri) değişiklik yapmayan alternatif kod çözücülerimiz varsa, bu ISA'nın hala birçok x86 eksantrikliği olacaktır. Çok güzel bir RISC mimarisi olmazdı. Tek bir talimat çok karmaşık olmazdı, ancak x86'nın diğer çılgınlıklarının bir kısmı hala orada olacaktı.

Örneğin: sola / sağa kaymalar, vardiya sayısı bir olmadığı sürece Taşma bayrağını tanımsız bırakır, bu durumda OF = olağan işaretli taşma tespiti. Döndürmeler için benzer çılgınlık. Ancak, açığa çıkarılan RISC talimatları bayraksız vardiyalar vb. Sağlayabilir (genellikle bazı karmaşık x86 komutlarına giren birden çok uop'tan yalnızca bir veya ikisinin kullanımına izin verir). Yani bu aslında ana karşı argüman olarak geçerli değil.

Bir RISC ISA için tamamen yeni bir kod çözücü yapacaksanız, RISC talimatları olarak açığa çıkarılacak x86 komutlarının parçalarını seçip seçmesini sağlayabilirsiniz. Bu, çekirdeğin x86 uzmanlığını bir şekilde azaltır.


Tekli uop'lar çok fazla veri tutabileceğinden, komut kodlaması büyük olasılıkla sabit boyutlu olmayacaktır. Tüm insn'lerin aynı boyutta olması durumunda anlamlı olandan çok daha fazla veri. Tek bir mikro-kaynaştırılmış uop, 2 yazmaçlı ve 32bit yer değiştirmeli bir adresleme modu kullanan 32 bit anlık ve bir bellek işleneni ekleyebilir. (SnB ve sonrasında, yalnızca tek kayıt adresleme modları, ALU işlemleriyle mikro sigortalanabilir).

uop'lar çok büyüktür ve sabit genişlikli ARM komutlarına çok benzemez. Sabit genişlikte bir 32bit komut seti bir seferde yalnızca 16 bit anında yükleyebilir, bu nedenle 32 bitlik bir adresin yüklenmesi anında düşük-yarı / yük-anında-yük çifti gerektirir. x86'nın bunu yapması gerekmez, bu da, sabitleri yazmaçlarda tutma yeteneğini sınırlayan yalnızca 15 GP kaydı ile korkunç olmamasına yardımcı olur. (15, 7 kayıt üzerinde büyük bir yardımdır, ancak tekrar 31'e ikiye katlamak çok daha az yardımcı olur, sanırım bazı simülasyonlar bulunur. RSP genellikle genel amaçlı değildir, bu nedenle daha çok 15 GP kaydı ve bir yığın gibidir.)


TL; DR özeti:

Her neyse, bu cevap "x86 komut seti, x86 komutlarını hızlı bir şekilde çalıştırması gereken bir CPU'yu programlamanın muhtemelen en iyi yoludur" şeklinde özetlenebilir, ancak umarız bunun nedenlerine biraz ışık tutacaktır.


Ön uç ve arka uçtaki dahili uop biçimleri

Ön uç ve arka uç uop formatlarının Intel CPU'larda neyi temsil edebileceğine ilişkin bir farklılık durumu için Mikro füzyon ve adresleme modlarına da bakın .

Dipnot 1 : Mikrokod tarafından geçici olarak kullanılmak üzere bazı "gizli" kayıtlar vardır. Bu yazmaçlar, tıpkı x86 mimari kayıtları gibi yeniden adlandırılır, böylece çoklu-uop komutları sıra dışı çalışabilir.

Örneğin xchg eax, ecx, Intel CPU'larda 3 uops ( neden? ) olarak kod çözer ve en iyi tahminimiz bunların MOV benzeri uopslar olduğudur tmp = eax; ecx=eax ; eax=tmp;. Bu sırayla, çünkü dst-> src yönünün gecikmesini ~ 1 döngüde ölçüyorum, diğer yol için 2'ye karşılık. Ve bu hareketler normal movtalimatlar gibi değil ; sıfır gecikmeli hareket eliminasyonu için aday gibi görünmüyorlar.

PRF boyutunu deneysel olarak ölçmeye çalışmak ve gizli kayıtlar dahil mimari durumu tutmak için kullanılan fiziksel kayıtları hesaba katmak zorunda kalmaktan bahsedilmesi için http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ adresine de bakın .

Kod çözücülerden sonraki ön uçta, ancak kayıtları fiziksel kayıt dosyasına yeniden adlandıran düzenleme / yeniden adlandırma aşamasından önce, dahili uop formatı, x86 kayıt numaralarına benzer kayıt numaraları kullanır, ancak bu gizli kayıtları adreslemek için yer vardır.

Uop formatı, sıra dışı çekirdek (ROB ve RS) içinde biraz farklıdır, yani arka uç (yayınlama / yeniden adlandırma aşamasından sonra). İnt / FP fiziksel kayıt dosyalarının her birinin Haswell'de 168 girişi vardır , bu nedenle bir uop'taki her kayıt alanının bu kadarını ele alacak kadar geniş olması gerekir.

Yeniden adlandırıcı donanımda bulunduğundan, statik olarak programlanmış talimatları doğrudan arka uca beslemek yerine onu kullanmamız muhtemelen daha iyi olacaktır. Böylece, x86 mimari kayıtları + mikrokod geçici kayıtları kadar büyük bir kayıt kümesiyle çalışabilirdik, bundan daha fazlası değil.

Arka uç, WAW / WAR tehlikelerini önleyen bir ön uç yeniden adlandırıcıyla çalışmak üzere tasarlanmıştır, bu nedenle istesek bile sıralı bir CPU gibi kullanamazdık. Bu bağımlılıkları tespit etmek için kilitlere sahip değildir; sorun / yeniden adlandırma ile işlenir.

Sorun / yeniden adlandırma aşamasının (modern Intel ardışık düzenlerindeki en dar nokta, örneğin Skylake'de 4 genişliğe karşı 4 ALU + 2 yük + 1 mağaza bağlantı noktasında) darboğaz olmadan arka uca destek verebilirsek, düzgün olabilir. arka uç). Ancak bunu yaptıysanız, kaydı yeniden kullanmaktan kaçınmak için statik olarak kod programlayabileceğinizi ve bir önbellek kaçırma bir yükü uzun süre durdurduysa hala gerekli olan bir sonuca adım atacağınızı sanmıyorum.

Bu yüzden sorun / yeniden adlandırma aşamasına hemen hemen uop önbelleğini veya IDQ'yu değil, yalnızca kod çözmeyi atlayarak beslememiz gerekiyor. Sonra mantıklı tehlike tespiti ile normal OoO exec elde ederiz. Kayıt tahsis tablosu yalnızca 16 + birkaç tamsayı kaydını 168 girişli tamsayı PRF'ye yeniden adlandırmak için tasarlanmıştır. HW'nin daha büyük bir mantıksal yazmaç setini aynı sayıda fiziksel kayıt üzerine yeniden adlandırmasını bekleyemezdik; bu daha büyük bir RAT alır.


-3

CISC talimatlarını atlayıp doğrudan RISC çekirdeğini kullanmaları için programları derlememize neden izin vermiyorlar?

Önceki cevaplara ek olarak, bir başka neden de pazar bölümlemesidir. Bazı talimatların donanım yerine mikro kodda uygulandığı düşünülmektedir, bu nedenle herhangi birinin keyfi mikro işlemleri yürütmesine izin vermek, "yeni" daha performanslı CISC talimatlarıyla yeni cpus satışlarını baltalayabilir.


1
Bunun mantıklı olduğunu sanmıyorum. Bir RISC, özellikle bir x86 ön ucuna sadece RISC kod çözücüleri eklemekten bahsediyorsak, mikro kodu kullanabilir.
Peter Cordes

2
Bu hala yanlış. AES yeni talimatları (ve gelecek SHA talimatları) ve PCLMULQDQ gibi diğer şeyler özel donanıma sahiptir. Haswell'de, AESENC tek bir uop'a ( agner.org/optimize ) kod çözer , bu nedenle kesinlikle mikro kodlu değildir. ( Kod çözücüler, 4 uop'tan fazla kod çözen talimatlar için yalnızca mikro kod ROM sıralayıcıyı etkinleştirmelidir .)
Peter Cordes

1
Bazı yeni talimatların sadece mevcut işlevleri x86 talimatlarında bulunmayan bir şekilde kullandığı konusunda haklısınız. Buna iyi bir örnek BMI2 olurdu SHLX öyleyse, CL sayısını koymadan ve ekstra UOPs ödemeden değişken sayımı vardiyalı sayımı sıfırsa bayrakları değiştirilmemiş olan (berbat x86 bayrak semantiğini işlemek için gerekli do sağlar, SHL r/m32, clvardır FLAGS'a bir giriş bağımlılığı ve Skylake'de 3 uops'a kod çözme. Agner Fog'un testine göre Core2 / Nehalem'de sadece 1 uop idi.)
Peter Cordes

Yorumlarınız için teşekkür ederim.
KOLANICH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.