Donanım bölümü neden çarpmadan çok daha uzun sürüyor?


37

Donanım bölümü neden bir mikrodenetleyicideki çarpmadan daha uzun sürüyor? Örneğin, bir dsPIC'de bölme 19 döngü alırken çarpma sadece bir saat döngüsü alır.

Vikipedi'de Bölüm algoritması ve Çarpma algoritması dahil olmak üzere bazı derslerden geçtim . İşte benim akıl yürütmem.

Vikipedi'de geri yükleme ile yavaş bir bölme yöntemi gibi bir bölünme algoritması, tekrarlı bir algoritmadır. Bu, (orta) adımdan elde edilen sonuçların, adımlara kgirdi olarak kullanıldığı k+1, bu algoritmaların paralel olamayacağı anlamına gelir. Bu nedenle, nbölünmeyi tamamlamak için en azından bir döngü gerekir, oysa nbir temettüdeki bit sayısıdır. 16-bit temettüler için bu, en az 16 devire eşittir.

Bir çarpım algoritmasının özyinelemeli olması gerekmez; bu, paralel hale getirmenin mümkün olduğu anlamına gelir. Bununla birlikte, birçok farklı çarpma algoritması vardır ve mikrodenetleyiciler tarafından kullanılabilecek bir fikrim yok. Çarpma donanım / mikrokontrolörde nasıl çalışır?

Bitirmek için sadece bir saat süren bir Dadda çarpanı algoritması buldum . Ancak burada anlamadığım, Dadda'nın algoritmasının üç adımda ilerlediği, adım 1'den gelen sonuçların 2. adımda vb. Kullanıldığı. Buna göre, bunun tamamlanması en az üç saat döngüsü alacaktır.


2
Algoritma, gerçekten saat döngüsü sayısını tanımlamıyor. Özel CPU'nuz, dahili uygulamadan bağımsız olarak bir döngüde veya 20 döngüde çalışan bir donanım çarpanı / bölücüsüne sahip olabilir.
Eugene Sh.

1
OP, hakkında konuştuğun 19-1 döngü hakkında daha fazla bilgi veren bir link verebilir misin? DSP'niz hakkında özel bir şey.
Vladimir Cravero

1
Cevaplar için teşekkürler. İşte mikrodenetleyicim için bir veri sayfası: ww1.microchip.com/downloads/en/DeviceDoc/70005127c.pdf . Bkz. Talimat setine genel bakış, sayfa 292. Tüm DIV talimatlarının 18 döngü, tüm MUL komutları sadece 1 döngü sürdüğünü söylüyor. Ancak yalnızca bu MCU için yaygın değildir, bunu diğer birçok MCU'da gördüm.
Marko Gulin

2
@Curd, peki, hepsi aynı, öyle değil mi? Benim için. Tahmin edebileceğin kadar iyi gösterdiğini sanmıyorum.
TonyM

1
Diğer bir faktör ekonomi ve kullanım kalıplarıdır. Çoğu kullanım bölme işleminden çok daha sık çoğalır. Geniş bir silikon alanını nispeten seyrek olarak kullanılacak olan daha hızlı bir donanım bölme işlevine adamak, düşük ekonomidir. Daha küçük ve daha ucuz bir çip yapmak veya ekstra mantığı daha üretken bir şekilde kullanmak daha iyidir. BTW minibilgisayarlarla başladığımda, bölme her zaman bir talimat değildi. Bazı makinelerde karekök gibi bir yazılım kütüphanesi çağrısıydı.
nigel222

Yanıtlar:


34

Bir bölücü, tipik donanıma çok daha az zarif bir şekilde eşlenir. Kafes ICE40 FPGA'ları örnek olarak alın.

İki durumu karşılaştıralım: bu 8x8 bit - 16 bit çarpanı:

module multiply (clk, a, b, result);
   input clk;
   input [7:0]a;
   input [7:0]b;
   output [15:0]result;
   always @(posedge clk)
     result = a * b;
endmodule // multiply

ve 8 ve 8 bit işlenenleri 8 bit sonucuna indirgeyen bu bölücü:

module divide(clk, a, b, result);
   input clk;
   input [7:0] a;
   input [7:0] b;
   output [7:0] result;
   always @(posedge clk)
     result = a / b;
endmodule // divide

(Evet, biliyorum, saat vermez do şey)

Haritalama oluşturulan şematik genel bir bakış çarpanı bir ICE40 FPGA bulunabilir burada ve bölücü burada .

Yosys'in sentez istatistikleri:

çarpmak

  • Tel sayısı: 155
  • Tel bit sayısı: 214
  • Genel kablo sayısı: 4
  • Genel tel bit sayısı: 33
  • Anı sayısı: 0
  • Bellek bit sayısı: 0
  • İşlem sayısı: 0
  • Hücre sayısı: 191
    • SB_CARRY 10
    • SB_DFF 16
    • SB_LUT4 165

bölmek

  • Tel sayısı: 145
  • Tel bit sayısı: 320
  • Genel kablo sayısı: 4
  • Kamu tel bit sayısı: 25
  • Anı sayısı: 0
  • Bellek bit sayısı: 0
  • İşlem sayısı: 0
  • Hücre sayısı: 219
    • SB_CARRY 85
    • SB_DFF 8
    • SB_LUT4 126

Tam genişlikli bir çarpan ve azami bölünen bölücü için üretilen verilog boyutunun o kadar da yüksek olmadığını belirtmekte fayda var. Bununla birlikte, aşağıdaki resimlere bakacaksanız, çarpanın 15 derecelik bir derinliğe sahip olduğunu göreceksiniz, oysa ki bölücü daha 50 gibi görünüyor; kritik yol (yani çalışma sırasında meydana gelebilecek en uzun yol) hızı tanımlayan şeydir!


Yine de görsel bir izlenim elde etmek için bunu okuyamazsınız. Karmaşıklıktaki farklılıkların tespit edilebileceğini düşünüyorum. Bunlar tek çevrim çarpanı / bölücüler!

Çarpmak

Bir ICE40 ile çarp (uyarı: ~ 100 Mpixel image)

Çarpanın ölçekli görüntüsü

bölmek

( Bir ICE40'ta bölme ) (uyarı: ~ 100 Mpixel image)

Bölücünün ölçekli görüntüsü


4
hayır, bunları yinelemeli olarak uygulayabilirsiniz. Ancak geçerli sonuçların mantık yoluyla "dalgalanması" biraz zaman alacak. Yukarıdaki uygulamalar yinelemeli değildir.
Marcus Müller

9
Bölücünün duvar posterini istiyorum.
Ian Howson

5
Şimdi çarpma işleminde bir PDF var . 3378 × 3177 mm, bu yüzden lütfen bunu yatak odasının tavanına yerleştirmeden önce, önemli olanınızla konuşun.
Marcus Müller

2
100 megapiksellik görüntüleriniz etkileyicidir, ancak yapmaya çalıştığınız nokta için çok fazla önemsemezler ve bu sayfayı telefon ya da tablet gibi sınırlı hafızalı bir cihazda görüntülemeye çalışan herkes için büyük sorunlara neden olurlar. Görüntüleri satır içi olarak görüntülemek istiyorsanız, daha düşük çözünürlüklü bir önizleme üretmenin bir yolunu bulun.
Dave Tweed

4
Hey, bu graphviz grafikler çeneni kapattı, yo!
Spencer Williams

8

Yavaş bölünme doğal olarak yinelemelidir, bu yüzden daha uzun sürebilir. Arama tablolarını kullanarak, basitlerinden biraz daha hızlı yavaş bölme algoritmaları vardır. SRT algoritması, döngü başına iki bit üretir. Böyle bir tablodaki bir hata, rezil Pentium FDIV böceğinin nedenidir (yaklaşık 1994). Sonra hızlı bölünme algoritmaları var.

Elbette, prensipte, iki sayının çarpımını veya çarpımını hesaplamak için basit bir devasa bir tablo kullanabilirsiniz ve bu sayede tek bir döngüde sonuç alabilirsiniz, ancak bu sayı başına bit sayısı arttıkça hızlı bir şekilde pratik değildir.


Fakat sonuçta - bölme algoritmaları çarpma algoritmalarından farklı olarak paralelleştirilemez ve bu yüzden bu kadar yavaşlar mı?
Marko Gulin

2
@MarkoGulin "yapamaz" çok güçlü bir iddiadır. Kesinlikle kolay değil.
Spehro Pefhany

2
Sanırım, bunu “bölme algoritmaları paralelleştirilemez” den “zayıflatmayı bulduğumuz yollarla bölmeyi uygulayan donanım üzerinde paralelleştirilmiş çarpmadan daha fazla zorlayıcı” olduğunu zayıflatabileceğinizi düşünüyorum. Sphero, n-bit sayılarını çarpmak için O (2 ^ n) geçitlerini kullanarak tek çevrim bölünmesi nasıl yapıldığına bir örnek verir ... ama bu pratik değil.
Cort Ammon

1
Uzun bölme, bölenle çarpıldığında, 1000 ... xxxx şeklinin bir sonucunu veren yaklaşık bir karşılıklılık hesaplayarak paralellikten herhangi bir dereceden faydalanabilir. Her adımda sonucun N bitini hesaplamak.
supercat,

8

Saat döngüsü başına birden fazla mantık katmanına sahip olabiliriz, ancak bu katmanların ne kadar karmaşık olabileceği tam olarak kaç mantık katmanının saat hızımıza ve yarı iletken işlemimize bağlı olacağı konusunda bir sınırlama vardır.

Bununla birlikte, birçok farklı çarpma algoritması vardır ve mikrodenetleyiciler tarafından kullanılabilecek bir ipucum yok.

Bilgisayarlardaki çoğu çarpma işleminden sonra, ikili uzun çarpımın bir türevi kullanılır. İkili uzun çarpma içerir

  • Bir işlenenin çeşitli farklı miktarlarda kaydırılması
  • İkinci işlenene göre kaydırılan sayıları maskeleme
  • Maskeleme sonuçlarının bir araya getirilmesi.

Öyleyse bunu donanımda uygulamaya bir göz atalım.

  • Değişim sadece işleri nasıl bağladığımızla ilgili bir şey, bu yüzden bedava geliyor.
  • Maskeleme AND kapıları gerektirir. Bu bir mantık katmanı anlamına gelir, yani zaman açısından ucuzdur.
  • İlave, bir taşıma zincirine olan ihtiyaç nedeniyle nispeten pahalıdır. Neyse ki kullanabileceğimiz bir numara var. Biri üretmek için iki sayı eklemek yerine toplama aşamalarının çoğu için iki tane üretmek için üç sayı ekleyebiliriz.

Bu yüzden ballpark'a 16 bitlik sonuçlarla 8x8 çarpanı için kaç tane mantık aşamasına ihtiyacımız var. Basit olması için, ara sonuçların hepsinin tüm konumlarda bitleri olmadığı gerçeği için optimizasyon yapmadığımızı varsayalım.

Diyelim ki tam bir toplayıcı iki "geçit safhasında" uygulanıyor.

  • 1 ara sonuç elde etmek için maskeleme için 1.
  • 2, 8 ara sonucu 6’ya düşürmek için üç sayılı gruplar eklemek için
  • 2 6 ara sonucu 4’e düşürmek için üç sayılı gruplar eklemek için
  • 2, 4 ara sonucu 3’e düşürmek için üç numaradan oluşan bir grup eklemek için
  • 2, 3 ara sonucu 2'ye düşürmek için üç numaradan oluşan bir grup eklemek için
  • 32 final iki sonucu eklemek için.

Yani yaklaşık 46 mantık aşaması toplamı. Çoğu, son iki ara sonucun eklenmesi için harcanmaktadır.

Bu, tüm ara sonuçların tüm bitlerin (temel olarak dada çarpanının yaptığı gibi) mevcut olmadığı gerçeğinden yararlanılarak, son adım için bir taşıma gözetleme toplayıcısı kullanılarak daha da geliştirilebilir. İki üretmek için 3 yerine 3 yerine 7 sayı ekleyerek (daha fazla ve daha fazla kapının fiyatındaki aşama sayısını azaltmak) vb.

Hepsi küçük detaylar olsa da, önemli olan nokta, iki n bit sayıyı çarpmak ve 2n bit sonuç üretmek için gereken aşama sayısının kabaca n ile orantılı olmasıdır.


Öte yandan, bölme algoritmalarına bakarsak, hepsinin nerede yinelemeli bir süreç olduğunu görürüz.

  1. Bir yinelemede yapılması, önceki yinelemenin sonuçlarına bağlıdır.
  2. Bir yinelemeyi uygulamak için gereken mantık aşamalarının sayısı kabaca n ile orantılıdır (çıkarma ve karşılaştırma, karmaşıklık açısından toplama işlemine çok benzerdir)
  3. yineleme sayısı da n ile kabaca orantılıdır.

Dolayısıyla, bölmeyi uygulamak için gereken mantık aşaması sayısı n kare ile kabaca orantılıdır.


Cevabınız için teşekkür ederim. Wiki'de, Dadda'nın algoritmasının donanımda bu algoritmayı uygulamak için gereken sayıda kapı söz konusu olduğunda çok verimli olduğunu okudum. Buna rağmen, çoğu donanım "ikili uzun çarpma" kullanıyor mu?
Marko Gulin

1
Dada'nın algotihm'i ikili uzun çarpımın optimize edilmiş bir versiyonudur.
Peter Green,

1 / x bölme yapmak için 8 döngü yazarım. Daha sonra bunu 16 döngü sabit bir maliyet karşılığında 8 döngü çarpımına karşı kullanıyorum.
b degnan

Bu güzel bir şekilde, çarpma işleminin nihayetinde toplama işleminden çok daha kötü olmadığını göstermektedir.
Hagen von Eitzen

1
Bir yineleme, O (NlgN) donanımını kullanarak O (lgN) aşamalarında veya O (N) donanımını kullanarak O (sqrt (N)) aşamalarında yapılabilen bir çıkartma gerektirir. Ancak esas nokta, çarpma işleminin O (İNG) aşamaları gerektirmesi, bölmenin ise O (NlgN) aşamaları gerektirmesidir. O (N * N) değil, ancak adım başına daha fazla iş yapılmasına izin verecek şekilde yaklaşık bir karşılık alarak başlamazsa O (N) faktörü ile çarpmadan daha büyüktür.
supercat,

4

Bir saat algoritması (aslında herhangi bir algoritma) bir saat döngüsünde yapılabilir. Ekstra transistörlerin ücretini ödemeye istekliyseniz ve izin verilen saat ücretini düşürdüğünüzde.

Var olan bir çok döngülü bölme algoritmasının bir saat döngüsünü uygulayan bir dizi kapınız olduğunu varsayalım. Algoritmayı tek döngü yapmak için, bir sonraki aşamayı besleyen bir aşamanın çıktısı ile donanımın (aşamaları algoritmanın bir aşamasında kullanılana benzer) birden çok aşaması kullanın.

Elbette bu şekilde yapmamamızın nedeni, çok sayıda transistör kullanmasıdır. Örneğin, 16 bitlik bir bölüm için yaklaşık 16 kat daha fazla transistör kullanabilir. Aynı zamanda daha fazla kapı kademesine sahip olmak izin verilen maksimum saat frekansını düşürür (çünkü daha fazla ilerleme gecikmesi aşaması vardır).


4

Pratik bölme algoritmalarının tümü bölüme yakınlaşan sayısal süitlere dayanır.

  • Bölüme 2 ^ N ekleyerek veya kaldırarak çalışan ve buna bağlı olarak 2 ^ N * Divizörü sıfıra dönene kadar kısmi kalanlara ekleyen veya kaldıran, geri yükleme yapmayan veya SRT olarak ilave yöntemler vardır.

  • Newton-Raphson veya Goldshmidth gibi çarpma yöntemleri, bölmenin çarpma işleminin tersi olarak hesaplandığı kök bulma yöntemleridir.

Katkı yöntemleri, döngü başına bir veya birkaç bit verir. Çarpımsal yöntemler, her bir döngü için bit sayısını iki katına çıkarır, ancak genellikle sabit bir tabloyla elde edilen bir başlangıç ​​yaklaşımına ihtiyaç duyar.

"Yavaş" ve "hızlı" mezhepler yanıltıcıdır, çünkü gerçek hız bit sayısına bağlıdır, fonksiyona ne kadar donanım ayrılmıştır (ve hızlı çarpan çok büyüktür) ...

Bölme, çarpma işleminden daha yavaştır çünkü hesaplamak için doğrudan, paralel bir yöntem yoktur: Yinelemeyi kaskadlı (veya boru hattı) bloklar halinde uygulamak için ya bir yineleme vardır veya donanım kopyalanır.


0

Donanım bölümü neden bir mikrodenetleyicideki çarpmadan daha uzun sürüyor?

Bu elektronik bir soru değil. En iyi ihtimalle bir bilgisayar sorusudur, Yığın Taşması ile daha iyi ele alınmalıdır.

Bkz. Örneğin, burada: Çarpma, kayan bölme bölmesinden daha mı hızlı?

Gerçekte, bu bir Gerçek Hayat sorusudur: Bölüşme neden çarpmadan daha uzun sürüyor?

Kağıt üzerinde hangisini hesaplamayı tercih edersiniz?

51 * 82

veya

4182 / 51

Bölünme çarpma işleminden daha uzun sürer , çünkü yapılması daha zordur .

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.