Bir FPGA bir CPU'dan nasıl daha iyi performans gösterir?


55

Bit madeni para madenciliği, elektronik ticaret ve protein katlama gibi şeyleri yapan sistemlerin performansını artırmak için FPGA kullanan insanların sesini duyuyorum.

Bir CPU, genellikle en az bir büyüklük sırası daha hızlı çalıştığında (saat hızı açısından), bir CPU performansla nasıl rekabet edebilir?


13
FPGA her şeyi bir kerede yapar.
Ignacio Vazquez-Abrams

Yanıtlar:


48

İşlemciler sıralı işlem cihazlarıdır. Bir algoritmayı bir işlem sırasına bölerler ve bunları birer birer uygularlar.

FPGA'lar paralel işlem cihazlarıdır (veya olarak yapılandırılabilir). Tüm bir algoritma, saatin tek bir tıklamasıyla veya en kötü durumda, sıralı bir işlemciden çok daha az saat tıklamasıyla gerçekleştirilebilir. Artan mantık karmaşıklığının maliyetlerinden biri, tipik olarak cihazın saatlenebileceği bir alt sınırdır.

Yukarıdakileri göz önünde bulundurarak, FPGA'lar CPU'nun belirli görevleri yerine getirmesinden daha iyi bir performans sergileyebilirler, çünkü aynı görevi daha düşük bir saat başı olarak da yapabilirler, daha düşük bir toplam saat hızında. Elde edilebilecek kazançlar, algoritmaya oldukça bağımlıdır, ancak en azından bir FFT gibi bir şey için büyüklük sırası atipik değildir.

Ayrıca, bir FPGA'ya birden fazla paralel yürütme birimi oluşturabildiğiniz için, aynı algoritmadan geçmek istediğiniz büyük miktarda bir veriye sahipseniz, verileri paralel yürütme birimleri arasında dağıtabilir ve daha yüksek verim dereceleri elde edebilirsiniz. çok çekirdekli bir işlemciyle bile elde edilebilir.

Avantajlar için ödediğiniz fiyat, güç tüketimi ve $$$'dir.


2
+ 1; Bununla birlikte FPGA'lar CPU'lar kadar dinamik değildir, bu yüzden CPU'lar genellikle PC'ler için daha uygundur
Nick Williams

17
“Avantajlar için ödediğiniz fiyat, güç tüketimi ve $$$”. - Bu genellikle doğrudur, ancak pek çok algoritma için düşük seviye 50 dolarlık bir Xilinx Spartan-6 ile yüksek kaliteli multi-1000 $ 'lık Intel Xeon makinesini kareye sığdırabilirsiniz. Ancak bu genellikle çok fazla mühendislik zaman alır ve yalnızca bir uygulama için çalışan ve değiştirilmesi zor olan çok özel bir tasarımla sonuçlanabilir. Dolayısıyla takas sadece güç ve para değil aynı zamanda algoritma geliştirme zamanı, tekrar kullanılabilirlik ve esnekliktir. (Her ne kadar zaman tartışabilirsin == para.)
14:05

Son cümle hakkında, FPGA'lar CPU'lardan daha düşük güç değil mi? Hem CPU hem de FPGA’lar için geniş bir cihaz yelpazesi vardır, ancak bit madeni para madenciliği için kullanılanlara bakarsak, bu görevler için kullanılan CPU’lar FPGA’lardan çok daha fazla güç aç değildir. Kullanılmış?
David Gardner

4
@David: Bitcoin madenciliği hakkında konuşurken, ilgili metrik vat başına karma sayısıdır. Markt genel güç tüketimi hakkında konuşuyor. Başka bir deyişle, belirli bir FPGA tipik bir CPU'nun 3 katını tüketebilir, ancak Bitcoin madenciliğinde 3 kat daha hızlı olabilir; bu yüzden Bitcoin için bu bir kazanç.
Billy ONeal

2
@Billy: watt başına saniye başına karma sayısı, saniye başına değil.
Paŭlo Ebermann

34

Markt bunu daha çok haklı buluyor, ancak buradaki 2 sentime atıyorum

32 bitlik bir tamsayı içindeki bitlerin sırasını tersine çeviren bir program yazmak istediğimi hayal edin. Bunun gibi bir şey:

int reverseBits(int input) {
    output = 0;
    for(int i = 0;i < 32;i++) {
        // Check if the lowest bit is set
        if(input & 1 != 0) {
            output = output | 1; // set the lowest bit to match in the output!
        }

        input = input >> 1;
        output = output << 1;
    }
    return output;
}

Şimdi benim uygulama zarif değil, ancak bununla ilgili bazı işlemlerin ve muhtemelen bir tür döngü olacağını kabul ettiğinizden eminim. Bu, CPU'da bu işlemi gerçekleştirmek için 1'den fazla döngü harcadığınız anlamına gelir.

Bir FPGA'da bunu basitçe bir çift mandal olarak bağlayabilirsiniz. Verilerinizi bazı kayıt defterlerine alırsınız, sonra ters kayıt düzeninde farklı kayıt defterine aktarırsınız. Bu, işlemin FPGA'daki tek bir saat döngüsünde tamamlanacağı anlamına gelir. Böylece, tek bir döngüde, FPGS genel amaçlı CPU'nuzu tamamlamak için binlerce devir alan bir işlemi tamamladı! Ek olarak, muhtemelen bu kayıtların birkaç yüzünü paralel bağlayabilirsiniz. Bu yüzden birkaç yüz sayıyı FPGA'ya taşıyabilirseniz, tek bir döngüde, hepsi 1 FPGA saat döngüsünde, yüzlerce defa yapılan bu işlemleri yüzlerce kez bitirir.

Genel amaçlı bir CPU'nun yapabileceği birçok şey var, ancak bir sınırlama olarak, bazı görevleri tamamlamak için zorunlu olarak basit talimat listelerine genişletilmesi gereken genelleştirilmiş ve basit talimatlar oluşturduk. Böylece genel amaçlı CPU'nun "32 bit kayıt için ters bit sırası" gibi bir talimatı olmasını ve CPU'ya yeni oluşturduğumuz FPGA ile aynı yeteneği vermesini sağlayabilirim, ancak bu gibi yararlı talimatların sonsuz sayıda vardır, ve böylece sadece popüler işlemcilerin maliyetini garanti edenleri koyun.

FPGA'lar, CPLD'ler ve ASIC'ler size "donanıma sahip AES256 şifreli bayt şifresini çöz" veya "h.264 videonun çerçevesini çözme" gibi çılgın işlemleri tanımlamanıza olanak sağlayan ham donanıma erişmenizi sağlar. Bunların bir FPGA'da birden fazla saat döngüsünün gecikme süresi vardır, ancak işlemi milyonlarca genel amaçlı montaj kodu satırında yazmaktan çok daha verimli bir şekilde uygulanabilir. Bu aynı zamanda, bu işlemlerin çoğu için sabit amaçlı FPGA / ASIC'i daha verimli hale getirme avantajına sahiptir, çünkü çok fazla yabancı iş yapmak zorunda kalmazlar!

Paralellik, işaret eden diğer kısımdır ve bu da önemli olsa da, asıl şey, bir FPGA'nın işlem yapmak için gereken döngüleri bakımından CPU'da zaten pahalı olan bir şeyi paralel hale getirmesidir. "10 FPGA döngüsünde CPU'umu 100.000 döngü alan bir görevi yerine getirebilirim ve bu görevi aynı anda 4 öğede paralel olarak yapabilirim" demeye başladığınızda, bir FPGA'nın neden çok fazla olabileceğini kolayca görebilirsiniz. CPU'dan daha hızlı!

Peki neden FPGA'ları, CPLD'leri ve ASIC'leri her şey için kullanmıyoruz? Çünkü genel olarak, tek işlemden başka hiçbir şey yapmayan bir çiptir. Bu, FPGA / ASIC'inizde birçok büyüklük derecesini daha hızlı çalıştırmak için bir işlem alabilmenize rağmen, bu işlem artık yararlı olmadığında daha sonra değiştiremeyeceğiniz anlamına gelir. Devreye girdikten sonra (genellikle) bir FPGA'yı değiştirememenizin nedeni, arayüz kablolarının sabitlenmesidir ve normalde devre, FPGA'yı daha kullanışlı bir konfigürasyona yeniden programlamanıza izin verecek bileşenler içermez. CPU'nun etkin bir bölümünü "yüklemenize" izin veren bir FPGA gibi yeniden bağlanma / yeniden programlanabilen CPU bölümü bulunan hibrit FPGA-CPU modülleri oluşturmaya çalışan bazı araştırmacılar var,


2
Tersine çevrilen bitlerin (ve diğer tüm bit takas / seçim görevlerinin) örneği gerçekten 1 saat döngüsü almaz, 0 alır. Örnekte, verileri bir mandalda tutmak için 1 saat döngüsü alır ; Aynı işlem. Bitleri ters çevirip çevirmemeniz 1 saat sürer. Bitleri ters çevirme işlemi 0 saat döngüsüdür; ek yükü yok, sadece farklı yönlendirme. Aradaki fark, sadece anlamsal değil, özellikle de bir şeyler eklemeye başladığınızda. Örneğin, 32 bitlik bir sözcüğü 3 bit aşağı kaydırmak, sonra diğer bütün boşlukları değiştirmek ve sonra tersine çevirmek ne kadar sürer?
wjl

1
"hibrit FPGA-CPU modülü" - bunlar uzun süredir piyasadadır ( modern başarılı bir kişi için xilinx.com/products/silicon-devices/soc/zynq-7000/index.htm ), özel destek, yazılım ve HDL'yi birleştirmek, kumaş üzerine FPGA içine yumuşak bir CPU uygulanarak yapılır.
wjl

@wjl İşlemi gerçekleştirmek için teknik olarak herhangi bir döngü gerçekleştirmediğiniz konusunda haklısınız. Örneğinizin sadece anlamsal olarak farklı olduğunu savunuyorum, çünkü bu üç işlemi mantıksal olarak sabit bir bit düzenine çeviriyor (yani b1b2b3b4 ile başlıyorum ve b3b1b4b2 ile bitiyorum). Bu, tüm cevapta benim açımdan bir şeydi. Bir işlemi bir dizi adım olarak tanımlamanın, yalnızca sabit bir komut seti / kapı düzenlemesi olduğunda gerekli olduğunu belirtmeye çalışıyordum.
Kit Scuzz

@wjl: David-gardner'ın soruyu sorduğu soru, "CPU" nun, Intel veya AMD x86 / x86_64'e çok saatli, boru hattıyla ve optimize edilmiş CPU'ya eşdeğer olduğunu söylüyor gibi görünüyor. Pek çok yumuşak "CPU" var, ancak ben bir FPGA'da oturmak için tasarlananların hiçbiri bir i7 gibi saatlenemez, ne de neredeyse optimize edilmiş ya da yetenekli değildir. : Melezler gelince, daha böyle bir şey geliyordu newsroom.intel.com/docs/DOC-1512 görünüşte var yok ki
Kit Scuzz

1
Zynq gerçekten bir işlemciden fena değil (ARM Cortex-A9 - tablet bilgisayarları çalıştıran şey vs.), ancak x86_64 yüksek hızlı entegre bir FPGA'ya sahip olmanın daha harika olacağını kabul ediyorum. =)
wjl 3'14

25

Burada sunulan diğer popüler cevapların tümü FPGA'lar ve CPU'lar arasındaki gerçek farklılıklar hakkında konuşuyor. Bir CPU'nun sıralı yapısına karşı FPGA'nın paralel yapısına işaret ederler veya belirli algoritmaların bir FPGA üzerinde neden iyi çalıştığına dair örnekler verir. Bunların hepsi iyi ve doğru, ancak CPU ve FPGA'lar arasında daha temel bir fark olduğunu söyleyebilirim.

Bir FPGA ve bir CPU arasındaki ortak payda nedir? Her ikisi de silikon üzerine inşa edilmiştir. Ve bazı durumlarda kelimenin tam anlamıyla aynı silikon süreçleri.

Temel fark, o silikonun üstüne yığdığımız soyutlamalar. Bir insanın, tek bir modern CPU tasarımının silikondan paketlenmiş IC'ye kadar olan bütün detaylarını anlaması mümkün değildir. Bu yüzden, mühendislik sürecinin bir parçası olarak, bu karmaşık problemi, insanların kafalarını sarması için daha küçük yönetilebilir problemlere bölüyoruz.

Bu silikonu çalışan bir CPU'ya dönüştürmek için ne gerektiğini düşünün. İşte bu amaç için gerekli olan soyutlama katmanlarının biraz basitleştirilmiş bir görünümü:

  1. Öncelikle silisyumdan transistör oluşturmayı bilen mühendislerimiz var. Gücü kesen ve 10'lu ve hatta 100'lü gigahertz hızında değişen minik transistörlerin nasıl tasarlandığını ve bir IC paketinden ve bir PCB'nin karşısına göndermek için yeterli güce sahip sinyalleri sürdürebilen etli transistörlerin nasıl tasarlandığını biliyorlar. başka bir çip için.

  2. Daha sonra, bu transistörleri yüzlerce farklı mantık hücresi içeren kütüphanelere nasıl biraraya getireceğini bilen dijital mantık tasarımcılarımız var. Mantık kapıları, birkaç isim vermek için floplar, ekler ve ekleyiciler çevirin. Hepsi çeşitli konfigürasyonlarda.

  3. Daha sonra, bu dijital (ve bazen analog) blokları, yüksek hızlı alıcı-vericiler, bellek denetleyicileri, dal tahmin edicileri, ALU, vb.

  4. Ardından, bu fonksiyonel üniteleri eksiksiz bir sistemde bir araya getirerek üst düzey CPU tasarımları yapabilecek CPU tasarımcılarımız var.

Ve orada bitmiyor. Bu noktada, montaj kodunu çalıştıran çalışan bir CPU'muz var ancak bu, çoğu programcının bugünlerde yazdığı bir dil değil.

  1. Montaj kodunu derleyen bir C derleyicimiz olabilir (muhtemelen bazı orta temsiller aracılığıyla)
  2. Nesne yönelimli bir dil elde etmek için C'nin üstüne başka bir soyutlama ekleyebiliriz.
  3. Java bayt kodu gibi şeyleri yorumlayabilmemiz için C veya C ++ üzerine bir Sanal makine bile yazabiliriz.

Ve soyutlama katmanları oradan devam edebilir. Buradaki önemli nokta, bu soyutlama katmanlarının, toplu olarak ölçeklendirilen ve özel bir silikon tasarımının küçük bir kısmını harcayan bir CPU tabanlı sistem üretmek için birleşmesidir.

Bununla birlikte, burada yapılması gereken önemli nokta, her soyutlamanın aynı zamanda kendi başına bir maliyet taşıdığıdır. Transistör tasarımcısı, her kullanım durumu için mükemmel transistörü oluşturmaz. Makul bir kütüphane kuruyor ve bazen eldeki iş için gerçekten gerekenden biraz daha fazla güç ya da biraz daha fazla silikon tüketen bir transistör kullanılıyor. Benzer şekilde, mantık tasarımcıları her olası mantık hücresini oluşturmazlar. 4 giriş NAND geçidi ve 8 giriş NAND geçidi oluşturabilirler, ancak başka bir mühendis 6 giriş NAND'a ihtiyaç duyduğunda ne olur? 8 girişli NAND geçidi kullanıyor ve silikon kaynaklarının kaybedilmesine ve güç kazanmasına neden olan kullanılmayan 2 girişi kapatıyor. Ve böylece soyutlamalar zincirine kadar çıkıyor. Her katman bize karmaşıklığı ele almak için bir yol veriyor.

Şimdi bu soyutlamaları bir FPGA için gerekenlerle karşılaştırın. Temelde, FPGA soyutlamaları yukarıdaki listede 2. sırada durur. FPGA, geliştiricilerin dijital mantık katmanında çalışmasına izin verir. Bundan biraz daha karmaşık çünkü işlemcilerin bu katmanda 'zor kodlanmış' olması ve FPGA'ların çalışma zamanında yapılandırılması gerekiyor (BTW, bu nedenle işlemcilerin genellikle daha yüksek frekanslar çalıştırmasıdır), ancak asıl önemli gerçek şu ki FPGA'lar için CPU'lardan çok az soyutlama var.

Öyleyse, bir FPGA neden bir CPU'dan daha hızlı olabilir? Temelde bunun nedeni FPGA'nın CPU'dan çok daha az soyutlama kullanmasıdır, yani tasarımcı silikona daha yakın çalışır. İşlemciler için gerekli olan tüm soyutlama katmanlarının maliyetini ödemiyor. Daha düşük seviyede kod yazıyor ve belirli bir işlevsellik elde etmek için daha çok çalışması gerekiyor, ancak ödül daha yüksek performans alıyor.

Fakat elbette, daha az soyutlamanın da aşağı tarafı var. Bütün bu CPU soyutlamaları iyi sebeplerden dolayı orada. Bize daha basit bir kodlama paradigması veriyorlar, bu da daha fazla insanın onlar için kolayca geliştirebileceği anlamına geliyor. Bu da, var olan daha birçok CPU tasarımı olduğu ve dolayısıyla CPU'lardan çok büyük fiyat / ölçek / piyasaya zaman avantajımız olduğu anlamına gelir.

Yani orada var. FPGA'lar daha az soyutlamaya sahiptir ve bu nedenle daha hızlı ve daha verimli olabilirler ancak programlanması zor olabilir. İşlemciler, geliştirilmeleri kolay, ölçeklenebilir ve ucuz olmaları için birçok soyutlama tasarımına sahiptir. Ancak bu avantajlar için ticarette hız ve güçten vazgeçerler.


Ayrıca, FPGA'lar basit mantıksal görevleri yerine getirmek için basit tekrarlayan bloklar kullanılarak tasarlanmıştır. Bazı görevler için özel olarak üretilirler. İşlemciler, OTOH, hepsi farklı şeyler yapan birçok karmaşık işlevsel parçaya sahiptir. Bir CPU'nun farklı FPGA benzeri cihazlardan oluşan bir grup olduğu düşünülebilir (sonuçta hepsi silikon, elektronik ve matematik). Yani sadece soyutlamalar ile ilgili değil, karmaşıklıkla ilgili. CPU'lar, birçok farklı elektrikli cihaz türünden oluşan karmaşık cihazlardır; FPGA ise birkaç cihazdan oluşur. Bir FPGA tüfek iken CPU bir av tüfeğidir.
AbstractDissonance

21

Diğer cevapların hepsi doğru olsa da, hiçbiri henüz sizin sorunuza göre bitcoin madenciliği örneğini ele almıyor, ki bu gerçekten iyi bir örnek. Bitcoin madenciliği, elde edilen karma belirli özelliklere sahip olana kadar yalnızca tek bir 32-bit tamsayı değiştiği verinin başka bir SHA-256 hesaplamasının sonucu olan SHA-256 şifreleme hash fonksiyonunu tekrar tekrar hesaplamayı içerir. Her SHA-256, 32-bit ilaveler, bit-kaymalar ve biraz daha bit-işleme operasyonlarını içeren aynı algoritmanın 64 tekrarından oluşur.

Bu döngüyü 32 bit (veya daha fazla) bir CPU'da programlarsanız, komut setini görev için çok uygun bulacaksınız --- SHA-256 CPU'larda verimli çalışacak şekilde tasarlanmıştır. Yine de, modern CPU'nun silikon alanının sadece% 2'sini, önbellekleme, çarpma, bölme, kayan nokta operasyonu, dallanma ve dallanma tahmini vb. Gibi alan yoğun işlevlere sahip olacaksınız. Bu özel görev için performans artışı.

Bir FPGA gibi yapılandırılabilir donanımda, yalnızca% 2'yi uygular ve kod yürütme hakkındaki her şeyi unutarak daha da optimize edersiniz, bu sık sık tekrarlanan alt işlevlerin her birini doğrudan hesaplamak için kapılar tasarlamayı tercih edersiniz. Her biri, bir sonraki her bir saat çubuğuna bir sonuç verecek ve 128 kez tekrarlanan (ve her SHA-256'nın başladığı ve bittiği özel bir ek mantıkla), her saat döngüsünde bir sonuç elde edeceğiniz şekilde boru hattı çizildi. Bundan daha basit bir mantıkla 300 MHz'yi desteklediği ilan edilen bir FPGA'da saniyede 100 milyon karma) modern bir CPU'da, çekirdek başına her birkaç bin saatte bir bir saniyede bir sonuç beklediğiniz söylenebilir; -GHz CPU.

Bu özel örnekte sizi ilgilendirmez ise, benim ilişkili bir göz atmak istersin cevap birçok FPGA madenciler ısmarlama donanım daha yapılandırılabilir yerine kullanılarak aynı şekilde çalışır, çünkü bitcoin.stackexchange üzerinde ASIC madencilerin donanımları hakkında. Sadece bütünlük uğruna: Birden fazla bağımsız SHA-256 hasheri kullanarak daha önemsiz bir paralelleştirme lehine tarif ettiğim boru hattını sınırlamak veya önlemek gibi başka olasılıklar var. FPGA'nizin dahili ve toplam büyüklüğü tarafından verilen kısıtlamalara bağlı olarak, sadece bir FPGA'nın yapılandırmasını değil, tüm yongayı tasarlama konusunda mükemmel bir özgürlüğe sahip olsaydınız, kapı sayımı ve yönlendirme açısından daha az verimli olmasına rağmen daha iyi performans sağlayabilir. .


3
Bu silikon kullanımı hakkında çok iyi bir nokta.
markt

Ancak, bir FPGA'nın birçok fiziksel kapılı karmaşık hücrelerden oluştuğunu düşünen belki de (istemeden!) Yanıltıcı olan, tipik bir uygulamanın sadece bir kesir kullandığı ve üreticilerin eşdeğer geçitlerin reklamını yapmalarına olanak tanıyan sayıları bunun bir "tipik" uygulamasında
piramitler

3

Yukarıdaki cevaplar doğru olsa da, neden FPGA'ların (ve özel ASIC'lerin) bitcoin hesaplamaları için özellikle iyi olduğu konusunu özledim.

Gerçek avantaj, SHA-256 hesaplamalarının büyük bir kısmının kablolamada yapılabilecek mantıksal işlemler (örneğin, bit kayması) olmasıdır. Bu şekilde yapıldığında, 0 saat döngüsü gerektirirler.

Bir diğer önemli avantaj, FPGA'ların CPU'lardan çok daha fazla güç tasarruflu (yani Watt başına MIPS) olmasıdır, bu yüzden hesaplamalar için gereken enerji miktarı çok daha azdır. Bu önemlidir çünkü bir bitcoin madenciliğinin maliyeti, onu yapmak için ne kadar elektrik kullandığınıza bağlıdır.

ASIC yongaları FPGA'lardan daha fazla enerji tasarrufu sağlar, dolayısıyla aynı kodu çok daha ucuza çalıştırabilirler. Ayrıca daha hızlı hale getirmek için gemideki daha fazla yürütme birimini tıkayabilirsiniz. Dezavantajı, özel bir ASIC yapmanın maliyetinin çok yüksek olmasıdır, bu yüzden üretim maliyetini karşılamak için epeyce cips satmanız gerekir.

GPU'lar, aynı zamanda bitcoin yapmak için de kullanılıyor, ancak çok daha az enerji harcadıkları için FPGA'lara ve özel ASIC'lere zemin kaybediyorlar.


Monero karma algoritması aka cryptonight'a bakarsanız, rastgele erişilmesi gereken yüksek miktarda bellek nedeniyle (2MB) bir FPGA uygulamasının imkansız olduğunu göreceksiniz. Bir CPU'nun bu durumda avantajı var.
lucas92,
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.