Mikroişlemcilerde neden daha fazla kayıt yok?


18

Kayıtlar teorik olarak gerekli değildir; tüm mikroişlemciler hala kayıt olmadan çalışırdı. Ancak bu görünüşte önemsiz eklenen mikroişlemcileri daha verimli hale getirmeye yardımcı oldu.

Neden bunlardan daha fazla yararlanabilmek için daha fazla kaydımız olamaz? Onlar sadece çip üzerinde hafıza ve bir eklemek çok zor değil düşünebilirsiniz? 10 kat daha fazla olan kayıt sayısını şu anki gibi değil de hangi faktör etkiledi?


8
@ Alper91 Varsayımsal ve gerçek olan pek çok mimarinin sicili yoktur ve hiç de gerekli değildir. Bu sadece kullanışlı bir optimizasyon.
boru

4
Hmm. Kimse Sparc'tan bahsetmedi. En büyük uygulama 520 kayıt olabilir (32 pencere kez 16 kayıt, + 8 küresel.) Eminim onları hatırlıyorum.
jonk

13
Kayıtta belirtmeniz gereken komuttaki bit sayısının büyük bir sorun olduğunu düşünüyorum. 1024 kaydınız varsa, her aritmetik komut için en az 30 bite ihtiyacınız vardır - "3 kaydının tümü aynı 32 grubundan olmalıdır (bu durumda 20 bite ihtiyacınız vardır)
user253751

8
@pipe - aslında hemen hemen her pratik tasarım şematik anlamda "kayıtlar" gerektirir, çünkü bir yığın makinesi veya bunun gibi bir şey inşa etseniz bile, ALU'ya veya çıktılara argümanları tutacak bir yere sahip olmanız gerekir. - çoğu belleğin üç erişim portu yoktur. Ve bir yığın makinesi ihtiyacı yığın işaretçisi olduğunu ... Bir kayıt! Ve boru hattı kayıtlarından bahsetmeyelim. Bu tür "kayıtların" kullanımını programcıdan gizleyebilirsiniz, ancak yine de biraz ihtiyacınız var ve muhtemelen neredeyse ilkel bir kayıt makinesinin sahip olduğu kadar.
Chris Stratton

4
@ChrisStratton Elbette, ancak ISA aracılığıyla maruz kalmadıkları sürece, bu sadece bir uygulama detayıdır. Yine de OP'nin kayıt yoluyla ne anlama geldiğini bilmediğimiz için anlamsız bir tartışma .
boru

Yanıtlar:


33

Birkaç faktör vardır:

  • yüksek performanslı mikro mimariler, kayıt yeniden adlandırma kullanır. Yani, fiziksel kayıtların sayısı mimari olarak görülebilir kayıtların sayısından daha fazladır ve bunların bağımsız kullanımlarını takip edebilirler.

  • kayıt sayısını iki katına çıkarmak performansı iki katına çıkarmaz. 16'dan 32 sicile kadar giden ISTR ( Bilgisayar mimarisinden, Nicel Bir Yaklaşım ), artışın olumsuz bir etkisi olmadığını varsayar (bu çok iyimser bir varsayımdır).

  • mimari olarak görülebilir kayıtların maliyeti vardır. Örneğin:

    • Sayılarını artırmak, hangi kaydın üzerinde işlem yapıldığını belirtmek için talimat biçiminde alınan bit sayısını artırır (kayıt sayısının iki katına çıkarılması, biçimdeki kayıt başına bir bit daha anlamına gelir, böylece bu bitlerin diğer kullanımlar veya zorlama için kullanılmasını önler daha uzun bir talimat boyutu).
    • Mimari kayıt sayısının artırılması, bağlam değiştirme maliyetini arttırır (bağlam anahtarında kaydedilmeleri ve geri yüklenmeleri gerektiği için).

1
Ben 16 ila 32 kayıt performans iyileştirme tamamen söz konusu derleyicinin optimizasyon potansiyeline bağlı bahis. Montajcıda, kayıt sayısının iki katına (x64 mimarisinde) erişime sahip olmak, performansı önemli ölçüde artırabilir - ancak yalnızca niş roller için ve yalnızca gerçekten kullanılıyorsa.
rdtsc

6
@rdtsc: 8'den 16'ya kadar mimari kayıtlardan geçilmesi , bu cevaba bağlı bir makaledeki simülasyonlardan elde edilen verilere göre , tipik kod için dökülme / yeniden yükleme miktarında büyük gelişmeler sağlar . Kod boyutunu, talimat sayısını ve düşük gecikmeli mağaza yönlendirmenin ne kadar önemli olduğunu etkiler. 16-> 32 çok daha küçük bir etkidir. AFAICT, 16 mimari kayıt, WAR ve WAW tehlikelerini ortadan kaldırmak için kayıt adını değiştiren donanımlar için iyi bir seçimdir.
Peter Cordes

2
Bununla birlikte, Intel'in AVX512 toplam 32 için 16 daha fazla vektör regs ekler. (Genişliklerini 64 bayta iki katına çıkarmanın yanı sıra, tam bir önbellek hattı). Gecikmeyi yüksek verim yüksek gecikmeli FP işlemlerinden gizlemek çok fazla kayıt gerektirebilir. ör. Intel Haswell'in 5c lat, her 0.5c verim FMA'sında bir tane vardır, bu nedenle FMA yürütme birimlerini bir azaltma için doyurmak için 10 vektör akümülatöre ihtiyacınız vardır (örneğin nokta ürünü veya FMA'nın döngüde taşınan bağımlılığın bir parçası olduğu bir dizi toplamak) ). x86-64'te sadece 16 vektör regs vardır. Ama unutmayın, tamsayı ops, esp. GP reg'lerinde nadiren 1c'den fazla gecikme vardır.
Peter Cordes

1
Değişim tam sayı, FP ve vektör kayıtları için farklıdır. Örneğin, tamsayı kayıtlarının tembel kaydetme / geri yükleme mantıklı değil, bir vektör için bunu yapmak çok daha iyi bir bahis. Ve vektör ISA'nın genellikle tamsayıdan daha fazla kaydı vardır (AltiVec en az 128'e kadar, ISTR Sparc için 256 bir tane okumuş, ancak şimdi bir referans bulamıyor).
AProgrammer

1
en.wikipedia.org/wiki/AltiVec , otuz iki 128b vektör regs değerine sahiptir. SPARC'ı merak ettim ve kayıt penceresi öğelerinin içerik anahtarları için nasıl çalıştığını araştırdım. Aynı anda 32 kayıt görünür, ancak daha büyük bir kayıt dosyasına sürgülü pencere kullanır. OS'nin kaydetmek / geri yüklemek için tüm sürgülü pencere kayıt dosyasının boyutunu bilmesi gerektiği gibi bu basitleştirilmiş sürümden geliyor , çünkü pencere slayt talimatları gerektiğinde regs kaydetmek / geri yüklemek için bellek sağlamasına rağmen, işletim sistemine.
Peter Cordes

16

Kayıtlar ve RAM'in ikisi de bellek olsa da, bunlara erişmenin maliyetini (yonga alanında veya gizli saat döngülerinde) yansıtmak için farklı şekillerde erişilir.

Kayıtlar ALU'ya sıkı sıkıya bağlıdır ve birçok veri kaynağı, lavabo, değiştirici vb. Rol alabilir. Bu nedenle çok sayıda geniş çoğullamalı bağlantıya ihtiyaç duyarlar. Bazı mimarilerde R1 <= R2 + R3 yazabiliriz ve tek bir saat döngüsünde olan tam olarak budur. Her kayıt doğrudan op kodunda ele alınır, bu adresleme çok sınırlı bir kaynaktır.

Kayıtların uygulanması pahalı olduğundan, sayı çoğu mimaride genellikle 10/20 ile sınırlıdır.

RAM, CPU'ya gevşek bir şekilde bağlanır, genellikle tek bir paylaşılan bağlantı yoluyla kanallanır. Bu, büyük miktarda RAM'in uygulanmasını çok daha ucuz hale getirir. RAM adresleri genellikle kaydedilmiş bir adresten gelir, bu nedenle önemli komut genişliği tüketmeyin.

SPARC, 72 ile 640 64 bit yazmaçlara sahip ilginç bir mimaridir ve 32 kayıt bağlamı ile parametre geçişli hızlı altyordam çağrıları için örtüşmelerle kaydırılabilir. Bunları, uygulamaların% 99,999'u gibi maliyetin önemli olduğu bilgisayarlarda ve sunucularda bulamıyorsunuz.


4
Başka bir özellik, bir bağlam anahtarı sırasında kayıtları kaydetmeniz / geri yüklemeniz gerektiğidir. Daha fazla kayıt, daha fazla zaman.
Michel Billaud

Eski TMS9900'ün tüm çalışma kayıtlarını harici bellekte tuttuğunu görüyorum en.wikipedia.org/wiki/Texas_Instruments_TMS9900
Peter Smith

1
'Değişmez' ile nitelikli (birkaç tweaks hariç) vardı ama basitleştirmek için çıkardı. Belki de sadece 'genel' olarak değiştireceğim. Temel olarak istisnaları bulabilir ve anlayabilirseniz, bunları belirtmeme gerek yoktur. Eğer yanıltmaya yetecek kadar insansın, o zaman önemli değil, çünkü seni belaya sokmaz. TMS9900, bu garipti, daha önceki bir yaşamda günahlarım için 99/4'üm vardı, garip canavar!
Neil_UK

Itanium ayrıca kayıt pencerelerine sahiptir.
Simon Richter

1
@ChrisStratton: "ABI" nin bir parçası olarak kabul edilen "X ve Y kayıtlarını kullanamazsınız" için bir emsal olsa da (örneğin, mips üzerindeki k0 ve k1 kayıtları) olağandışı kullanımdır. Kesinlikle bu "ABI yasaklı kayıtların" kaydedilmesi / geri yüklenmesi bağlam anahtarında gerçekleştirilmezse, işlemler arasında istenmeyen / güvensiz gizli mesajlaşma kanalları vardır. Yani, iletişim kuramaması gereken süreçler, bilgileri yasak kayıtlarda saklayarak ve bağlam anahtarlarını bekleyerek bunu yapabilir.
R ..

12

Kayıtlar talimat dahilinde adreslenmelidir. Çok fazla kayıt varsa, talimat daha uzundur. Bir kesme hizmeti için kayıt içeriğini kaydetmek ve geri yüklemek çok fazla kayıt varsa daha fazla zaman gerektirir.


5

Çoğu şey gibi, kayıt sayısı maliyet, karmaşıklık ve kullanışlılık arasında bir uzlaşmadır.

Kayıtlar, diğer depolama seçeneklerinden daha maliyetli (çip alanı) yapan çok bağlantı noktalı statik RAM olarak uygulanır.

Daha sonra işlemcinin talimat seti ile birleştirilirler, kayıt sayısını arttırmak talimat setinin karmaşıklığını arttırır. Bu nedenle, talimat setiyle uyumlu kalmak istiyorsanız, verimliliği artırmak için yeni nesil işlemcilerde mevcut kayıt sayısını artıramazsınız, programlar bunları kullanmaz.

Şimdi ne kadar sicile ihtiyacınız var? Yararlılıklarının bir sınırı vardır. 1024 baytta bazı matematiksel işlemler gerçekleştiren bir algoritma yazdığınızı varsayalım, diyelim ki 5 ile çarpalım.

load operand1=5
load address
loop: load operand2=byte1@address
multiply Register1 with Register2
store result
increment address
if address = end goto endLoop
jump loop
endLoop:

Şimdi 1024 kaydınız varsa ve orada depolanmış tüm veriler varsa, programınız şöyle görünür:

multiply Register1 with Register2
multiply Register1 with Register3
multiply Register1 with Register4
multiply Register1 with Register5
multiply Register1 with Register6
...

Her biri farklı bir talimat olduğundan, her birinin yazılması gerekir. Yani gerekli program hafızanız patlıyor. Bunu gerçekleştirdikten sonra, aşağıdaki gibi bazı talimatları tanıtmak isteyebilirsiniz,multiply register1 with register(2 to 256) . Ancak ne zaman durursunuz, tüm kombinasyonlar için talimat verir misiniz?

Belki de şu anda elimizdeki rakamlar maliyet, karmaşıklık ve kullanışlılık arasında ince bir değiş tokuştur.


1
multiply Register1 with Register2 multiply Register1 with Register3Verilerin doğrudan veya dolaylı olarak bilgisayarın dışından gelmesi gerektiği için programın çok gerçekçi olmadığını düşünüyorum , bu nedenle kayıtların yüklenmesi ve sonuçların doğrudan veya dolaylı bir yerde kullanılması gerekir, bu nedenle kayıtların saklanması gerekir. Gerçekte, yüksek seviyeli bir dil için iyi bir optimize edici derleyici, ikinci program gibi bir şey oluşturmak için ilk programın döngüsünü 'açar', kayıt kullanımını, bellek gecikmesini, belki de önbellek doluluk oranını ve yürütme hızını optimize eder.
gbulmer

1
Birçok özel amaçlı multiply register1 with register(2 to 256)talimata gerek yoktur . Pipelining, özellikle daha kolay kod çözme ve talimat yürütme için CPU verimini önemli ölçüde artırır. Böylece, karmaşık, çok çeşitli talimatların etkisi, daha yüksek yürütme oranına sahip birkaç basit talimat kullanılarak elde edilebilir. Çok sayıda kayıt sahibi olmak, derleyicinin bağımsız olarak tamamlanabilen, verimi artıran birçok bağımsız talimat (bir kaydı paylaşmayanlar) oluşturmasına izin vererek yardımcı olur. Örneğin = daha fazla kayıt daha iyidir.
gbulmer

4

Kayıtlar çok pahalıdır. Çok pahalı. Kayıtların kendisi o kadar da değil, kayıtlardan ve kayıtlara tüm bağlantılar. Diyelim ki reg1 = reg2 + reg3 talimatınız var. Bunu hızlı uygulamak için için, bir döngüde iki kayıttan veri okumalı ve ikinci döngüde başka bir kayıt defterine yazmalısınız. Şimdi, döngü başına birden fazla talimat çalıştırabilen bir işlemciniz varsa, üç talimat söyleyin, her döngüde altı kayıttan veri okuyabilmeniz ve 3 kayıta veri yazabilmeniz gerekir. Bu çok hızlı, çok korkunç bağlantılar.

Tabii ki daha fazla transistör kullanabilirsiniz. Sorun şudur: Hız azalır. Daha fazla kayıt arasından seçim yapmak için daha fazla donanıma ihtiyacınız var. Kayıt dosyasının alanı artar. Tüm bunlar işleri yavaşlatır. Aynı teknolojiyle 16 kayıt sahibi olabilirsiniz ve 2,600 MHz'de çalışabilir ya da 32 kayıt sahibi olabilirsiniz ve 2,400 MHz'de çalışabilirsiniz. Şimdi ek kayıtlar saat hızında önemli bir düşüşü telafi etmelidir.


2

Kayıt sayısını hangi faktör etkiledi?

- Bellek Hiyerarşisi

Yazmaçlar, Önbellek, RAM farklı depolama teknolojileri ile uygulanır.

Farklı teknolojiler

  1. Erişim süreleri
  2. Maliyet
  3. Yoğunluk

Örnek: CPU'da bulunan dahili kayıtlar Statik Rasgele Erişim Belleği iken, bilgisayarın ana belleği Dinamik Rasgele Erişim Belleğidir.

6-transistör devresi kullanılarak bir Statik RAM ikili hücresi uygulanırken, bir kapasitör ve bir transistör kullanılarak bir Dinamik RAM ikili hücresi uygulanır. SRAM ve DRAM karşılaştırması

  • SRAM belleği, DRAM belleğinden çok daha hızlı [SRAM'a erişmek için DRAM'a kıyasla birkaç döngü]
  • SRAM devresi DRAM'den daha az güç tüketir
  • DRAM, SRAM'den farklı olarak periyodik olarak bellekteki her bitin yenilenmesini gerektirir
  • SRAM'ın maliyeti DRAM'den daha fazla
  • SRAM, DRAM'a kıyasla daha düşük bir yoğunluğa sahiptir

Bu yüzden hızlı, pahalı, daha az yoğunluklu belleğin sayısını artırmak pratik bir şey değil. Aslında bunlardan birkaçını kullanabiliriz ve iyi yazılmış bir program en sık kullanılan verileri bu hızlı kayıtların içinde saklarken, daha az kullanılan veriler daha yavaş bellekte saklanır.

- Talimat uzunluğu

Kayıtların adresi, adresi temsil edebilecek bit sayısına göre erişilebilir kayıtların sayısını sınırlayan bir talimatta yer almaktadır. Örneğin MIPS mimarisinde 32 bit uzunluk komutu, kayıt sayısını 2 5 = 32 kayıt ile sınırlayan erişilebilir kayıtların adresini temsil etmek için sadece 5 bit tutar . Kayıtların sayısının arttırılması, tüm kayıtlara erişebilecek yeterli bitleri dahil etmek için komut uzunluğunun arttırılmasını gerektirecektir.


2

Bir işlemcinin talimat setine bir göz attıysanız, bunları gruplamanın birkaç yolu vardır. Örneğin, tüm ADDtalimatlar ve tüm XORtalimatlar birlikte gruplandırılabilir .

Aynı komutun her bir grubunda, bellekte veya kayıtlarda çalışan sürümler olabilir. İşlemcinin sahip olduğu kayıt sayısını etkili bir şekilde tanımlayan bu alt gruplamadır.

8-bitlik bir varsayımsal bir örnek olarak, let Diyelim $Axtalimatları olabilir ADDtalimatları ve $Cxolabilecek XORtalimatlar. Bu tasarımla, işlenenleri tanımlamak için sadece dört bit kaldı!

  • Birinin sadece dört genel amaçlı kaydı olabilir ve birini tanımlamak için iki bit, diğerini tanımlamak için iki bit kullanabilir.
  • Ya da, biri "özel" varyantları ayırt etmek için ilk biti ve diğer 3 biti, akümülatörle çalışacak sekiz kayıttan hangisinin ( $x0akümülatörün kendisi olabileceğini) tanımlamak için kullanılabilir .
  • Veya bu sayıdan daha fazla kayıt olabilir - ancak hangi kayıtların hangi talimatlar için erişilebilir olduğunu sınırlar.

Tabii ki, 8 bitlik komut setlerini geçtik. Ama yine de, bu mantık geçmişte kayıt kümelerini tanımlamaya yardımcı oldu - bunu gelecekte yapmaya devam edecektir.

DÜZENLE (istendiği gibi)

Dört bit talimat içindir top Say: ADD, SUB, XOR, MOV, CMPvb burada 16 olasılık vardır. Sonra, kayıt-to-kayıt olanlar talimatlar için (örneğin mantıklı ADD Rx,Ry, belirtmek gerekir) Rxve Ry. Diyelim ki sonraki iki bit xve son iki bit içindir y. Böylece:

ADD R1, R2  =>  'ADD' + 'R1' + 'R2' => $A0 + $04 + $02

Böyle bir kaydı tanımlamak için yalnızca iki bit ile, toplam dört kayıt için sadece yeriniz var!

Bir kenara, bazı kayıt kombinasyonlarının bir anlamı olmadığını unutmayın. Örneğin, MOV Rx, Rx(hiçbir şey yapmaz) ve SUB Rx, Rx(daima üretir 0). Bunlar özel durum talimatları haline gelebilir:

  1. SUB Rx, Rxolabilir NOT Rx- tek işlenen bir talimat.
  2. MOV Rx, RxMOVikinci bir baytı anında değer olarak alan bir komut haline gelebilir MOV Rx, #$yy.

Bu şekilde, programcı için daha büyük bir talimat seti sağlamak için, aksi takdirde işe yaramaz veya saçma talimatlar için delikleri doldurarak talimat haritası ile "oynayabilirsiniz". Ancak sonuçta, komut kümesi yazmaç kümesini tanımlar.


Hala kafam karıştı, işlenenler için nasıl sadece 4 bit kaldığını açıklayabilir misiniz?
Darshan Chaudhary

Güncel cevabımı kontrol et
John Burger

1
IMHO bu cevabı, " varsayımsal örnek 8 bitlik bir komut setini varsaydığı " nı sorunun başlangıcına taşıyarak önemli ölçüde geliştirilecektir . Bunu anlamaya çalışarak zaman harcadım, sadece 8 bitlik, sabit uzunluklu bir talimat için mantıklı olduğu sonucuna vardım, sonra durumun bu olduğunu bulmak için okumaya devam ettim. IMHO, bu tür bir talimat seti, soru bağlamında çok alakasız değildir; tüm adres alanı sıkıca bağlanmış statik RAM olabilir. Ayrıca, " Bazı yazmaç kombinasyonları anlamsız ... " başlangıcının soruyla ilgili olmadığını ve silinebileceğini düşünüyorum. Benim 0.02 $
gbulmer

-2

Intel bugünlerde CPU çekirdeği başına yüzlerce kayıt kullanıyor. Ancak bir CPU'da depolanan en büyük veri önbellektir, bu da dolaylı olarak soruyu cevaplar. Önbellek, küçük bir hızlı L1 önbelleği ve daha yavaş L2 ve L3 önbellekleri ile katmanlar halinde düzenlenir. Bir anlamda kayıt dosyası L0, L1'den bile daha hızlı, hatta daha da küçük. Yani, kayıt sayısını artırabilirsiniz, ancak bu muhtemelen onları yavaşlatacaktır.

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.