Neden her bir döngüde yüksek talimatlara ve yüksek saat hızına sahip olamıyorsunuz?


37

Megahertz Myth, PC'nin INTEL 8086 işlemcisi ile Apple'ın Rockwell 6502 işlemcisi arasındaki farklardan dolayı promosyonel bir taktik haline geldi. 8086 4.77MHz’de, 6502 ise 1MHz’de çalışıyordu. Bununla birlikte, 6502'deki talimatlar için daha az döngü gerekiyordu; Aslında o kadar azı, 8086'dan daha hızlı çalıştı. Aslında bazı talimatlar neden daha az döngüye ihtiyaç duyuyor? Ve neden daha az döngüye ihtiyaç duyan 6502'nin talimatları 8086'nın hızlı bir bisiklet işlemcisi ile birleştirilemiyor?

Wikipedia'nın döngü başına talimatlara ilişkin makalesi (IPC)

IPC'yi yöneten faktörler
Saniyede verilen talimat seviyesi, yüksek bir IPC ve düşük bir saat hızı ile ya da düşük bir IPC ve yüksek saat hızında elde edilebilir.

Neden her bir döngüde yüksek talimatlara ve yüksek saat hızına sahip olamıyorsunuz?

Belki de bunun bir saat döngüsüyle ne ilgisi var? Wikipedia devrelerin senkronizasyonundan bahseder mi? Bunun ne anlama geldiğinden emin değilim.

Ya da belki bunun bir boru hattının nasıl çalıştığı ile ilgisi var? Kısa bir boru hattındaki talimatların neden uzun bir boru hattındaki talimatlardan farklı olduğundan emin değilim.

Herhangi bir fikir harika olurdu! Sadece mitin arkasındaki mimariyi anlamaya çalışıyorum. Teşekkürler!

Referanslar:

Çevrim Başına Yönelik Eğitim - Artan Çevrim Sayısı

http://en.wikipedia.org/wiki/Instructions_per_cycle

http://en.wikipedia.org/wiki/Clock_cycle


1
> Neden bazı talimatlar daha az döngü gerektiriyor? RISC / CISC (iyi, sırala ). Ve neden daha az döngüye ihtiyaç duyan 6502'nin talimatları 8086'nın hızlı bir bisiklet işlemcisi ile birleştirilemiyor? Yapabilirler ve alabilirler. Sorun şu ki, bir kere bir temel kurduğunuzda, her şeyi kazmak ve bir sonraki modeli sıfırdan başlatmak zordur.
Synetech

@Synetech, intel kinda sorta, programcılara bir CISC talimatı sunarak, ardından bunu çip üzerindeki RISCier talimatlarına dönüştürerek yaptı
soandos 12:12

İkisinin birleştirildiğini söylediğimde, tamamen farklı çip üreticileri kastediyordum. Elimde bir liste yok, ancak böyle şeyler yapan başkaları da var (Intel / AMD dışı). (Çoğu kişi, pek çok çip üreticisi olduğunu unutuyor, çünkü Intel ve AMD şu anda masaüstü pazarına hâkim.)
Synetech

Yanıtlar:


21

tl; Dr.

Daha kısa boru hatları, daha yüksek saat hızları anlamına gelir ancak verimi düşürebilir. Ayrıca, alttaki 2 ve 3. cevaplara bakın (kısa, söz veriyorum).

Daha uzun versiyon:

Burada dikkat etmeniz gereken birkaç şey var:

  1. Tüm talimatlar aynı anda alınmaz
  2. Tüm talimatlar derhal yapılanlara bağlı değildir (hatta on veya yirmi) talimatlara geri

Çok basitleştirilmiş bir boru hattının (modern Intel çiplerinde olanların karmaşıklığın ötesinde olduğu) birkaç aşaması var:

Alma -> Kod Çözme -> Bellek Erişimi -> Yürüt -> Yazma -> Program sayaç güncellemesi

Her birinde -> yapılan bir zaman maliyeti vardır. Ek olarak, her tıklatma (saat döngüsü), her şey bir aşamadan diğerine geçer, bu nedenle en yavaş aşamanız TÜM aşamaların hızına dönüşür (mümkün olduğu kadar benzer olmaları için para öder).

Diyelim ki 5 talimatınız var ve bunları uygulamak istiyorsunuz (wikipedia'dan çekilmiş, burada PC güncellemesi yapılmadı). Şuna benzerdi:

görüntü tanımını buraya girin

Her komutun tamamlanması 5 saat döngüsü alsa da, her döngüde bitmiş bir komut boru hattından çıkar. Her aşama için geçen süre 40 ns ve ara bitler için 15 ns (yukarıdaki altı aşamalı boru hattımı kullanarak), ilk talimatı almak için 40 * 6 + 5 * 15 = 315 ns alacaktır.

Buna karşılık, eğer boru hattını tamamen ortadan kaldıracak olsaydım (ama her şeyi aynı tutardım), ilk talimatı almak sadece 240 ns alacaktır. ("İlk" talimatı çıkarmak için hızdaki bu gecikmeye gecikme denir. Genelde, saniyedeki komutların sayısı olan verimden daha az önemlidir).

Gerçekte asıl farklı olan, boru hattındaki örnekte, her 60 ns'de bir yapılanmadan sonra (ilkinden sonra) yeni bir uygulama alıyorum. Boru hattında olmayan, her zaman 240 alır. Bu, boru hatlarının verimliliği artırmada iyi olduğunu göstermektedir.

Bir adım daha ileri giderek, bellek erişim aşamasında, bir ek birime ihtiyacım olacak gibi görünüyor (adres hesaplamaları yapmak için). Bu, o döngünün mem aşamasını kullanmayan bir talimat varsa, o zaman başka bir ek yapabilirim anlamına gelir. Böylece, bir işlemci üzerinde tek bir tıklamayla iki işlem aşaması yapabilirim (biri hafızaya erişim aşamasındadır) (zamanlama bir kabustur, ancak oraya gitmeyelim .. Ek olarak, PC güncelleme aşaması ayrıca bir atlama durumunda, ben bir kene üç ekleme yürütme durumları yapabilirim). Bir boru hattına sahip olarak, iki (veya daha fazla) komutun değerli aşamaları azaltarak farklı aşamaları (veya sıçrama aşamaları vb.) Kullanabileceği şekilde tasarlanabilir.

Bunu yapmak için, işlemcilerin çok fazla "sihir" ( sıra dışı uygulama , şube tahmini ve daha fazlası) yaptıklarını unutmayın, ancak bu, birden fazla talimatın bir boru hattından daha hızlı çıkmasına izin vermeyeceğini (çok fazla olan uzun süre yönetmek çok zordur ve yalnızca aşamalar arasında bekleyerek daha yüksek bir maliyete maruz kalırsınız). Çevirme tarafı, boru hattını çok uzun yaparsanız, çılgın bir saat hızı elde edebilirsiniz, ancak orijinal avantajların çoğunu kaybedebilirsiniz (aynı anda birden fazla yerde var olabilecek ve aynı anda kullanılabilen aynı mantık türüne sahip olmanız). ).

Cevap # 2:

SIMD (tek komut birden çok veri) işlemciler (çoğu GPU gibi) birçok bilgi bitinde çok fazla iş yapar, ancak bunların yapılması daha uzun sürer. Tüm değerleri okumak daha uzun sürer (daha yavaş bir saat anlamına gelir, ancak bu bir dereceye kadar çok daha geniş bir otobüse sahip olsa da dengeleyebilir) ancak bir seferde daha fazla talimat alabilirsiniz (döngü başına daha etkili talimatlar).

Cevap # 3:

Çünkü, döngü sayısını yapay olarak uzatarak "hile" edebilirsiniz, böylece her döngüde iki komut yapabilirsiniz (saat hızının sadece yarısı kadardır). Aynı zamanda, her iki kenede bir tekin yerine bir şeyler yapmak mümkündür (2x saat hızı verir, ancak talimatlarda bir saniye değişmez).


3
Kısa boru hatları, daha yavaş saat hızı anlamına gelir ! Pentium 4'ün uzun boru hatları nedeniyle yüksek saatleri vardı, işte WP: "NetBurst, P6'dan (Pentium III, II, vb.) Çok yüksek saat hızlarına ulaşmak için çok derin bir talimat boru hattına sahip olmasıyla farklıydı". Mesele şu ki, yüksek hızlara ulaşmak için sahne başına az şey yapıyorsunuz. Bununla birlikte, bu uygulanabilir bir iş değildi ve Intel bu nedenle AMD'ye büyük bir ivme kazandırdı. Pentium 3 mimarisine geri döndüler ve "Çekirdek" ile geldiler.
stolsvik

@stolsvik, bunu açıklayabilir misiniz? Bana hiç mantıklı gelmiyor (daha az geçiş aşaması aşamasına sahip olmak, herkesin eşit olduğu anlamına geliyor, saat döngüleri daha kısa olacak ve daha yüksek bir saat hızı verecek)
soandos

4
Saat döngüsü başına bir boru hattı aşaması yapılır ; Tüm boru hattı saat başına bir adım ilerler - alt kısımda yeni talimatlar alır, üst kısımda "talimat verir". Bu nedenle, Pentium4'ün fikri, yüksek saatler veren, ancak daha uzun bir boru hattı gerektiren, gerçekleştirmesi hızlı olan çok küçük adımlar atmaktı. Bir boru hattına sahip olan ipucu (tüm işlemcilerde bir tane kullanır), devam eden herhangi bir zamanda işlenmekte olan birkaç talimatınız vardır. Uzun bir boru hattı birçok talimatın devam ettiği anlamına gelir - ve bir dal tahmini başarısız olursa, o zaman tüm boruyu yıkamak zorunda kalacaksınız.
stolsvik

Cevabınız # 2 için CPU sadece önbellek üzerinden veriye erişir (bellek erişimi genellikle talimatın bakış açısından şeffaftır). Saat sıklığının azaltılması, verilerin RAM'den gelmesinin ne kadar süreceğini etkilemez (önbellekte değilse). Ayrıca veriyolu genişliği, SIMD işlemlerinin hızını sadece işlenenlerinizin boyutuna göre etkiler (yani, bir seferde 64 bit veri yoluna 8 8 bit işlenen yükleyebilirim, ancak yine de 8 64 bitlik değerleri el ile yüklemem gerekiyor 64 bit operandlarım varsa).
Atılım

2
Ayrıca, # 1 cevabı için, "o döngü aşamasını kullanmayan bir komut varsa, o zaman başka bir ekleme yapabilirim" dediğinizde, bu yanlıştır. Sıra dışı yürütme, mikro işlem düzeyinde değil, komut düzeyinde uygulanır. Bir talimat boru hattında iki yürütmeyi gerektiriyorsa, bu, boru hattında bir kabarcığa neden olur . Son olarak, x86 mimarisi, bellek okuma / yazma işlemi sırasında anında bellek adreslerini hesaplamak için ayrı bir ALU'ya sahiptir ( [EBX+ECX*4+100]stil adreslemesine olanak tanır ).
Atılım

8

Bunu fazlasıyla basitleştiriyorum, ancak hatırlanması gereken önemli nokta, bu terimlerin elmaları portakallarla karşılaştırması. Bir "Döngü", tüm işlemcilerde aynı olan tek bir birleşik bir ölçüm birimi değildir, "ikinci bir" gibi, zamanın birleşik bir ölçümüdür. Bunun yerine, bir döngü, rasgele olarak tanımlanmış, ancak boru hattı tasarımının karmaşıklığı ve tabii ki fizik tarafından sınırlanan belirli bir çalışma birimini temsil eder.

Çoğu durumda, tek bir döngüde çok fazla iş yapmanız boru hattının tamamını temizlemenizi sağlayabilir. Başarılı olursa, bu bir sonraki döngünüzün optimize edileceği anlamına gelir çünkü boru hattını tekrar doldurmanız gerekir, bu da biraz zaman alabilir.

Her döngüde bir RISC komutunun bir aşamasını işleyen çok basit bir işlemci tasarlayabilirim ve eğer bu işlem CPU'mun temeli olsaydı, saniyede çok yüksek bir döngü elde edebilirdim. Çevrim".

Detaylar, gerçekten anlamadığım bir çok fizik ve elektrik mühendisliğine giriyor, ancak işlemciye sadece giriş voltajı ekleyerek ve en iyisini umarak saat hızının elde edilemediğini unutmayın. En azından, termal profil başka bir önemli husustur.


Bu soruya gerçekten cevap vermiyor (bunun neden sadece işlerin hızlanamadığı ile ilgisi yok). Ne kadar fazla devir olduğunu soruyor! = Her zaman daha fazla iş
soandos

Bununla birlikte, bu cevap diğer cevaplarda görmediğim bir meseleyi ele almaktadır; yani, daha az saat döngüsündeki işlemleri tamamlayan özel komut setlerinin dahil edilmesi ve en düşük komut setlerine dayanarak saat döngülerini ölçme yeteneği hakkında konuşur. kadar verimli olmamak. (Çok yanlış olabilirim ... mimarlığı büyüleyici buluyorum ama kendimi hiçbir şekilde uzman olarak görmeyeceğim)
Stephen R

5

İşte size çok basit (belki de aşırı basitleştirilmiş) bir açıklama: Yapmanız gereken belirli bir işin olduğunu söyleyin, iki tane 32 bitlik sayı ekleyin. İki yaklaşım alabilirsin. Çok sayıda çok küçük adımlara bölebilir ya da çok sayıda çok küçük adımlara bölebilirsiniz.

Örneğin, sadece "iki sayı ekle" diyebilirsiniz. Şimdi sadece bir adımın var. Ancak bu adımın birden fazla kısmı var ve yapılması daha uzun sürecek. Bu nedenle, her bir döngü için yüksek talimatınız var - bu durumda bir tane. Ancak saat hızınız yüksek olamaz çünkü o döngüde yapacak çok işiniz var .

Alternatif olarak, "İlk numarayı bir kayıt defterine getirin. Sonra ikinci numarayı getirin. Sonra en az önemli bit ekleyin. Sonra, ikinci elden en az ikinci bit ekleyin. "Sonra en önemli bitleri ekleyin. Bir taşıma olsaydı, taşma bayrağını ayarlayın. Sonra sonucu belleğe yazın." Şimdi çok sayıda adımınız var. Ancak her adım saçma hızlı olabilir. Bu yüzden döngü başına düşük talimatınız var (bu durumda 1/36 ya da öylesine). Ancak saat hızınız çok yüksek olabilir, çünkü her döngüde yapılacak çok küçük bir işlem vardır.

Hem çevrim başına yüksek talimatlara hem de yüksek bir saat hızına sahip olmak için, karmaşık bir talimatı çok az sayıda çok basit adımlara bölmeniz gerekir. Ancak bu yapılamaz çünkü talimat karmaşıktır.

Modern işlemcilerin boru hatları ve üst üste binmeleri ile ilgili talimatlar nedeniyle, gerçek spesifik takaslar ve devir numaraları oldukça farklıdır. Ancak temel fikir doğru.


2

Sen edebilirsiniz döngü başına yüksek talimatları ve yüksek saat hızı ikisi de var. Sınırların aşıldığı yer, dijital devrenin yayılma gecikmesinin, tek bir saat döngüsünün darbe genişliğini aştığı zamandır. CPU voltajını artırarak bunun üstesinden gelinebilir, ancak bunun güç tüketimini artıracağı (ve dolayısıyla ısıyı dağıtacağı) belirtilmelidir.

Bu nedenle, daha yüksek bir saat hızı istiyorsanız , yayılma gecikmesini azaltmak için voltajı ( elektron sürüklenme hızını artırarak) arttırmanız gerekir . Bu gecikme bir saat döngüsünü aşarsa, CPU büyük olasılıkla beklendiği gibi davranmaz ve üzerinde çalışan yazılım kilitlenir veya bir istisna atar. Ancak, bir işlemciden geçebileceğiniz voltaj için bir sınır vardır ve bu CPU'nun tasarımı tarafından belirlenir - esas olarak iç elektrik yollarının mevcut taşıma kapasitesi.


Boru hattı, bazı durumlarda daha yüksek saat hızlarına izin verir, çünkü her komut birkaç daha küçük "mikro işlem" e ayrılmıştır. Bu mikro işlemler, bir zincirle birbirine bağlı çok daha küçük devrelerin kullanıldığı çok basit işlemlerdir (fiziksel anlamda, elektronların hareket etmesi gereken mesafe ne kadar az olursa, belirli bir alt ünite boyunca ilerleme gecikmesi o kadar kısa olur).

Pipeline edilmiş bir CPU'ya ilave avantaj, daha karmaşık bir tasarım pahasına, birim zamanda yürütülen komut sayısını büyük ölçüde artırabilmenizdir.

Bazı talimatların neden daha fazla veya az döngüye ihtiyaç duyduğuna gelince, hangi talimatı uyguladığınıza bağlıdır. Örneğin, x86 komut kümesinde, bellekteki tüm dizeyi bir yerden bir yere taşıyabilen bir MOVSkomut vardır. Açıkçası, uzun bir dize anında kopyalayamazsınız, ancak birden fazla saat döngüsü alarak, sözcükleri tek tek kopyalayarak yapabilirsiniz. Bu nedenle, MOVSkomut değişken bir süre alır (kopyalanacak karakterlerin miktarına bağlı olarak).

Çok çevrimli işlemlerin etkisi, bir CISC tasarımına (yani x86) karşı RISC tasarımında (yani ARM) daha az fark edilir . Bunun nedeni, RISC tabanlı tasarımların yalnızca en sık kullanılan temel işlemlere sahip olması ve döngü başına bir komutun verimini elde edecek şekilde boru hattında kullanılması daha kolay olmasıdır.


1

Bilgisayarınızın belirli bir görevi tamamlaması ne kadar sürer, bilgisayarın saat hızına bağlı değildir ... hesaplama birimlerinin nasıl tasarlanıp tasarlandığına bağlıdır.

Saat hızı aslında CPU tasarımcısı tarafından bazen iyi nedenlerle (verimlilik), bazen de fakirler için (reklamcılık) verilen keyfi bir karardır.

Belirli bir CPU'nun bitirmesi 1 ila 100 nanosaniye (ns) arasında değişen bir talimatlar karışımı olduğunu varsayalım. Saat hızını 1 "tik" 100 ns (10 MHz) olacak şekilde ayarlayabilirsiniz; bu, her komutun tam olarak bir tik olarak biteceği anlamına gelir. Bununla birlikte, eğer talimat yürütme süreleri eşit olarak dağıtılmışsa, bu, hesaplama birimlerinizin zamanın% 50'sini boşta tutacağı anlamına gelir (ortalama çalıştırma hızı 50ns olacak ve diğer 50n'leri boşta bırakacaktır). Öte yandan, onayınızı 10ns olarak ayarlarsanız, talimatlar 1 ila 10 arasındadır, ancak ünite bir sonraki komut başlamadan önce 9nstan daha fazla boşta olmaz ve ortalama rölanti 5ns olur.

Geliştirme sırasında, bir CPU'nun gerçekte ne kadar iş yapabildiğine bağlı olarak belirli bir hızda çalışacak şekilde bir CPU tasarlanacaktır. Saat hızını yükseltirseniz veya düşürürseniz, aslında CPU'nun başarabileceği iş miktarını değiştirmezsiniz, sadece verimlilik oranını karıştırıyorsunuzdur.

(Hızaşırtma işlemcileri hakkında ağlamadan önce: bu size gerçek dünyadaki hız kazanımlarıyla sonuçlanan iki avantaj sağlar: hızlı çalıştırma talimatları (1 döngüden daha az sürer) daha hızlı çalıştırma süreleri ile sonuçlanır ve tüm talimatların daha az boşta kalma süresi vardır. Bunlardan bazıları aslında, bilgisayarınızın gerçekleştirebileceği iş miktarını artırabilir, ancak CPU'yu% X oranında overclock etmenin, her zaman kıyaslamada yaptığınız işte% X artışa eşit olmadığını göreceksiniz.)

TL; DR

Bir CPU X çalışmasını bir saniyede başarabilir. Eğer H saat hızı ve I IPC kullanıyorsanız, I = X / H değerine sahibiz. H'yi değiştirmek X'i değiştirmez, ancak beni ters etkiler.


1
Saat hızı keyfi bir karardan uzak. CPU besleme voltajının ve IC iz uzunluklarının (aşırı ilerleme gecikmelerini önlemek için) bir fonksiyonu olarak dikkatlice seçilmesi gerekir.
Atılım

Bir CPU'nun senkron dijital bir devre olduğu gerçeğini kaçırdığınızı düşünüyorum . Talimatlar X nanosaniye almaz (saat döngüsünüzün yayılma gecikmesinden daha az olduğu varsayılırsa), her şey yükselen veya düşen bir saat kenarında - veya her ikisinde de olur. Talimatlar X devirdir, X zaman birimi değildir . Evet, bir döngünün ne kadar süreceğini değiştirebilirsiniz , ancak fark ne zaman gerçekleşeceğidir. Ve son olarak, bir saniyede bir CPU'nun yapabileceği iş miktarı saat hızının bir fonksiyonudur, bu nedenle formülünüz gerçekten burada kontrol etmez.
cp2141

Bir CPU, birkaç eşzamansız ünitenin eşzamanlı bir birleşimidir. Saat tıklamaları işleri güzel bir şekilde sıralamak için kullanılır, ancak yürütmenin ne kadar süreceğini belirlemezler. Örneğin, bir tamsayı eklentisi, akımın CPU'dan ne kadar uzağa gitmesi gerektiğine ve ne kadar hızlı transistörlere bağlı olarak belli bir süre alacaktır durumları değiştirecek. Sonuç, bir sonraki saatin onayında OKUYOR, ancak gerçek hesaplama onay boyunca asenkron olarak yapılır.
Benjamin Chambers

0

Biri döngü başına yüksek talimatlara ve yüksek saat hızlarına sahip olamaz çünkü gereksinimler çelişkilidir.

Biri, ilk yaklaşımda, IPC'nin, tasarımın karmaşıklığına (A) bağlı olduğu gösterilebilir.

IPC = bir sqrt (A)

tasarım ölçeklerinde ulaşılan azami frekans (F) ise [1]

F = 1 / {b + c sqrt (A)}

a, b ve c parametreleriyle.

Böylece, muarşın karmaşıklığının arttırılması, çalışma frekansını azaltma pahasına IPC'yi arttırırken, karmaşıklığı azaltma IPC'nin pahasına frekansı arttırır. Bu, vikipedi maddesinde belirtilen iki aşırı uç vakasına karşılık gelir, ancak wikipedia isimlerden bahsetmez: Brainiac ve speed-iblis.

  • Brainiac tasarımı: Yüksek IPC ve düşük frekans
  • Hız-iblis tasarımı: Yüksek frekans ve düşük IPC.

[1] Bazı yazarlar frekans ifadesinin bunun yerine "1 / {b + c A}" olduğunu iddia eder, ancak her iki durumda da karmaşıklığın arttırılması, erişilebilecek maksimum frekansı azaltı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.