- 1993 tarihli Intel Pentium, kayan nokta çarpma işlemini hızlı yapmak için 3 kat değer üreten özel bir ×3 devresi içeriyordu; yalnızca bu küçük devre bile binlerce transistör kullanıyordu
- Pentium, 64 bit çarpmada toplanacak terim sayısını 64’ten 22’ye düşürmek için radix-8 çarpma kullanır; ancak bu yöntemde ×3 katının hızlı üretilmesi gerekir
- ×3 hesabının kendisi
x + 2xtoplamasıdır, fakat çarpma işleminin geri kalan aşamaları bu sonucu beklediği için carry lookahead ve Kogge-Stone gibi hızlı toplayıcı teknikleri gerekir - Devre, sekiz adet 8 bit blok ile üst seviye lookahead’i birleştiren hiyerarşik bir yapıya sahiptir; taşma ve yuvarlama için gerçek çıkış 69 bit genişliğine çıkar
- Tek bir ×3 devresinde yaklaşık 9000 transistör kullanılması, Pentium neslinde performans için ne kadar karmaşık donanım optimizasyonları yapıldığını gösterir
Pentium’un ayrı bir ×3 devresi bulundurmasının nedeni
- Pentium’un kayan nokta çarpıcısı, iki 64 bit sayıyı radix-8 yöntemiyle çarpar
- Sıradan ikili çarpma, her bit için 0 veya çarpılan sayıyı eklediğinden 64 bit çarpmada 64 terim gerekir
- Radix-8 yöntemi, çarpanı 3 bitlik gruplara ayırıp 0~7 arasından bir değerle çarptığı için toplanacak terim sayısı 22’ye düşer
- 0~7 katlarından bazıları donanımda görece basit üretilebilir
- ×2, 1 bit sola kaydırma ile işlenir
- ×4, 2 bit sola kaydırma ile işlenir
- ×6 ve ×7, Booth çarpma algoritması ile bir sonraki radix-8 basamağının +1’i ve mevcut basamağın çıkarma işlemi birleştirilerek işlenebilir
- ×5, ×8’den ×3 çıkarılarak elde edilebilir
- Sonuçta zorlayıcı kat ×3’tür ve Pentium bunu kayan nokta çarpıcısının içindeki özel bir devreyle çözer
Basit toplamanın darboğaz olduğu nokta
- 3 kat değer, giriş değerinin kendisi ile bir bit sola kaydırılmış halinin toplanmasıyla üretilebilir
- Yapı olarak bakıldığında bu
x + 2xtoplamasıdır
- Yapı olarak bakıldığında bu
- Darboğaz, toplama sürecindeki carry yayılımında ortaya çıkar
- Ripple-carry adder’da alt bitlerde oluşan carry’nin üst bitlere sırasıyla iletilmesi gerekir
- ×3 sonucu hazır olmadan çarpma işleminin geri kalanı başlayamayacağı için gecikmenin azaltılması gerekir
- Pentium, carry’yi sıralı olarak yaymak yerine paralel hesaplamak için carry-lookahead adder kullanır
- Her bitte carry generate ve carry propagate sinyalleri üretilir
- Generate, ilgili konumun carry oluşturduğu durumu ifade eder
- Propagate, gelen carry’nin dışarı aktarıldığı durumu ifade eder
- Carry paralel hesaplandığında sum bitleri de paralel hesaplanabilir
Kogge-Stone ve 2 aşamalı carry lookahead
- Carry lookahead basitçe doğrudan uygulanırsa bit sayısı büyüdükçe devre ve kablolama yükü artar
- Bit konumu yükseldikçe mantık karmaşıklaşır
- Çok girişli kapılar elektriksel nedenlerle yavaşlar
- Pentium, 8 bitlik birimler halinde Kogge-Stone paralel prefix toplayıcı kullanır
- Kogge-Stone, propagate/generate sinyallerini aralıklar halinde birleştirerek carry’yi paralel hesaplar
- Ara sonuçları yeniden kullanarak gecikmeyi ve devre miktarını yönetir
- 64 bitin tamamını tek bir Kogge-Stone ile işlemek yerine 2 aşamalı hiyerarşik yapıya böler
- Alt katman, her bloğun iç carry’sini hesaplamak için sekiz adet 8 bit Kogge-Stone devresi kullanır
- Üst katman, her 8 bit bloğu tek bir birim gibi görüp bloklar arası carry’yi hesaplar
- İki katman birleştirilerek 64 bit toplam için gereken carry hızla sağlanır
- Devre 64 bitlik gibi görülebilir, ancak gerçekte taşmayı önleme ve yuvarlama için ek bitler de dahil edilerek 69 bit çıkış üretir
Carry-select ile bekleme süresini azaltma
- Her 8 bit blokta bir carry-select adder bulunur
- Carry-in’in 0 olduğu ve 1 olduğu durumların toplamı önceden ayrı ayrı hesaplanır
- Üst seviye lookahead devresi gerçek carry-in’i bildirdiğinde multiplexer doğru sonucu seçer
- Bu yöntem daha fazla donanım kullanma pahasına zamandan tasarruf eder
- İki adder ve sonuç seçimi için bir multiplexer gerekir
- Toplam hesaplaması ile carry hesaplaması örtüştürülerek toplam gecikme azaltılır
- En düşük 8 bit blokta carry-in olmadığından carry-select devresine gerek yoktur
- Bu bloğun çıkış bitleri XNOR kapısı ile hesaplanır
8 bit bloğun içinde olanlar
- ×3 devresinin her 8 bit bloğu, giriş hatlarını soldaki adder’a ve sağdaki yola ayırır
- Bu dallanma yapısı, giriş değeri ile bir bit sola kaydırılmış giriş değerini toplayarak ×3’ü gerçekleştirir
- Bloğun üst kısmı, propagate/generate sinyallerini üreten devrelerden oluşur
- Bu sinyaller 8 bit Kogge-Stone lookahead devresine girer
- Kogge-Stone bölümü, her bit konumunda farklı karmaşıklığa sahip olduğundan tekrarlayan bloklar gibi değil, düzensiz görünür
- Bloğun alt kısmı carry-select adder alanıdır
- İki toplam önceden hesaplanır ve carry-in’e göre multiplexer seçim yapar
- Carry-select adder bloğu, üst Kogge-Stone devresinin bir kısmına yer açmak için çevredeki devrelerden daha dar yerleştirilmiştir
- Her blok, çıkış bitlerini bir sonraki çarpıcı devresine göndermeden önce sürücü devre ile güçlendirir
XNOR kapısı ve transistör düzeyinde uygulama
- Düşük bit bölgesindeki XNOR kapısı Pentium’da multiplexer olarak uygulanmıştır
- Intel 386, XOR’u AND-NOR kapılarıyla uygulamıştı; Z-80 ise pass transistor kullanmıştı, ancak Pentium’un yaklaşımı farklıdır
- Söz konusu XNOR devresi dört inverter ve pass transistor multiplexer’dan oluşur
- B girişi, multiplexer’ın iki girişinden A girişini veya A’nın terslenmiş halini seçer
- Bunun sonucunda XNOR fonksiyonu oluşur
- Çip fotoğrafı analizinde, alt metal katman M1’i ve katkılanmış silikon bölgeleri gözlemlemek için üstteki iki metal katman kaldırılır
- Polisilikon hattın katkılanmış silikonu kestiği nokta transistör kapısı olur
- CMOS devresi üstte NMOS ve altta PMOS transistörlerden oluşur
BiCMOS çıkış sürücüsü
- ×3 devresinin çıkışı yüksek akım gerektirir
- Her ×3 sinyali, kayan nokta çarpıcısı içinde en fazla 22 terimi sürebilir
- Hedef devre ×3 devresinden uzakta bulunabilir
- Uzun kablolar ve çok sayıda transistör kapısı nedeniyle kapasitans artar; sinyali hızlı değiştirmek için yüksek akım gerekir
- Pentium, aynı çipte bipolar transistor ve CMOS’u birleştiren BiCMOS sürecini kullanır
- Pentium, sinyal gecikmesini en fazla %35 azaltmak için BiCMOS devrelerini yaygın biçimde kullanmıştır
- Intel, Pentium Pro, Pentium II, Pentium III ve Xeon’da da BiCMOS kullanmıştır
- Çip voltajı düştükçe bipolar transistorun avantajları azaldı ve BiCMOS sonunda kullanılmaz hale geldi
- ×3 devresinin sürücüsü, bir BiCMOS sürücünün ikinci bir BiCMOS sürücüyü sürdüğü bir yapıdır
- Yüksek akımlı inverter’ın transistör kapısı büyük olduğundan onu sürmek için ara bir aşama gerekir
- Küçük sinyali birkaç aşamada büyütmek toplam gecikmeyi azaltabilir
- BiCMOS sürücüsünün NPN transistörü, normal MOS transistörlerden farklı olarak büyük bir kutu şeklinde görünür
- Inverter, çıkışı yükseltmek için PMOS ve çıkışı düşürmek için NMOS kullanan standart CMOS yapısını kullanır
- Bazı inverter’lar güçlü high veya güçlü low çıkışı verecek şekilde asimetrik akım özellikleriyle tasarlanmıştır
Çarpma donanımının gösterdiği karmaşıklık artışı
- Bilgisayar çarpma donanımının tarihi 1950’lere kadar uzanır
- Booth çarpma tekniği 1951’de açıklanmıştır
- Paralel çarpıcılar 1960’ların ortasında Wallace ve Dadda tarafından önerilmiştir
- İlk mikroişlemcilerde donanımsal çarpma desteği sınırlıydı
- 6502 gibi işlemcilerde çarpma donanımı olmadığından kullanıcıların shift ve toplama ile yazılımsal uygulama yapması gerekiyordu
- Intel 8086, mikro kodla yavaş bir shift-and-add döngüsü gerçekleştiriyordu
- 386 bir multiply unit içeriyordu, ancak çarpma komutu en fazla 41 clock cycle sürüyordu
- Pentium dönemine gelindiğinde milyonlarca transistör sığdırılabildiği için daha karmaşık performans optimizasyonları mümkün hale geldi
- Pentium’un kayan nokta çarpması 3 clock cycle sürer ve çarpma devresi bunun 2 cycle’ı boyunca kullanılır
- Tamsayı çarpması
MULise 11 cycle ile çok daha yavaştır - 2008’deki Nehalem mikro mimarisi, kayan nokta çarpma süresini 1 cycle’a indirmiştir
- Pentium’un ×3 çarpıcısı yaklaşık 9000 transistör içerir
- Bu, 1976 tarihli Z80 mikroişlemcisinin tamamından biraz daha fazladır
- ×3 devresi, Pentium’un kayan nokta birimi içindeki kayan nokta çarpıcısının yalnızca küçük bir parçasıdır
1 yorum
Hacker News yorumları
Çok yan bir konu ama uzun zaman önce üçlü bilgisayar emülasyonu üzerinde çalışırken, 3'ün kuvvetlerine bölme işlemini bit kaydırma ve toplamalardan oluşan bir seriye dönüştüren kapalı biçimli bir dönüşüm bulmak için sevimli bir numara kullanmıştım
Önce
1/3 - 1/2 = 2/6 - 3/6, yani1/3 = 1/2 - 1/2 (1/3)olduğunu görmek yeterliBu ifadeyi sağ tarafa sonsuz kez yerine koyunca
1/3 = -(-1/2)^Nbiçimi ortaya çıkıyor;Nise1..infaralığındaSadece 2 ve 3'ün kuvvet çiftleri için değil, başka tabanlarda da benzer şeyler yapılabiliyor
Anlamı şu: 2'nin kuvvetlerine yakın değerler için, yalnızca toplayıcı ve çıkarıcılarla sabit zamanda çalışan sabit bölenli bölme devreleri yapmak oldukça kolay
Cinematronics arcade oyun işlemcisinde iki adet 12 bitlik akümülatör var
Çarpma komutu bu ikisini tek bir 24 bitlik değer gibi sağa kaydırıyor ve en düşük anlamlı bitten 1 gelirse bellek içeriğini ekliyor
Bu yüzden üst yarıyı temizleyip alt yarıya bir değer yüklüyor, diğer operandın bellek adresini nasıl ayarladıklarını unuttum ama 1 bitlik çarpmayı art arda birkaç kez çalıştırıyorlardı
Böylece 24 bitlik çarpım elde edilebiliyor; fakat gördüğüm kodların çoğu 8 çarpma işlemini peş peşe kullanıyordu ve en yaygın kullanım oyun nesnesi koordinatlarını döndürmek için 2x2 matris çarpımıydı
1970'lerin ortasında hazır 7400 serisi parçalarla yapılmıştı ve en yüksek verimi 5 MIPS idi
Son 20 yılda birkaç kez sabit noktalı aritmetik yapmak zorunda kaldım; önceki nesil programcılara duyduğum saygı arttı
carry lookahead,Kogge-Stone additiongibi teknikleri duymuş olabilirsiniz denilen kısma ek olarak, buradaki Kogge Peter KoggeDoktora çalışmasını Stanford'da yaptı, uzay mekiğiyle ilgili işlerde çalıştı, IBM Fellow unvanına sahip ve ilk çok çekirdekli CPU'yu icat eden kişi
“Çok çekirdekli CPU”nun kendisi, kesin konuşmak gerekirse tek bir icattan çok bir fikir sayılır. Yarı iletken tarihinde belli bir noktaya gelindiğinde oldukça açık ve önemsiz bir fikir de
Çok çekirdekli bir CPU'yu gerçekten çalışır hâle getirmek önemsiz değil; ama o da tekil bir icat değil ve o dönemde geliştirme ekipleri zaten öyle büyümüştü ki, bir kişinin tüm sorunları tek başına çözdüğünü söylemek neredeyse hakaret olur
Kogge ilk çok çekirdekli CPU'nun geliştirilmesine liderlik etmiş olabilir, başkaları mümkün görmeden önce bunu zorlayan bir öncü de olabilir; ama iki durumda da bunu tek başına icat etmiş değil
Bu yaklaşım entelektüel olarak gayet ikna edilebilir. Veriyi merkezi hesaplamaya taşımada gecikme veya maliyet varsa makuldür; bizim durumumuzda da uzay tabanlı sensörler olduğu için bu mantık kurulabiliyordu
Ancak bildiğim kadarıyla bu tür işleme uzay tabanlı işleme sistemlerinde sistematik olarak benimsenmiş değil; radar gibi birçok sistem sensöre yakın donanımda geçici veri azaltma yapıyor
Bu bağlantıyı gösterdiğin için teşekkürler
Yazarıyım. Sorunuz varsa yanıtlarım
x4üx7den çıkarıpx3elde etmek gibi bir şey yapılamıyor, merak ediyorumBir şeyi atlıyor gibiyim
×2, 6x = 8x - 2x kullanılabilecek kadar kolay hesaplanabiliyorsa ve ×4 de 4x = 4x olarak kolayca hesaplanabiliyorsa, 3x'i 2x + 1x toplamı ya da 4x - 1x farkı olarak hesaplamak neden bundan daha zor, anlamıyorum
Ayrıca ×6 herhangi bir şekilde kolayca hesaplanabiliyorsa, o değeri sağa kaydırıp ×3 yapmak neden olmaz, bunu da merak ediyorum. Ek bir adım ama o ek adım yalnızca kaydırma
Her terimin hesaplanması önemsiz olmalı; bu yüzden terimi elde etmek için kaydırma veya işaret değiştirme yapılabilir ama başka bir toplama yapılamaz
Kilit nokta şu: ×3 bir kez önceden hesaplanırsa, daha sonra gereken 22 terimden herhangi birine doğrudan konabilir
Terimin içinde ×2 ve ×1 koyup ×3 oluşturamazsınız. Bunu yapmak her terim için bir başka toplayıcı gerektirir
Başka bir deyişle istediğiniz şey ×3 hesaplayan tek bir devredir, 22 devre değil
×6 sorusuna gelince, bu değer terime negatif ×2 koyup kavramsal olarak bir sonraki basamağa 1 ekleyerek ×8 elde etme biçiminde hesaplanır. Bu ×8 değeri tamamen başka bir terimin parçası olduğundan sağa kaydırılamaz
Sayılar ve toplamlar çok yer değiştirdiği için karmaşık, ama böyle bakınca mantıklı gelecektir
3 ile çarpma aslında yaygın bir işlem; özellikle adres hesaplamada, index’i shift ve toplama ile 3 ile çarpmak sık görülür.
Safça uygulanırsa gecikme epey artar. Ama bu devre kullanılırsa LEA (Load Effective Address) komutu tek çevrimde işlenebildiğinden, bu kadar transistör bütçesini buna ayırmak gayet iyi bir tercihti.
LEA, adresleme modunun hesapladığı adresi o adresten veri taşımak yerine çıktı operandına koyan bir komuttan ibaret; LEA’nın yapabildiği adres hesaplamalarının hepsini MOV komutu da yapabilir.
x86’da MOV veya LEA’nın kullandığı index adresleme modu 3 ölçek katsayısını desteklemez; yalnızca 1, 2, 4, 8 gibi 2’nin kuvvetlerini destekler. Bu yüzden adres üretiminde 3 ile çarpmanın kullanılacağı bir yer yok.
Yazı, 3 ile çarpma biriminin kayan nokta çarpıcısının bir parçası olduğunu açıkça belirtiyor.
“Bu ×3 çarpıcı yaklaşık 9000 transistör içerir; bu da Z80 mikroişlemcisinin tamamından (1976) biraz daha fazladır. ×3 çarpıcının Pentium’un kayan nokta biriminin içindeki kayan nokta çarpıcısının küçük bir parçası olduğunu unutmayın. Yani tek bir işlevin küçük bir parçası, 17 yıl önceki bütün bir mikroişlemciden daha karmaşıktır; bu da işlemci karmaşıklığının ne kadar muazzam arttığını gösterir.”
Bugünkü yazılım şişkinliğini doğuran şey bu performans artış hızı oldu. Çünkü gelecek yılki performans artışı, algoritmaları ve veri akışı bağlamını/yerelliğini eleştirel biçimde düşünmemenin günahlarının çoğunu örtebiliyordu.
Bugün, okuduğum kadarıyla silikon yarı iletken teknolojisi ve mevcut fizik anlayışıyla makul biçimde yapılabilecek şeylerin pratik sınırına ulaşmış durumdayız. Artık sarkaç ters yöne hareket etmeli; bilgisayarlar daha sert değil, daha akıllı çalışmalı.
Ancak yazılım şişkinliğinin daha hızlı büyüdüğünü düşünüyorum.
goto/jmpile komutlara atlama → vtable araması → sözlükte hash alma ve arama → büyük dil modeli çalıştırma“7 ile çarpmak yerine sayının 8 katını ekleyip sayıyı çıkararak 7 katını elde eder. İki adım gerekiyor gibi görünebilir, ancak soldaki basamakta 1 ile fazladan çarpma hilesiyle ek adım olmadan 8 katsayısı elde edilir.”
Bu, ana çarpıcı kısmına sayıyı koymadan önce “bir sonraki basamağa” 1 ekleyen bir toplayıcı olduğu anlamına mı geliyor? Bu da kendi başına elde tahmin devresine benziyor.
Bunun ne zaman gerekli olduğunu da düşündürüyor:
7 = 8-1,6 = 8-2,5 = 8-3,4 = 8-4Son durumda yazı bunun yapıldığını söylemiyor, ama 3 bitlik değerin en yüksek bitine bakarak bir sonraki basamağa 1 eklenip eklenmeyeceğine karar vermek birkaç gate tasarrufu sağlayabilir gibi görünüyor.
×3 devresi gerektiren taban 8 Booth çarpıcısının seçilmiş olması ilginç. Maksimum frekansı artırmak için alan/performans ödünleşimi gibi görünüyor; aynı şey daha fazla pipeline ile de mümkün olabilirdi, demek ki gecikme çevrimi kısıtları varmış.
Pipeline’a almak zor, çünkü çarpma dizisini ikiye bölmek için iyi bir nokta yok.
https://github.com/EI2030/Low-power-E-Paper-OS/blob/master/P...
8086: 29.000
386: 275.000
486: 1,2 milyon
Pentium: 3,1 milyon
Hatırladığım kadarıyla NSA 2000’den sonra bir noktada bu alana girdi.