Giriş: Modern Compilers üzerinde CISC'nin Enduring Influence of CISC on Modern Compilers

işlemci mimarisi ve yazılım optimizasyonu arasındaki ilişki, küçük bir hızlı, basit talimatlar arasında, CISC işlemcileri paket zengin, çoklu adım işlemleridir - kopya, polinom değerlendirme veya hafıza-to-memory arithmetic - tek makine talimatlarına dayanan bir tasarım felsefesidir.Bu karmaşıklık doğrudan, basit talimatlar, CISC işlemciler paket zengin, çok adımlı işlemler - kopyalar, polinom değerlendirme veya hafıza-to-memory anrithmeticisinin aksine - tek makine talimatlarına dayanır.

Bu makale, CISC tasarımının derleme stratejileri üzerinde derin etkisini araştırıyor.Eğitim seçimi, kod yoğunluğu, makro işbirliği füzyonu, değişken öğretim uzunluğu altında kayıt paylaşımı ve CISC'nin mikro-op dekompozisyonu ile ilgili modern zorluklar inceleyeceğiz. Gerçek dünya mimarisine göre, CISC'nin doğal karmaşıklığına nasıl benzediğini göstereceğiz.

CISC Kısa Tarihi: Mainframes to x86

CISC'nin kökleri 1960'lara ve 1970'lere geri döndü, hafıza pahalı ve işlemciler yavaştı. Verilen bir program için gerekli talimatları azaltmak için, mimarlar her talimata daha fazla işlevsellik topladılar. IBM'in Sistem/360, 1964 yılında tanıtıldı, Dijital Ekipman Şirketi VAX mimarisine sahip bir dizi tasarım, 300X üzerinde karmaşık bir şekilde hizmet veren bir veri ve yüksek seviyeli operasyonlara sahip olan birçok işletim sistemi ve üst düzey operasyon.

En kalıcı CISC ailesi x86 mimarisidir, 1978'de Intel 8086'dan başlayarak ortaya çıkıyor. x86'nın talimatı, MMX, SSE ve AVX gibi uzantıları genişleterek, uzun süre (1 ila 15 arasında) çok sayıda farklı yazılım üssünü (Intel Core, x86) kullanarak daha basit talimatların daha yüksek bir saat hız ve daha kolay boru hatlarına sahip olabileceğini kanıtladılar -CISC geri yükleme ve masaüstü ve sunucu piyasalarında baskın kalmıştır.

Compiler Optimizasyon Stratejileri CISC tarafından Etkilendi

Bir CISC talimatı setinin zenginliği, hem fırsatları hem de riskleri derleyiciler için yaratır. Aşağıda CISC tasarımının optimizasyon kararları nereye yönlendirdiğini inceleyeceğiz.

Öğretim Seçimi: Güç ve Maliyet

Bir RISC sisteminde, öğretim seçimi nispeten basit: derlemek için yüksek seviyeli işlemler küçük bir set basit talimatlara göre, optimize edilen dizilere güvenmek (çok yararlı olan ek, mağaza) bir CISC derleyicisi, her biri farklı uzunlukta, geç kalmış bir eğitimden, ve kaynak kullanımı ile seçim yapmak zorunda. Örneğin, bir RISC derleyicisi üç talimatları (çok fazla şekilde, ekinler) oluşturmak için kayıt yaptırabilir.

Modern derleyiciler (GCC, LLVM) belirli bir IR modeli için en iyi talimat sırasını seçen yüzlerce desen kullanır. Örneğin, bir döngü hafıza yüklerini ve ekini içeren bir dizi ayarlandığında, derleyici talimat alma modundan (örneğin, x86'nın 03.03.) bir adres hesaplama ve hafızayı kullanarak en iyi talimat sırasını seçmesi gerekir.

Kod Yoğunluğu ve Cache Utilization

CISC'nin tarihi avantajları kod yoğunluğudır. Çünkü tek bir CISC talimat birden fazla RISC talimatları yerine geçebilir, sonuçlanan ikili genellikle daha küçük olabilir. Örneğin, bir CISCASIFLT:4, 32 bit dengeleme kullanarak yüklemenin yalnızca 5-7 numaralı bir adrese kadar önemli olduğunu talimat verir, ancak kayıt altına alınıp kayıt altına alın.

Compilers, kod yoğunluğunu gibi teknikler aracılığıyla kullanır:

  • [FONT:0)Instruction kısa sürede:[DDDD:0) Komplikeli, en küçük kodlamayı seçer (örneğin, LLVMT:5 kullanarak, 8 bit değerindeki değeri hemen yerine 32-bit'lik bir hızla azaltır. Modern değişken uzunlukta CISC kodlamaları (x86-64) ortak talimatlar için 2bay formuna izin verir. GCC ve LLVM performans sıralaması bu talimatları düzeltmeye çalışır.
  • [FONT=0]Stack vs. kayıt dağılımı:[Dönemli CISC kodu, derleyiciler bazen kompakt it/pop talimatları kullanarak yığına kayıt yaptırır () /[FLT: 8 ) x86'da sadece 1'i kayıt altına almak yerine, 3-4'ü kayıt altına alan kayıt-memory hareketi ile yapılır.
  • [FONT:0]Sting kompleksi adresleme modları:[Dönetici:[Dönetici: 0,8|)) Bir diziden yük çıkarmak için tek bir talimat verir.Konuşmanın daha uzun kodlama (ya da 7'ye kadar) ayarlandığında dengeyi ortadan kaldırır.

Ancak, artan kod yoğunluğu her zaman performans geliştirmez. Uzun talimatlar, daha küçük kodların en faydalı olduğu sıcak yolları tanımlamak için daha uzun sürebilir.

Macro-Operation Fusion ve Micro-Op Decomposition

Modern CISC işlemcileri (k86'dan Pentium M'dan daha fazla) iç içe karmaşık talimatları basit mikro-işlemlere (μops) bu haritayı uygulama hattına kadar sürdürmesine izin verir. Örneğin, x86FLT:11) tek bir CISC talimat, üç ayrı işlem olarak yürütme motoruna ortaya çıkabilir.

Bu mikro-arşizm için ipuçları dikkate alınmalıdır. İki temel strateji ortaya çıktı:

  • [FONT=0)Macro-füzyon:[Dönetici:[Dönetici:[Dönetici:0)[0][BİLMİŞ-TRNT:0)[FONT=FONT=0)))[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FO
  • [FONT=0)Mikro-op caching:[Dönetici:[Dönetici:0)Mikro-opuyucu:[Dönetici: 0 ) Bu, işlemcilerin şifreli çizgi büyüklüğüne uygun kod üretirler (örneğin 4-6 μops). Ayrıca, bu, işlemcinin decode hattının derin bilgi gerektiren düşük bir optimizasyon seviyesidir.

İlginçtir, mikroop dekompozisyon bazen RISC-like daha basit talimatları CISC eşdeğerlerinden daha hızlı yapar. Örneğin, μop sayılarını, latency ve port kullanımını en iyi sırayı seçmek için kullanabilir. LLVM'nin dosyaları, belirli Intel veya AMD çekirdeklerini yansıtan üç μop yuvalarını yansıtan bir dosyayı bile tanımlar.

Kayıt Allocation ve Değişken Öğretim Uzunlukları

Kayıt paylaşımı CISC tarafından karmaşıktır, çünkü birçok talimat doğrudan hafızaya erişebilir, daha az eleştirel kayıt yaptırabilir - ancak ayrıca ticarete giriş yapın.18. (Bir ModRM'nin sık kullanılan değişkenleri için bir kayıt olduğunda, hafıza operasyonlarından kaçınabilir, ancak sonuç kaydı talimatları genellikle aynıdır) RISC talimatları her zaman aynı uzunlukta aynıdır (örneğin, 4)

CISC derleyicileri, daha uzun öğretim kodlamalarını kullanarak kayıt altına almak için bir değer tutmanın faydasını tartmalıdır. Sık sık çift derinliği ve işlevi büyüklüğüne dayanan sezgiselleri kullanabilirler. Örneğin, sıcak bir döngüde, derleyicinin çoğu performansa duyarlı olduğunu tespit ederek bu kararı bildirecektir.

Başka bir meydan okuma x86'da sınırlı sayıda genel amaçlı kayıttır: sadece 32-bit modunda 8 (EAX, EBX, ECX, ESI, EDI, EBP, ESP) ve 64-bit modundaki grafiklere özel kısıtlamalar ile derleyiciler (örneğin, ECISC talimatlarının eklenmedik kayıt kullanımı) “Campiyonları kullanarak kayıt altına almaması gerekir.

CISC Kompleksi tarafından sorgulanan meydan okumalar

CISC birçok optimizasyon fırsatı sunarken, aynı zamanda derleyici yazarlar için önemli engeller de sunar.

Öğretim Planlama ve Değişken Latency

RISC mimarisinde, çoğu talimat tahmin edilebilir, üniforma geçliği (teger bölümü) en basit ALU ops için bir döngü oluşturabilir. Örneğin, basit bir şekilde yüksek çözünürlükte sabitleme süresine kadar.Bu, yüksek çözünürlükte, yüksek çözünürlükte bulunan talimatların (örneğin, yüksek çözünürlükte) ve ayarlamalara bağlı olarak, yüksek çözünürlükte bulunan talimatların tamamının şifresini de genişletebilir.

Peephole Optimizasyonunun Kompleksi

CISC'nin zengin öğretim seti, bayrakların başka bir yerde kullanılmadığını ve kayıt basıncının iki katına çıktığını iddia ediyor. Örneğin, bir dizi farklı bir noktaya sahip olan bir başka konuyla veya bir araya gelene kadar erişimli olabilir. Compilers, böyle bir peeles analizi gerçekleştirmek için kesin bir analiz yapmalıdır.Bu dönüşüm, iki talimatları da güvenli olmalıdır: hafıza yeri başka bir konuya veya başka bir konuya erişim sağlayabilir.

Modern LLVM ve GCC, hedefe özel geri dönüş sırasında çalışan geniş peephole sahiptir. Örneğin, LLVM'nin 03: 11:4'ü takip eden bazı düşük seviyeli kalıpları daha verimli CISC talimatlarına sahip olarak genişletir ve bu geçiş, daha sonra öğretim zamanlaması gibi dikkatli bir şekilde devam etmelidir.

Güç ve Termal Tahminler

Komplikeli bir problem olmasa da, güç tüketimi giderek önemlidir. CISC talimatları birden fazla infaz birimine bağlı olarak (örneğin, [[GÖRT:27) bu, optimizasyon hattında yapılan kararın yüksek dinamik güç artışlarına neden olabilir. X86 işlemcileri (örneğin Intel Atom gibi) bazen bu tür güçlendirici talimatlarını kullanarak, kod boyutunu artırırsa bile, modern geliştiricilerin kullanımını hızlandırabilir.

Fırsatlar: Performans için CISC'yi Çıkarmak

Karmaşıklığa rağmen, CISC'nin zengin öğretim seti RISC'nin sık sık maçamayacağı eşsiz optimizasyon fırsatları sunuyor.

Kriptografik ve Media Workloads için özelleştirilmiş talimatlar

X86 gibi CISC aileleri, çok sayıda özel talimata sahip oldu. Örnekler şunları içerir:

  • [FONT:0]AES-NI:[[Dönem: {0][Dönemli) ve ilgili talimatlar Gelişmiş Şifreleme Standart işlemleri hızlandırıyor. Compilers, AES yuvarlakları gerçekleştiren ve bunları tek talimatlarla yerine getirebilen, yazılım uygulamaları üzerinde 10-20x hıza sahip olabilecek faktörleri tanıyabilir [Intel AES-NI Optimizasyon Kılavuzu].
  • [FONT:0]SHA uzantıları:[Dönetici:[Dönetici: 9) ve diğerleri hızlanan algoritmaların hızlanması.
  • [FONT=0]AVX-512: [Dönetici] F used-add, saç / toplayıcı ve çatışma algılaması HPC ve vektörel kodu dramatik bir şekilde hızlandırabilir. Compilers bu talimatları üretmek için otomatik olarak, genellikle CPU desteği için zaman kontrolleri ile geçer.
  • [FONT:0)BMI/BMI2:[Dönetici:[Dönetici:0)[FONTT:0)) Belirli bir miktar-taban işlemlerinin uygulanmasına izin vermek. Veri tabanı ve ağ kodu için ipuçları otomatik olarak bu talimatları yerine getirebilir.

Buları kullanmak için, derleyiciler hedef CPU'nun özelliklerini bilmelidir. LLVM ve GCC CPUID kontrollerini kullanıyor ve hedef bazlı bir özellikte bir notasyon (örneğin, 03.Bölümler ayarlarında, derleyici birden fazla kod yol üretebilir ve çok yönlülüğü seçebilirsiniz.

Miraç Kodu Uyumluluk ve İkili Yeniden Yazma

CISC'nin geri uyumluluk hem bir lütuf hem de bir lanet. Kompiyonel optimizasyonlar için, eski derleyicilerden gelen nesne kodu bazen ikili yeniden yazma araçları (örneğin, Intel'in PIN aracı veya otomatik optimize edicileri) kullanarak yeniden geliştirilebilir, bu araçlar son derece kolay bir şekilde optimize edemezler çünkü sabitleme ve düzeltmeler elde ederler.Örneğin, BOLT, eğitim performansını artırmak için temel blokları yeniden sipariş edebilir veya yeni bir CISC talimatlarının bir sırasını yerine getirebilir.

Sonuç: CISC'nin Compiler Development'daki rolünün

CISC tasarımının derleyici optimizasyon stratejileri üzerindeki etkisi derin ve çok yönlüdür. Öğretim seçimi ve kod yoğunluğundan mikro-opfüzyona kadar, CISC'nin karmaşık analizleri ve maliyet modellerini kullanmaya adapte olmak gerekir. Modern x86 işlemcileri, CISC mirasına rağmen, iki paradigma arasındaki hattı bulanıklaştırma ve koruma gibi, RISC destekli teknikleri kabul etti.

İleriye bakıldığında, CISC muhtemelen x86 ekosistemi ile ilgili kalacaktır, çünkü ARM (a RISC tasarımı) sunucularda ve dizüstü bilgisayarlarda yer alan kazanımlar elde edilir. Bu, derleyici yazarların çoklu geri dönüş hedefleri sürdürmesi anlamına gelir, her biri kendi ticaret seti ile. Geliştiriciler için, CISC formlarının nasıl birleştirilmesinin sadece donanımda değil, örneğin, uzman talimatlar veya yazılı döngüler için geliştirilmiş olan sofistike algoritmaları kullanarak.

Daha fazla okuma için, [[Dindd:0)Intel® 64 ve IA-32 Mimarlıks Yazılım Geliştirici Manuals[Dönetici: 1 ), her x86 talimat ve davranışları ve lgFLT:2.Agner Fog'un optimizasyon elleri) derleyici yazarlar tarafından kullanılan mikro-arşizm masaları sağlar.