Çok sayıda kayda sahip olmamanızın birçok nedeni vardır:
- Çoğu boru hattı aşamasına oldukça bağlıdırlar. Yeni başlayanlar için yaşam sürelerini takip etmeniz ve sonuçları önceki aşamalara geri iletmeniz gerekir. Karmaşıklık çok hızlı bir şekilde çözülemez hale gelir ve dahil olan tellerin sayısı (kelimenin tam anlamıyla) aynı oranda artar. Alan açısından pahalıdır, bu da sonuçta belirli bir noktadan sonra güç, fiyat ve performans açısından pahalı olduğu anlamına gelir.
- Komut kodlama alanını kaplar. 16 yazmaç, kaynak ve hedef için 4 bit ve 3 işlenen talimatınız varsa 4 bit daha alır (örn. ARM). Bu, sadece kaydı belirtmek için kullanılan çok fazla komut seti kodlama alanı. Bu sonuçta kod çözmeyi, kod boyutunu ve yine karmaşıklığı etkiler.
- Aynı sonucu elde etmenin daha iyi yolları var ...
Bu günlerde gerçekten çok sayıda sicilimiz var - bunlar açıkça programlanmadı. "Register renaming" var. Yalnızca küçük bir kümeye (8-32 yazmaç) erişirken, aslında çok daha büyük bir kümeyle (örneğin 64-256) desteklenirler. CPU daha sonra her kaydın görünürlüğünü izler ve bunları yeniden adlandırılmış kümeye tahsis eder. Örneğin, arka arkaya birçok kez yükleyebilir, değiştirebilir, daha sonra bir kayıtta depolayabilir ve bu işlemlerin her birinin, önbellek eksikliklerine vb. Bağlı olarak bağımsız olarak gerçekleştirilmesini sağlayabilirsiniz. ARM'de:
ldr r0, [r4]
add r0, r0, #1
str r0, [r4]
ldr r0, [r5]
add r0, r0, #1
str r0, [r5]
Cortex A9 çekirdekleri kayıt adını değiştirir, bu nedenle "r0" a ilk yükleme aslında yeniden adlandırılmış bir sanal sicile gider - hadi "v0" diyelim. Yükleme, artış ve saklama "v0" üzerinde gerçekleşir. Bu arada, tekrar r0'a yükleme / değiştirme / kaydetme gerçekleştiririz, ancak bu, r0 kullanan tamamen bağımsız bir dizi olduğu için "v1" olarak yeniden adlandırılır. Diyelim ki "r4" deki işaretçiden gelen yük, bir önbellek kaybı nedeniyle durdu. Sorun değil - "r0" ın hazır olmasını beklememize gerek yok. Yeniden adlandırıldığı için, bir sonraki sekansı "v1" ile çalıştırabiliriz (ayrıca r0 ile eşleştirilmiştir) - ve belki de bu bir önbellek isabetidir ve biz çok büyük bir performans kazandık.
ldr v0, [v2]
add v0, v0, #1
str v0, [v2]
ldr v1, [v3]
add v1, v1, #1
str v1, [v3]
Bence x86, bu günlerde çok sayıda yeniden adlandırılmış yazmaç (ballpark 256). Bu, her talimat için sadece kaynak ve hedefin ne olduğunu söylemek için 8 bit çarpı 2 olması anlamına gelir. Çekirdekte ihtiyaç duyulan tel sayısını ve boyutunu büyük ölçüde artıracaktır. Bu nedenle, çoğu tasarımcının kararlaştırdığı 16-32 kayıt arasında tatlı bir nokta var ve sıra dışı CPU tasarımları için, kayıt yeniden adlandırma, bunu azaltmanın bir yolu.
Düzenleme : Arıza dışı yürütmenin ve bunun üzerinde kayıt yeniden adlandırmanın önemi. OOO'ya sahip olduğunuzda, yazmaçların sayısı çok da önemli değildir çünkü bunlar sadece "geçici etiketlerdir" ve çok daha büyük sanal kayıt kümesine yeniden adlandırılırlar. Numaranın çok küçük olmasını istemezsiniz çünkü küçük kod dizileri yazmak zorlaşır. Bu, x86-32 için bir sorundur, çünkü sınırlı 8 yazmaç, yığın üzerinden çok sayıda geçicinin geçtiği anlamına gelir ve çekirdek okuma / yazma işlemlerini belleğe iletmek için ekstra mantığa ihtiyaç duyar. OOO'niz yoksa, genellikle küçük bir çekirdekten bahsediyorsunuzdur, bu durumda büyük bir kayıt seti düşük bir maliyet / performans avantajıdır.
Bu nedenle, çoğu CPU sınıfı için yaklaşık 32 mimari kayıtta maksimuma çıkan kayıt bankası boyutu için doğal bir tatlı nokta var. x86-32'de 8 yazmaç var ve kesinlikle çok küçük. ARM 16 yazmaçla gitti ve bu iyi bir uzlaşma. 32 yazmaç, bir şey varsa, biraz fazla - son 10'a ya da daha fazlasına ihtiyacınız kalmaz.
Bunların hiçbiri, SSE ve diğer vektör kayan nokta yardımcı işlemcileri için aldığınız ekstra yazmaçlara değinmez. Bunlar ekstra bir set olarak mantıklıdır çünkü tamsayı çekirdekten bağımsız çalışırlar ve CPU'nun karmaşıklığını üssel olarak büyütmezler.