Bir CPU, döngü başına birden fazla talimatı nasıl sağlar?


41

Vikipedi'nin ikinci sayfadaki talimatları bir i7 3630QM'nin 3.2 GHz frekansında ~ 110.000 MIPS verdiğini söylüyor; olacaktır (110 / 3.2 talimatlar) / 4 çekirdek = çekirdek başına döngü başına ~ 8.6 talimat ?! Tek bir çekirdek döngü başına birden fazla talimatı nasıl sağlar?

Anladığım kadarıyla bir boru hattı saat başına yalnızca bir sonuç verebilmelidir.

Bunlar benim düşüncelerim:

  • Dahili frekans aslında 3,2 GHz'den daha yüksek
  • CPU'nun bazı kısımları benim gibi mütevazi bir insanın anlayamayacağı şekilde asenkronize
  • Çekirdek başına birden fazla eşzamanlı boru hattı var
  • Bir boru hattı, saat başına sonuçtan daha fazlasını sunabilir, bir talimat boru hattı aşamalarını atlayabilir ve yetişmek için birden fazla ön planlayıcı vardır
  • Bir şey özlüyorum

1
110.000 Dhrystone MIPS sunar , yani MIPS değil, DMIPS doğrudan gördüğüm bir şeydir - belki bu bir fark yaratabilir mi? Bkz en.wikipedia.org/wiki/Dhrystone

Yanıtlar:


44

İlk olarak , Keelan'ın yorumu ve Turbo J'nin cevabı işaret ettiği gibi, ölçüm 113.093 Dhrystone MIPS yerel MIPS değildi .

İ7 3630QM'nin Ivy Bridge mikro mimarisi, döngü başına sadece 6 kaynaşmış µops yapabilir, ancak döngü başına 6 µops yürütülmesine başlayabilir. (Bir kod izindeki kaynaşık µopların sayısı kabaca talimatların sayısına eşittir; bazı karmaşık talimatlar kaynaşmamış çoklu µops'lere dönüştürülür ve bazı komut çiftleri tek bir µop'a, örn. ardından koşullu bir sıçrama izler.)

Tek bir döngüde birden fazla komutun nasıl uygulanabileceği konusundaki spekülasyonlarınızdan ikisi oldukça geçerlidir ve gerçek işlemcilerde kullanılmıştır. İlk spekülasyonunuz, daha hızlı bir iç saat kullanıldığını, orijinal Pentium 4'ün "ateş topu" ALU'larında kullanıldı. Bu ALU'lar, çekirdeğin geri kalanının frekansının iki katı frekansta, zaten nispeten yüksekdi.

(Bu, bir ilavenin alt yarısının bir döngüde yapıldığı, bağımlı bir işlemin bir sonraki döngüde sonucun alt yarısını kullanmasına olanak tanıyan kademeli bir ALU kullanılarak gerçekleştirildi. Ekleme, xor veya sola kaydırma gibi işlemler için sonucun tam alt yarısını üretmek için sadece işlenenlerin alt yarısına ihtiyaç duyan bu genişlik, aynı zamanda genişlikli boru hattı olarak da bilinen şaşırtıcı performans, tek döngü sonuç gecikmesinin yanı sıra tek döngü verimini de sağlar.)

Biraz ilgili bir teknik, basamaklandırılmış ALU'lar, HyperSPARC tarafından kullanıldı. HyperSPARC sonuçları iki ALU'dan üçüncü bir ALU'ya besler. Bu, iki bağımsız ve üçüncü bağımlı bir işlemin tek bir döngüde yürütülmesine izin verdi.

“Çekirdek başına birden fazla eşzamanlı boru hattı var” derken spekülasyonunuz kullanılmış olan diğer teknik. Bu tasarım türü, süperskalar olarak adlandırılır ve tek bir döngüde gerçekleştirilen işlem sayısını arttırmanın en yaygın yoludur.

Ayrıca, kayda değer kayda değer olabilecek başka birkaç talimat ve idam uygulamasının sona ermesi de vardır. Bazı işlemler olağan yürütme birimleri dışında daha verimli şekilde gerçekleştirilebilir. Hareket ortadan kaldırma tekniği, sıra dışı işlemcilerde kayıt defteri yeniden adlandırma sırasında taşıma işlemleri gerçekleştirmek için kayıt adının kullanılmasından yararlanır; hamle basitçe fiziksel kayıt numarasını yeniden adlandırma tablosundaki bir konumdan (kayıt diğer adı tablosu olarak adlandırılır) diğerine kopyalar . Bu sadece uygulama genişliğini arttırmakla kalmaz aynı zamanda bir bağımlılığı da ortadan kaldırır. Bu teknik yığın tabanlı x87 ile daha önce kullanılmış, ancak şu anda Intel'in yüksek performanslı x86 işlemcilerinde yaygın olarak kullanılmaktadır. (X86'da yıkıcı, iki işlemli komutların kullanılması, hareketi ortadan kaldırmayı tipik bir RISC'de olduğundan daha faydalı kılar.)

Hareket ortadan kaldırmaya benzer bir teknik, yeniden adlandırma sırasında sicil sıfırlama talimatlarının kullanılmasıdır. Sıfır değeri sağlayan bir kayıt adı sağlayarak, bir kayıt temizleme talimatı (xor veya her iki işlenen aynı kayıt ile çıkartma gibi) bu adı yeniden adlandırma tablosuna (RAT) ekleyebilir.

Bazı x86 işlemciler tarafından kullanılan diğer bir teknik ise push ve pop işlemlerinin maliyetini düşürüyor. Normalde, yığın işaretçisini kullanan bir komutun, yığın işaretçisinin değerini güncellemek için önceki bir itme veya pop için tam bir döngü beklemesi gerekir. Push ve pop öğesinin yığın işaretçisine yalnızca küçük bir değer eklediğini veya çıkardığını kabul ederek, bir çok ekleme / alt eklemenin sonuçları paralel olarak hesaplanabilir. Ekleme için ana gecikme taşıma yayılımıdır, ancak küçük değerlerde, temel değerin daha önemli bitleri - bu durumda yığın göstericisi - yalnızca en fazla bir taşınmaya sahip olacaktır. Bu, çok sayıda küçük değer ilavesine uygulanacak, taşıma seçme toplayıcısına benzer bir optimizasyon sağlar. Ek olarak, yığın göstericisi tipik olarak sadece sabitler tarafından güncellendiğinden,

Talimatları tek ve daha karmaşık bir işlemle birleştirmek de mümkündür. Talimatları çoklu olarak ikiye bölme işlemi daha basit işlemlerde eski bir teknik olsa da, birleştirme talimatları (Intel'de makro-op füzyonu anlamına gelir) uygulamanın, talimat setinde maruz kalanlardan daha karmaşık işlemleri desteklemesine izin verebilir.

Teorik açıdan, diğer teknikler önerilmiştir. RAT'da sıfır dışındaki küçük sabitler desteklenebilir ve bu gibi küçük değerleri kullanan veya güvenilir şekilde üreten bazı basit işlemler erken yapılabilir. ("Fiziksel Kayıt İnline Etme", Mikko H. Lipasti ve diğerleri, 2004, RAT'ın kayıt sayısını azaltma aracı olarak kullanılmasını önermiştir, ancak küçük sayılar ve küçük sayılardaki basit işlemlerin yüklenmesini desteklemek için bu fikir genişletilebilir.)

İzleme önbelleklerinde (komutların belirli kontrol akışı varsayımları altındaki komut dizilerini saklayan), dallarla ayrılmış işlemleri birleştirme ve izde kullanılmayan sonuçlar üreten işlemleri kaldırma fırsatları olabilir. Bir izleme önbelleğindeki optimizasyonların önbelleğe alınması, aynı zamanda, talimat akışı her getirildiğinde yapılması gerekiyorsa, değmeyecek olan, birleştirme gibi uygulama optimizasyonlarını da teşvik edebilir.

Değer tahmini, bağımlılıkları kaldırarak paralel olarak gerçekleştirilebilecek işlem sayısını artırmak için kullanılabilir. Adım tabanlı bir değer belirleyicisi, daha önce bahsedilen özel bir yığın motorunun pop / push optimizasyonuna benzer . Serileştirmeyi kaldırarak çoğunlukla paralel olarak çoklu eklemeler hesaplayabilir. Değer tahmini genel fikri, tahmin edilen bir değere bağlı olarak, bağımlı işlemlerin gecikmeden devam edebilmesidir. (Şube yönü ve hedef kestirimi etkili bir şekilde sadece çok sınırlı bir değer kestirimidir, bu da dalın "değerine" (alınan veya değil) ve bir sonraki talimat adresine, başka bir değere bağlı olan aşağıdaki talimatların alınmasına izin verir.)


müthiş! Değerli bilgiler için teşekkür ederim. Tüm bu mimari teknikleri okuyabileceğim bir kitap önerebilir misiniz?
işsiz

İşsiz Boru hattı ve sıra dışı süperskalar uygulama temellerinin ötesine geçtiğinizde (çoğu bilgisayar mimarisi ders kitaplarında yer alacak), bilgi için en iyi kaynaklar muhtemelen belirli işlemci mikro mimarilerinin açıklamalarıdır (Haswell’e bağlı makale gibi. içinde gnasher729 cevabı ) HPCA, PAKT, ASPLOS ve belki birkaç başka aynı zamanda iyi bir üne sahiptir;) ve akademik kağıtları (ISCA ve MİKRO [konferanslar] genellikle iyi kağıtları var. Andy Glew (Pentium Pro'daki çalışmaları için belki de en ünlüsü) ...
Paul A. Clayton

1
... daha ileri kavramlar sunacak olan bir CompArch wiki üzerinde çalışıyordu, ancak ilerleme yavaştı ve bir süre önce görünüşte saldırıya uğradı ve bu yüzden şimdi sadece bir hata mesajı veriyor ( semipublic.comp-arch.net/wiki ). Wiki'yi (orijinal metin korunmuş) farklı wiki yazılımı kullanarak eski durumuna getirmeyi amaçlıyor (kullandığı yazılımla ilgili bazı sorunları vardı ve bunu iyileştirme fırsatı olarak görüyor), ancak "biraz zaman alacak."
Paul A. Clayton

Superscalar mimarisinin başarısına güzel bir örnek Intel'in HyperThreading'i oldu - tüm bu optimizasyonlarla, Intel'in mühendisleri, ALU'nun yaklaşık% 30'unun çoğu zaman kullanılmadığını, çünkü hafızanın yeterince hızlı bir şekilde akamadığını ya da Boru hattı yeterince verimli doldurulamıyor. HyperThreading, ideal senaryoda ücretsiz olarak çok fazla çalışma yapmanızı sağlar. Ayrı bir çekirdeğe sahip olmaktan çok daha az, ama aynı zamanda çok daha ucuz (ve çok çekirdekli ile de birleştirilebilir).
Luaan

@ PaulA.Clayton - Bu sayfanın iki yakalama Wayback üzerinde. 20 Aralık 2013 ve 14 Şubat 2014 . Bu fotoğrafların, sayfadaki sorunları önceden tespit edip etmediğini bilmiyorum. Ne yazık ki, Wayback'teki bu sayfaları ziyaret etmeye çalıştığımda, " Bummer. Bu dosyaya hizmet veren makine çalışmıyor. Üzerinde çalışıyoruz. " İletisini alıyorum, bu yüzden bu sayfalarda ne görülebileceğinden emin değilim. .
Kevin Fegan

10

Bazı modern sihirbazlar modern işlemcilerin içinde olur, ancak düşünceleriniz kesinlikle doğru çizgilerdedir.

Modern işlemcilerin verimliliğini anlamanın anahtarı, onların süperskalar olduklarını fark etmektir . Vikipedi'den (vurgu madeni):

Süper bir CPU mimarisi , tek bir işlemcide komut düzeyinde paralellik denilen bir paralellik biçimi uygular . Bu nedenle , belirli bir saat hızında başka türlü mümkün olacağından daha hızlı CPU verimi sağlar .

Bu modern işlemcilerin tahmin ettiğiniz gibi çekirdek başına birden fazla yürütme birimi var. Hiper iş parçacığının dikkate alınması ilginçtir, boru hattının bazı bölümleri çoğaltılmıştır ancak bazıları değildir.

Sıra dışı çalıştırma da okunması ilginç, ancak sorunuzu doğrudan cevaplamıyor. Ancak "boşa" CPU çevrimlerinin sayısını azaltır.

Verimlilik, aşağıdakiler dahil ancak bunlarla sınırlı olmamak üzere, işlemci içinde durmaya neden olabilecek diğer birçok şeyden de etkilenir:

  • Önceki talimatların sonuçları mevcut değil.
  • Önbellek özlüyor.
  • Zaten kodlanmış olan bu dallanma, zaten talimatlar getirmedi ( burada ve burada şube tahmini hakkında bilgi edinin ).

Modern derleyiciler, yukarıdaki öğelerin çoğunda yardımcı olmaya çalışırlar, işlemci daha sonra devralır. İyi bir örnek için , aynı şeyi yapabilecek iki komut (bazı durumlarda) arasındaki önemli bir farkı vurgulayan Stackexchange'in başka bir yerinde bu soruya bakın . Bununla birlikte, bir tanesi kullanımdaki yürütme birimi nedeniyle bazı işlemcilerde diğerlerinden daha "hızlı" olabilir.

Modern CPU boru hattının insan tarafından okunabilir bir açıklaması için, bkz . CPU boru hattında yolculuk . Biraz daha teknik açıklama için bkz. Agner Fog'un Microarchitecture kağıdı.


açıklama ve çok ilginç bağlantılar için teşekkür ederim. Bir hücre Cell çok ilginç görünüyor gibi cpu mimarileri hakkında daha fazla çalışmak için sabırsızlanıyorum ^ _ ^. "" X86 yukarıda açıklandığı gibi bir "süper boru hattı" kullanır. Hücre ailesi dokuz mini-cpus içeren "sinerjik" bir yaklaşım kullanır. Her mini cpu çoğunlukla içinde sipariş boru hattını takip doğrudur, mini cpus çoklu paralel superscalar boru hatlarını yerine tek boru hattı var """.
işsiz

3

Ne olduğunu düşünüyorsunuz: Intel, AMD ve IBM'deki tüm mühendisler bir boru hattının döngü başına yalnızca bir sonuç verebileceğini okudular ve "peki, işte bu, bu işlemcileri daha hızlı yapamaz" dediler. Yoksa bunu okudular ve “Döngü başına birden fazla sonuç teslim edemez mi? Bunu göreceğiz!” Dediler.

Örneğin Haswell mimarisine iyi bir giriş yapmak için bu bağlantıyı takip edebilirsiniz http://www.realworldtech.com/haswell-cpu/ veya Intel web sitesine gidebilir ve orada biraz belge bulabilirsiniz.

Haswell işlemcisinin her bir çekirdeğinde, birbirinden bağımsız işlemleri gerçekleştirebilen çok sayıda yürütme birimi vardır, böylece birden fazla işlem paralel olarak gerçekleştirilebilir. Ardından, Haswell işlemcisinin vektör işlemlerini 256 bit boyutunda işleyen birkaç işlem birimi vardır. Bir vektör işlemi örneğin dört vektörlü hassas kayan nokta işlemi veya bir vektör işleminde sekiz tek duyarlıklı kayan nokta işlemi yapabilir. Ve nihayet, Haswell işlemcisi "kaynaşmış çarpma-eklemeyi" destekliyor; bu, b + c zamanlarının hesaplanmasının sadece tek bir işlem olduğu anlamına geliyor.

Teorik maksimum, Haswell'in kaynaşmış çarpma toplaması yapabilen iki üniteye sahip olması nedeniyle, döngü başına iki kaynaşık çarpma çoğaltması işlemi, her işlem sekiz tek hassasiyetli çarpma artı toplama veya 32 tek duyarlıklı kayan nokta işlemi yapıyor.

3630 işlemci, Intel'in en son fiyat listesinde değil, ancak dört çekirdekli 3740QM gibi modeller var. Böylece 32 yerine, saat döngüsü başına 128 kayan nokta işlemi elde edebilirsiniz. Bu teorik maksimum. Gerçek hayatta bunun yarısını elde etmek zor bir iştir, ancak uygun işler için imkansız değildir. 15 çekirdeğe sahip başka bir işlemci var (en fanatik oyun fanatiğinin bile ödeyemeyeceği fiyatlar için).

Yani birkaç çarpanın bir kombinasyonuna sahipsiniz:

  1. İşlemci başına çoklu çekirdekler.
  2. (Daha önce belirtilmeyen Hyperthreading, teorik sınırlara yaklaşmanıza olanak sağlar)
  3. Sigortalı çarpma ekleme işlemi, yalnızca bir olarak sayılan iki aritmetik işlem yapar.
  4. 256-bit vektörler 8 işlem yapıyor sadece bir tane sayıyor.
  5. Erimiş-çarpım ekleme kapasitesine sahip iki vektör yürütme birimi.

8.6 döngü başına işlem elde etmek çok zor değildir. Her çekirdek için 8.6 işlem bile çekirdek başına zor değildir.


X86 çalışan bazı çekirdekli, bazıları süperskalar davranış için optimize edilmiş bir komut seti kullanan bir CPU tasarlamanın pratik veya avantajlı olup olmadığını merak ediyorum. Intel ve AMD'nin x86 komut setindeki sınırlamaları aşmak için harika şeyler yaptıklarını biliyorum, ancak bazı durumlarda mevcut komut setinin ifade edemediği bazı şeyleri bilmenin faydalı olacağını düşünüyorum. Örneğin, ADDtaşma durumunun etkilenmemesi veya taşma gerçekleştiği zaman (ve değilse bırakılması durumunda bırakılması) ayarlanıp bırakılmamasına dayanan talimatların farklı versiyonları .
supercat,

1
Kendimi çok üzülmüş buluyorum bu gün ve yaşta, birçok dil varsayılan olarak taşma kontrol etmiyor. Java'nın anlamsal gereklilikler yüzünden sıkıştığını biliyorum, ancak hem bindirme hem de bindirme yapmayan aritmetik operatörleri içeren C # dillerinde taşma yapmamaya neden olduğum tek iyi neden, kişinin sarma davranışı gerektirmesidir. Şu anda, taşma kontrolü kayda değer bir hız cezası getirebilir, ancak bir makine dili, taşma işleminin gerçekleşmeden önce taşma olmadığından emin olacağı sürece taşma
tuzağının

... belli kritik noktalara ulaştığında, taşma tuzağı yükünü neredeyse sıfıra indirmek mümkün olmalıdır. Kod bir hesaplama yapar ve ardından ilk hesaplama taşarsa bırakılacak olan bir konuma bir değer kaydederse, işlemci ilk hesaplamanın başarılı olup olmadığını öğrenene kadar mağazayı ertelemeye gerek yoktur, ancak işlemci şu an için hiçbir işlem yapamaz. Bunu bilmeden. Eğer kod taşma olup olmadığına emin bir şekilde güvenli bir şekilde yapılabilecek tüm işlemleri yapabiliyorsa ve bunlardan herhangi birinde hatalı taşma olup olmadığını kontrol edin ...
supercat 16

... yürütme bağımlılıklarının azaltılmasına yardımcı olacak gibi görünüyor.
supercat,

2

Drystone benchmark 1984, ve ilgili nominal 1 MIPS VAX makine, modern anlamda çok verimli değil. Bir Cortex M3 bile 1,25 DMPIS / MHz sunar.

Intel Core mimarisi işlemcileri tek bir çekirdekte paralel olarak birden fazla talimat çalıştırabilir, çünkü mevcut birden fazla bilgisayar birimi var.


1

Ars Technica'dan Jon "Hannibal" Stokes'ten, mikroişlemci mimarisi konusunda mükemmel ve kapsamlı makaleler okudum. Makaleler biraz eskiydi (2004'ten gelmiş gibi görünüyorlar), ancak yine de çok ilgili.

Bir makalenin bir sonraki bölümüne olan bağlantıların bazıları koptu, ancak ilk bölümün URL’sini ve sonraki sayfanın kopuk URL’sini (örneğin m-URL’ye bir miktar ekleyerek ) dikkatlice karşılaştırarak bunları kendiniz düzeltebilirsiniz .

(evet, bu yüceltilmiş bir bağlantı sadece cevaptır, üzgünüm; makaleler bunlardan bahsetmek için çok iyi

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.