CPU mimarileri neden bayrak kaydı kullanıyor (avantajlar?)


15

Bazı CPU'larda bayrak kaydı (ARM, x86, ...) vardır, diğerleri yoktur (MIPS, ...). İşaret kaydını, taşmasını vb. Kontrol etmek için sıfır kaydı ve koşullu dallar kullanmak yerine, bayrak kaydını güncellemek için bir CMP talimatı ve ardından bir şube talimatı kullanmanın avantajı nedir?

Yanıtlar:


11

Kayıtları yeniden adlandıran modern mikro mimarilerde bayrakların ya da bayrakların uygulama maliyeti oldukça benzerdir. Düşünebileceğim temel fark, bazı bayrakların bir değerin özelliklerini göstermesidir (değer negatif mi? Sıfır değeri mi? Değerin çift mi yoksa tek parite mi var?) (ekleme talimatının yürütülmesi veya taşması oldu mu?) Bu , 32 bit mimaride 64 bit eklemeyi (veya 64-bit mimari.) Taşıma bayrağı olan çoğu mimaride özel biradd-with-carryönceki ekleme komutundan taşıma bayrağını içeren komut. Bu, bayrak kayıtları olan birçok mimaride çok duyarlıklı aritmetiği benzetmeyi nispeten ucuz hale getirir.

Kapak tarafında, bir N-bit yazmacının sıfır veya sıfır değil için test edilmesi aslında şaşırtıcı derecede pahalıdır. Bir N-bit kaydını sıfır olarak test etmek için, mantık seviyelerinin hesaplanmasını gerektiren bir N-bit NOR işlemi gerçekleştirmeniz gerekir . Bayraklı mimarilerde, ALU aşamasının sonunda sıfır / sıfır olmayan hesaplama için fazladan mantık, saatin daha yavaş çalışmasına neden olabilir (veya ALU'yu iki döngü işlemi yapmaya zorlayabilir.) Bu nedenle, bazılarının SPARC gibi mimarilerin her biri aritmetik işlemin iki sürümü vardı, biri bayrakları ayarlayan, diğeri yapmayan.Ö(günlükN-)

Ancak MIPS burada hiçbir şey kaydetmez. Sorunu başka bir yere taşıdılar. MIPS'de bir branch-on-equaltalimat var. Bu, dalın hangi yöne gittiğini belirlemeden önce dal komutunun aslında bir ALU aşamasına (bitsel xorişlem gibi bir şey ve ardından nortek eşit / eşit olmayan bite azaltmak için bir şey dahil) sahip olması gerektiği anlamına gelir .

DEC Alpha mimarisi, bir hile kullanarak farkı bölmeye çalıştı. DEC Alpha'nın bayrak kaydı yoktu, ama bir branch-on-equaltalimatı da yoktu . Bunun yerine, şube talimatları tek bir genel amaçlı kaydın durumuna bakar. Orada branch-on-zero, branch-on-not-zero, branch-on-less-than-zerovb hüner diğer 64 bit tamamı sıfır olup olmadığı her genel amaçlı söyler fazladan 65 bit kayıt verebilir olmasıdır. Bu, daha çok bir bayrak kaydına sahip olmak gibi yapar: tüm şube talimatları, kararlarını vermek için tek bir bite (zaten hesaplanmıştır) bakar, ancak şimdi normal bir ALU sırasında bu ekstra sıfır gösterge bitinin nasıl hesaplanacağını anlamaya geri döndünüz. döngü. (Ve sadece önceki işlemdeki taşıma bayrağına bakarak çok hassasiyetli aritmetik yapamazsınız.)


2
CC olmayan ayar işlemleri (anladığım kadarıyla) bir derleyici optimizasyonuydu ve derleyicinin CC ayar talimatlarını, değer son talimatlar tarafından engellenmeden erken planlamasına izin verdi. PowerPC750, durum kayıtlarını (8 4 bit kayıt) ön uçun yakınına yerleştirerek dal hedef talimatı önbelleğine çarpan ve koşulu yeterince erken elde etmek, alınan bir dalı ceza olmadan çözebilir . (AT & T'nin CRISP'i de erken şube kararından istifade etti.) CC'lerin az miktarda ve uzmanlaşması bunu daha pratik hale getiriyor.
Paul A. Clayton

Detay: Tüm bayrak hesaplamaları eşit değildir. CPU'nuzun geleneksel NZVC bayraklarına sahip olduğunu düşünün. Tüm ALU yönergelerinin bayrakları güncellemesine izin verilirse, toplayıcı / çıkarıcıdan ve birkaç mux'den sonra bayrak oluşturmayı yerleştirmelisiniz. Negatif bayrağı kolaydır, sadece MSB'dir, oysa Sıfır bayrağı pahalıdır ve her bite bağlıdır. Şimdi, bayrakları Karşılaştırma (ve bit testi) talimatlarıyla kısıtlarsanız, Sıfır bayrakları, çıkarma sonucunu beklemeden kaynak işlenenlerde paralel XOR'larla hesaplanabilir. Eklemeden sonra Z bayrağını hesaplamak neredeyse işe yaramaz.
TEMLIB

7

1 ISA perspektifinden

  1. Sadece bayrakları ayarlayan test talimatlarına sahip olmak, kayıt açlıktan geçmiş mimarilerde kayıt basıncını azaltmanın bir yoludur. Yeterli kaydınız varsa, bunlardan birini değiştirin ve sonucu yok sayın. Giriş değeri 0 olan bir kayıt 0'a sahip olmanın hilesi, bunlardan birini 0'a sabitlemenin, talimat sayısını arttırmaktan daha iyi olduğu yeterli kayıtlarınız olduğunda kullanışlı bir kodlama numarasıdır. Daha sonra onu bir hedef olarak kullanmak uygun olur (yanlış bağımlılıkların sayısını azaltır).

  2. Tekrar kodlama. Koşulu atlar halinde kodlarsanız, ikisi anında değer olmak istediğiniz 3 işlenenle (karşılaştırılacak ikisi ve atlama hedefi) atlarsınız. mümkün (atlamalar genellikle kendi kodlama formatına sahiptir, böylece hedef mümkün olduğunca çok bit kullanabilir). Veya olasılıkları düşürürsünüz.

  3. Bayrakları kullanmak, onları ayarlamanız için daha fazla fırsat sunar. Sadece bayrakları ayarlayabilen karşılaştırma işlemleri değil, ne istersen. (Hangi bayrak ayarladığınız daha fazla işlem olursa, bayrakları ayarlayan son işlemin istediğiniz işlem olduğundan emin olmak için daha dikkatli olmanız gerekir). Bayraklarınız varsa, koşulların (genellikle 16) bayrakları ayarlayabilen talimat sayısıyla çarpımını test edebilirsiniz (Bayrakları kullanmıyorsanız, sizin kadar çok koşullu atlama ile sonuçlanırsınız. test edeceğiniz şeyler var veya kolayca test etmenize izin vermeyen şeyler var (örneğin taşıyın veya taşıyın).

2 Bir uygulayıcı perspektifinden

  1. Bayrakları test etmek kolaydır ve hızlı bir şekilde yapılabilir. Testiniz ne kadar karmaşıksa, döngü süresi (veya boru hattınız varsa boru hattı yapısı) üzerinde o kadar fazla etki yapar. Bu, özellikle daha basit uygulamalar için geçerlidir, kitabın tüm numaralarını kullanarak üst düzey bir işlemciye ulaştığınızda, etki oldukça azdır.

  2. Bayraklara sahip olmak, birçok talimatın birden fazla sonuca sahip olduğu anlamına gelir (doğal sonuç ve değiştirilen bayrakların her biri). Ve bir mikro mimari POV'den, birden fazla sonuç kötüdür (ilişkilerini takip etmeniz gerekir). Sadece bir bayrak kümeniz varsa, bağımlılıkları tanıtan (bayrak daha sonra kullanılmazsa gereksiz) yol ya da başka bir şekilde işlemek zorundasınız. Yine bu daha basit uygulamalar için özellikle geçerlidir, kitabın tüm hilelerini kullanarak üst düzey bir işlemciye ulaştığınızda, ek zorluklar işlemcinin geri kalanı tarafından engellenir.


2

32 bitlik bir makinede, çok duyarlıklı bir ekleme dizisinin parçası olarak kullanılan "taşıma ile ekleme" komutunun 65 bitlik işlenenleri kabul etmesi ve 33 bitlik bir toplamı hesaplaması gerekir. Kaynak kayıt spesifikasyonları, 64 işlenen bitin nereden geleceğini belirleyecek ve hedef kayıt spesifikasyonu, sonucun en düşük 32 bitinin nereye gitmesi gerektiğini söyleyecektir, ancak "bir ekstra ekle" işlenen veya üst bit ile ne yapılacağı sonuç? Ek işlenenin nereden gelmesi gerektiği ve ekstra sonuç bitinin nereye gitmesi gerektiği yönergesinin bir parçası olarak belirtilmesine izin verilmesi, orta derecede yararlı olacaktır, ancak genellikle, koddaki fazladan bir alanı haklı çıkaracak kadar yararlı olmaz. Taşıma bayrağını işlemek için sabit bir "konuma" sahip olmak, bir talimat çizelgeleme perspektifinden biraz garip olabilir, ancak '

Biri çok duyarlıklı aritmetiğe izin verecek bir komut kümesi tasarlamaya çalışsa da, her komut iki 32 bit işlenen ve bir 32 bit hedef işlenenle sınırlıysa, dört komutta 64 bitlik bir "ekleme" uygulanabilir: "set r0 + r2 başka bir şekilde taşıyacaksa veya sıfırlayacaksa r5 ila 1; r4 = r1 + r3 hesapla; r5 = r4 + r5 hesapla; r4 = r0 + r2 hesapla ", ancak bunun ötesine geçmek her ek kelime için üç talimat gerektirir. Tamamlayıcı bir kaynak ve hedef olarak bir taşıma bayrağına sahip olmak maliyeti kelime başına bir talimata düşürür.

Btw, talimatın bayrak kaydını güncelleyip güncellemediğini kontrol etmek için bir talimat biti kontrolüne sahip olmanın, bayrak bitlerini kullanan veya değiştiren talimatların sıralarını birbirine göre tutması gerektiğinden, ancak bunların hiçbirini yapamayan talimatların serbestçe yeniden düzenlenmelidir. Sıra verildiğinde:

ldr  r0,[r1]
add  r0,r0,r2
eors r4,r5,r6

bir yürütme birimi, üçüncü komutun verilerin okunmasını beklemek zorunda kalmadan yürütülebileceğini oldukça kolay bir şekilde tanıyabilir [r1], ancak ikinci talimat olsaydı, ancak adds r0,r0,r2yürütme birimi bir şey kullanmaya çalıştığında bunu sağlayabilirse bayraklar, sıfır bayrak üçüncü talimatta belirlenen değeri tutacaktır, ancak taşıma bayrağı ikinci saniyede değeri tutacaktır.


1
"komut biti talimatın bayrak kaydını güncelleyip güncellemediğini kontrol eder": Örneğin PowerPC, SPARC'de bulunur.
TEMLIB

MIPS "r5 = r1 + r2; r6 r1'den küçükse r6'yı; r7 = r3 + r4; r5 = R5 + R6;" kullanır. Bazı SIMD uzantıları, taşıma işlemini uygulamak için taşıma ve çıkarma işlemini bulmak için tüm bitleri sıfır veya bir (yani, sıfır veya -1 ikişer tamamlayıcı tam sayı) olarak ayarlayan karşılaştırmaları kullanabilir.
Paul A. Clayton

@ PaulA.Clayton: Sanırım "r5 r1'den küçükse" demek istediniz. MIPS daha uzun matematiği nasıl ele alır? Kelime başına üç, üçten fazla mı yoksa üçten az mı talimat gerektirir?
supercat

@supercat Evet, "r5 r1'den küçükse r6'yı ayarla" olmalıydı!
Paul A. Clayton

@ PaulA.Clayton: 32 bitlik bir MIPS'e iki adet 64 kelimelik (2048 bit) sayı nasıl eklenir? Orta aşamaların içine ve dışına taşımak için etkili bir yol var mı?
supercat

0

Basit cevap ... talimatın kendisi dışında kesinlikle dahili veri yolu kullanımı gerektirmeyen hızlı ucuz bellek işlemi. Hafızası olmayan bir yığın veya işlem biti olmayan bir yığın bool olarak kullanılabilir.


1
Bu cevap ayrıntılara oldukça açık. Uzun cevaplar mutlaka gerekli değildir, ancak daha fazla ortaya çıkan bir şey belirgin bir gelişme olacaktır.
David Richerby

bir bayrak ayarlamak veya bir bayrak değerini karşılaştırmak, montaj koduna dahil edilecek argümanlar biçiminde başka bir bilgi içermeyen tek bir talimattır. bayraklar aynı zamanda işlemcinin çalıştırılması veya test edilmesinin bir sonucudur ve dallanmak için verimli bir şekilde kullanılabilir. kayıtlarda iki değer karşılaştırıldığında değiştirilen veya ayarlanan gerçek bittir.
SkipBerne
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.