Am auzit de oameni care folosesc FPGA pentru a îmbunătăți performanța sistemelor care fac lucruri precum extragerea de monede bit, tranzacționarea electronică și plierea proteinelor.

Cum poate un FPGA să concureze cu un procesor în ceea ce privește performanța atunci când CPU rulează de obicei cel puțin un ordin de mărime mai rapid (în termeni de viteză de ceas)?

Comentarii

  • FPGA face totul dintr-o dată.

Răspuns

CPU „S sunt dispozitive de procesare secvențială. Ele împart un algoritm într-o secvență de operații și le execută pe rând.

FPGA sunt (sau pot fi configurate ca) dispozitive de procesare paralele. Un întreg algoritm ar putea fi executat într-o singură bifă a ceasului sau, în cel mai rău caz, cu mult mai puține bifuri de ceas decât este nevoie de un procesor secvențial. Unul dintre costurile pentru complexitatea logică crescută este de obicei o limită inferioară la care dispozitivul poate fi tactat.

Ținând cont de cele de mai sus, FPGA-urile pot depăși performanța CPU-urilor care îndeplinesc anumite sarcini, deoarece pot face aceeași sarcină în mai puține bifuri de ceas, deși la o rată de ceas globală mai mică. Câștigurile care pot fi obținute depind în mare măsură de algoritm, dar cel puțin o ordine de mărime nu este atipică pentru ceva de genul unui FFT.

Mai mult, deoarece puteți construi mai multe unități de execuție paralele într-un FPGA, dacă aveți un volum mare de date pe care doriți să le treceți prin același algoritm, puteți distribui datele pe unitățile de execuție paralele și puteți obține alte ordine de mărime cu un debit mai mare decât se poate realiza chiar și cu un procesor multi-core.

Prețul pe care îl plătiți pentru avantaje este consumul de energie și $$$ „s.

Comentarii

  • +1; totuși FPGA nu sunt la fel de dinamice ca procesoarele, motiv pentru care procesatoarele sunt de obicei mai potrivite pentru PC-uri
  • ” Prețul pe care îl plătiți pentru avantaje este consumul de energie și $$$ ‘ s. ” – Acest lucru este adesea adevărat, dar puteți bate în mod clar o mașină de ultimă generație Intel Xeon multi- $ 1000 cu un low-end 50 $ Xilinx Spartan-6 pentru mulți algoritmi. Dar acest lucru necesită de obicei mult timp tehnic și s-ar putea să ajungeți la un design foarte personalizat, care funcționează doar pentru o singură aplicație și este greu de schimbat. Deci, compromisul nu este doar putere și bani, ci timpul de dezvoltare a algoritmului, reutilizarea și flexibilitatea. (Deși puteți argumenta timpul == bani.)
  • markt, despre ultima propoziție, nu sunt ‘ t FPGA-urile cu o putere mult mai mică decât CPU-urile? Există o gamă largă de dispozitive atât pentru procesoare, cât și pentru FPGA-uri, dar dacă ne uităm la cele care sunt folosite pentru lucruri precum extragerea de monede de biți, nu sunt ‘ t CPU-urile utilizate pentru acele are sarcini mult mai înfometate decât FPGA-urile care ar fi utilizate?
  • @David: Când vorbim despre mineritul Bitcoin, valoarea relevantă este numărul de hashuri pe watt. Markt vorbește despre consumul total de energie. Adică, un FPGA dat poate consuma de 3 ori puterea unui procesor tipic, dar poate fi mult mai mult de 3 ori mai rapid la extragerea Bitcoin; deci pentru Bitcoin care ‘ câștigă.
  • @Billy: numărul de hash pe watt · secundă, nu pe watt.

Răspuns

Markt are acest lucru în mare parte corect, dar o să arunc 2 cenți aici:

Imaginați-vă că v-am spus că doresc să scriu un program care să inverseze ordinea biților din interiorul unui număr întreg de 32 de biți. Ceva de genul acesta:

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; } 

Acum implementarea mea nu este elegantă, dar sunt sigur că sunteți de acord că ar exista un număr de operații implicate în a face acest lucru și probabil un fel de buclă. Aceasta înseamnă că, în procesor, ați petrecut mai mult de 1 ciclu pentru a implementa această operațiune.

Într-un FPGA, puteți pur și simplu să conectați acest lucru ca o pereche de zăvoare. Vă introduceți datele într-un anumit registru, apoi le conectați în registrul diferit în ordine de biți inversă. Aceasta înseamnă că operațiunea se va finaliza într-un singur ciclu de ceas în FPGA. Astfel, într-un singur ciclu, FPGS a finalizat o operație care a dus la procesarea generală a procesorului dvs. cu multe mii de cicluri! În plus, puteți conecta probabil câteva sute din aceste registre în paralel. Deci, dacă puteți muta câteva sute de numere pe FPGA, într-un singur ciclu va finaliza acele mii de operații de sute de ori, toate într-un ciclu de ceas FPGA.

Există multe lucruri pe care o CPU general poate face, dar ca o limitare, configurăm instrucțiuni simple și generalizate care trebuie să se extindă în mod necesar în liste de instrucțiuni simple pentru a finaliza unele sarcini. Aș putea face ca CPU-ul cu scop general să aibă o instrucțiune de genul „ordine de biți inversă pentru registrul de 32 de biți” și să dau procesorului aceeași capacitate ca FPGA pe care tocmai l-am construit, dar există un număr infinit de astfel de instrucțiuni utile posibile, așa că introduceți doar cele care justifică costul în procesoarele populare.

FPGA-urile, CPLD-urile și ASIC-urile vă oferă acces la hardware-ul brut, care vă permite să definiți operațiuni nebunești, cum ar fi „decriptați AES256 octeți criptate cu cheie” sau „decodificați cadrele video h.264”. Acestea au latențe de mai mult de un ciclu de ceas într-un FPGA, dar pot fi implementate în moduri mult mai eficiente decât scrierea operațiunii în milioane de linii de cod de asamblare de uz general. Acest lucru are, de asemenea, avantajul de a face FPGA / ASIC cu scop fix pentru multe dintre aceste operații mai eficiente din punct de vedere al consumului de energie, deoarece nu trebuie să facă la fel de multă muncă străină!

Paralelismul este cealaltă parte care marcht a subliniat și, deși acest lucru este important, principalul lucru este când un FPGA paralelizează ceva care era deja scump în CPU în ceea ce privește ciclurile necesare pentru a efectua operațiunea. Odată ce ați început să spuneți „Pot efectua în 10 cicluri FPGA o sarcină care necesită procesorului meu 100.000 de cicluri și pot face această sarcină în paralel cu 4 articole la un moment dat, „puteți vedea cu ușurință de ce un FPGA ar putea fi mult mai rapid decât un procesor!

Deci de ce nu folosim FPGA, CPLD și ASIC pentru orice? Pentru că, în general, este un cip întreg care nu face altceva decât o singură operație. Aceasta înseamnă că, deși puteți obține un proces pentru a rula mai multe ordine de mărime mai repede în FPGA / ASIC, nu îl puteți schimba mai târziu atunci când acea operațiune nu mai este utilă. Motivul pentru care nu puteți (în general) să schimbați o FPGA o dată într-un circuit este faptul că cablajul pentru interfață este fix și, în mod normal, circuitul nu include componente care vă vor permite să reprogramați FPGA într-o configurație mai utilă. Există unii cercetători care încearcă să construiască module hibride FPGA-CPU, unde există o secțiune a procesorului care este capabilă să fie recablată / reprogramată ca un FPGA, permițându-vă să „încărcați” o secțiune eficientă a procesorului, dar niciuna dintre acestea am ajuns vreodată pe piață (din câte știu).

Comentarii

  • Pentru exemplul inversării biților (și a tuturor celorlalți biți activități de swap / selecție) ‘ nu durează cu adevărat 1 ciclu de ceas, este nevoie de 0. În exemplul dvs., este nevoie de 1 ciclu de ceas pentru a stoca date într-un zăvor , care nu este aceeași operație. Este nevoie de un ciclu de ceas indiferent dacă inversați biții sau nu. Operațiunea de inversare a biților este de 0 cicluri de ceas; nu există cheltuieli generale, doar rutare diferită. Diferența nu este doar semantică, mai ales atunci când începeți să adăugați lucruri. De exemplu, cât durează să mutați un cuvânt pe 32 de biți în jos cu 3 biți, apoi să schimbați fiecare altă ciugulire, apoi să o inversați?
  • ” hibrid FPGA-CP Modulul U ” – acestea sunt pe piață de mult timp (consultați xilinx.com/products/silicon-devices/ soc / zynq-7000 / index.htm pentru unul modern de succes), dar chiar și fără suport special, combinarea software-ului & HDL se face de obicei prin implementarea unui CPU moale în interior FPGA pe material.
  • @wjl ‘ ai dreptate că tehnic nu necesită cicluri pentru a efectua operația în sine. Aș argumenta că exemplul dvs. este diferit doar din punct de vedere semantic, mai ales pentru că efectuarea acestor trei operații se traduce logic într-un tipar de biți fix (adică încep cu b1b2b3b4 și termin cu b3b1b4b2). Acesta a fost punctul meu de vedere în întregul răspuns. Încercam să subliniez că descrierea unei operații ca o serie de pași este adesea necesară doar atunci când aveți un set de instrucțiuni fix / aranjament de poartă.
  • @wjl: felul în care David-Gardner a pus întrebarea, el pare să spună că ” CPU ” este echivalent cu un procesor Intel sau AMD x86 / x86_64 cu un procesor extrem de tactat, cu conducte și optimizat. Există multe ” procesoare soft „, dar nici unul dintre cele concepute să stea într-un FPGA nu poate fi tactat ca un i7 și nici nu sunt sunt aproape la fel de optimizați sau capabili. În ceea ce privește hibrizii, am înțeles mai mult așa ceva: newsroom.intel.com/docs/DOC-1512 care aparent există
  • Zynq într-adevăr nu este ‘ nu prea rău de un procesor (ARM Cortex-A9 – același lucru care rulează computerele tabletă etc.), dar sunt de acord că ar fi mult mai minunat să ai un FPGA integrat cu o viteză mare x86_64. =)

Răspuns

Toate celelalte răspunsuri populare prezentate aici vorbesc despre diferențele literale dintre FPGA și CPU. Ele subliniază natura paralelă a FPGA față de natura secvențială a unui CPU sau dau exemple de ce anumiți algoritmi ar putea funcționa bine pe un FPGA. Toate acestea sunt bune și adevărate, dar aș sugera totuși că există o diferență mai fundamentală între procesoare și FPGA.

Care este numitorul comun dintre un FPGA și un procesor? Este că ambele sunt construite pe siliciu. Și, în unele cazuri, literalmente aceleași procese de siliciu.

Diferența fundamentală constă în abstractizările pe care le adunăm deasupra acelui siliciu. Nu este posibil ca un om să înțeleagă detaliile complete ale unui singur design modern de CPU, de la siliciu la IC ambalat. Deci, ca parte a procesului de inginerie, împărțim acea problemă complexă în probleme mai mici de gestionat, pe care oamenii le pot înfășura.

Luați în considerare ce este nevoie pentru a transforma acel siliciu într-un procesor funcțional. Iată o vedere oarecum simplificată a straturilor de abstractizare necesare pentru acest obiectiv:

  1. Mai întâi avem ingineri care știu cum să creeze tranzistoare din siliciu. Ei știu cum să proiecteze tranzistoare mici care consumă puterea și comută la o rată de 10 sau chiar 100 de gigahertz și știu cum să proiecteze tranzistoare puternice care pot conduce semnale cu suficientă putere pentru a le trimite dintr-un pachet IC și pe un PCB la un alt cip.

  2. Apoi avem designeri de logică digitală care știu cum să pună tranzistorii la biblioteci cu sute de celule logice diferite. Porți logice, flip flops, mux-uri și addere, pentru a numi câteva. Toate într-o varietate de configurații.

  3. În continuare, avem diverse grupuri de ingineri care știu cum să pună blocurile digitale (și uneori analogice) laolaltă pentru a forma blocuri funcționale de nivel superior, precum transceivere de mare viteză, controlere de memorie, predictori de ramuri, ALU etc.

  4. Apoi, avem designeri de CPU care arhitecturează design-uri CPU de ultimă generație, trasând împreună acele unități funcționale într-un sistem complet.

Și nu se oprește aici. În acest moment avem un CPU funcțional care rulează codul de asamblare, dar acesta nu este un limbaj pe care majoritatea programatorilor îl scriu în zilele noastre.

  1. S-ar putea să avem un compilator C care să compileze la asamblare cod (probabil printr-o reprezentare intermediară)
  2. Am putea adăuga o altă abstracție deasupra lui C pentru a obține un limbaj orientat obiect
  3. S-ar putea chiar să scriem o mașină virtuală deasupra lui C sau C ++ astfel încât să putem interpreta lucruri precum codul de octeți Java

Și straturile de abstractizare pot continua de acolo. Punctul important aici este că acele straturi de abstracție se combină pentru a produce un sistem bazat pe CPU care escalează masiv și costă o mică parte dintr-un design personalizat din siliciu.

Oricum, punctul important care trebuie subliniat aici este că fiecare abstractizare are, de asemenea, un cost în sine. Proiectantul tranzistorului nu construiește tranzistorul perfect pentru fiecare caz de utilizare. El construiește o bibliotecă rezonabilă, așa că uneori se folosește un tranzistor care consumă puțin mai multă energie sau puțin mai mult siliciu decât este cu adevărat necesar pentru treaba la îndemână. Și în mod similar, proiectanții logici nu construiesc fiecare celulă logică posibilă. Ar putea construi o poartă NAND cu 4 intrări și o poartă NAND cu 8 intrări, dar ce se întâmplă atunci când un alt inginer are nevoie de o intrare NAND cu 6 intrări? El folosește o poartă NAND cu 8 intrări și leagă 2 intrări neutilizate, ceea ce duce la pierderea resurselor de siliciu și la puterea de talie. Și astfel urcă în lanțul abstractizărilor. Fiecare strat ne oferă o modalitate de a gestiona complexitatea, dar în același timp ne încarcă un cost suplimentar suplimentar în termeni de siliciu și putere.

Comparați acum aceste abstracții cu ceea ce este necesar pentru un FPGA. În esență, abstracțiile FPGA se opresc la locul 2 în lista de mai sus. FPGA permite dezvoltatorilor să lucreze la nivelul logicii digitale. Este oarecum mai sofisticat decât atât, deoarece procesoarele sunt „codate greu” la acest strat, iar FPGA-urile trebuie să fie configurate în timpul rulării (ceea ce, BTW, este motivul pentru care CPU-urile rulează frecvențe mult mai mari), dar adevărul esențial important este că acestea sunt departe puține abstracții pentru FPGA decât pentru procesoare.

Deci, De ce poate un FPGA să fie mai rapid decât un CPU? În esență, este pentru că FPGA folosește mult mai puține abstracții decât un procesor, ceea ce înseamnă că proiectantul lucrează mai aproape de siliciu. El nu plătește costurile tuturor straturilor de abstractizare necesare pentru procesoare. Codifică la un nivel inferior și trebuie să lucreze mai mult pentru a obține un anumit bit de funcționalitate, dar recompensa primește performanțe mai mari.

Dar, desigur, există un aspect negativ și pentru mai puține abstracții. Toate aceste abstracții CPU sunt acolo pentru un motiv întemeiat. Ele ne oferă o paradigmă de codificare mult mai simplă, ceea ce înseamnă că mai mulți oameni se pot dezvolta cu ușurință pentru ei. La rândul său, asta înseamnă că există multe mai multe modele de CPU existente și, prin urmare, avem beneficii masive de preț / scară / timp până pe piață de la procesoare.

Deci, acolo îl aveți. FPGA-urile au mai puține abstracții și astfel pot fi mai rapide și mai eficiente din punct de vedere energetic, dar greu de programat. CPU-urile au multe abstracții pentru a le face ușor de dezvoltat, scalabile și ieftine. Dar renunță la viteză și putere în comerț pentru aceste beneficii.

Comentarii

  • De asemenea, FPGA ‘ s sunt proiectate folosind blocuri repetitive simple, care urmează să efectueze sarcini logice simple. Sunt personalizate pentru anumite tipuri de sarcini.CPU ‘ s, OTOH, au multe părți funcționale complexe, toate făcând lucruri diferite. S-ar putea considera că un procesor este un grup de multe dispozitive asemănătoare FPGA (la urma urmei, ‘ este doar siliciu, electronică și matematică). Deci, ‘ nu este doar despre abstracții, ci ‘ este despre complexitate. CPU ‘ sunt dispozitive complexe formate din multe tipuri diferite de dispozitive electrice, în timp ce un FPGA este format din câteva. Un procesor este o pușcă în timp ce un FPGA este o pușcă.

Răspuns

În timp ce celelalte răspunsuri sunt toate corecte , niciuna dintre ele nu abordează încă exemplul minier bitcoin din întrebarea dvs., care este într-adevăr un exemplu decent. Minarea Bitcoin implică calcularea în mod repetat a unei funcții hash criptografice, SHA-256 a rezultatului unui alt calcul SHA-256, a datelor în care se schimbă doar un singur număr întreg de 32 de biți, până când hash-ul rezultat are anumite proprietăți. Fiecare SHA-256 constă din 64 de repetări ale aceluiași algoritm care implică adăugări pe 32 de biți, schimbări de biți și alte operații de manipulare a biților.

Dacă programați această buclă pe un procesor pe 32 de biți (sau mai mult) , veți găsi setul de instrucțiuni foarte potrivit pentru sarcină — SHA-256 a fost conceput pentru a rula eficient pe procesoare. Totuși, veți folosi doar 2% din zona de siliciu a unui procesor modern, cu funcționalitate intensivă, cum ar fi stocarea în cache, multiplicarea, divizarea, operația în virgulă mobilă, ramificarea și predicția brachului etc., fie neutilizate deloc, fie incapabile să oferiți o creștere semnificativă a performanței pentru această sarcină specială.

În hardware configurabil, cum ar fi un FPGA, pur și simplu implementați doar acele 2% și optimizați în continuare uitând totul despre executarea codului, mai degrabă proiectând porți pentru a calcula direct fiecare dintre acele subfuncții deseori repetate. Într-o conductă astfel încât fiecare dintre ele să treacă un rezultat în următorul ciclu de ceas și să fie repetată de 128 de ori (și cu o logică suplimentară specială în care fiecare SHA-256 începe și se termină), veți obține un rezultat la fiecare ciclu de ceas (pentru poate 100 de milioane de hashuri pe secundă pe un FPGA anunțat pentru a suporta 300 MHz pe o logică mai simplă decât aceasta) în timp ce pe un procesor modern, vă puteți aștepta la un rezultat la fiecare câteva mii de cicluri de ceas pe nucleu, să zicem 10 milioane de hash pe sec. apoi pe un procesor multi-core multi-GHz.

Dacă acest exemplu particular vă interesează, vă recomandăm să aruncați o privire la răspundeți despre internele minerilor ASIC pe bitcoin.stackexchange, deoarece mulți mineri FPGA funcționează în același mod folosind hardware configurabil și nu personalizat. Doar pentru completare: există alte posibilități, cum ar fi limitarea sau evitarea liniei de conducte pe care am descris-o în favoarea unei paralelizări mai banale prin utilizarea mai multor hashere SHA-256 independente. Depinzând de constrângerile date de internele FPGA și de dimensiunea sa totală , care poate oferi chiar și performanțe mai bune, deși ar fi mai puțin eficient din punct de vedere al numărului de porți și al rutei, dacă ai avea libertatea perfectă în proiectarea întregului cip, nu doar configurația FPGA.

Comentarii

  • Că ‘ este un punct foarte bun despre utilizarea siliciului.
  • Dar poate (neintenționat!) înșelător, având în vedere că un FPGA constă din celule oarecum complexe, cu multe porți fizice, dintre care o aplicație tipică folosește din nou doar o fracțiune, permițând producătorilor lor să facă publicitate numărului de porți echivalente, în încercarea de a vă spune cât de mult ar putea valoriza toate acestea într-un ” tipic ” cerere …

Răspuns

Răspunsurile de mai sus, deși corecte, pierd ideea despre de ce FPGA-urile (și ASIC-urile personalizate) sunt deosebit de bune pentru calculele bitcoin.

Avantajul real este că o proporție mare din calculele SHA-256 sunt operații logice (de exemplu, schimbări de biți) care pot fi realizate în cablare. Când se realizează astfel, necesită 0 cicluri de ceas.

Un alt avantaj important este că FPGA-urile sunt mult mai eficiente din punct de vedere energetic (adică MIPS pe Watt) decât procesoarele, deci cantitatea de energie necesară pentru calcule este mult Mai puțin. Acest lucru este important, deoarece costul exploatării unui bitcoin depinde de câtă energie electrică folosiți pentru a-l face.

Cipurile ASIC sunt mai eficiente din punct de vedere energetic decât FPGA-urile, astfel încât să poată executa același cod mult mai ieftin. De asemenea, puteți înghesui mai multe unități de execuție la bord pentru a le face mai rapide. Dezavantajul este că costul realizării unui ASIC personalizat este foarte mare, așa că ar trebui să vindeți destul de multe jetoane pentru a acoperi costul de fabricație.

GPU-urile sunt utilizate și pentru fabricarea bitcoinelor, dar din moment ce sunt mult mai puțin eficiente din punct de vedere energetic au pierdut teren în fața FPGA-urilor și ASIC-urilor personalizate.

Comentarii

  • Dacă vă uitați la algoritmul de hash Monero, denumit și cryptonight, veți vedea că o implementare FPGA este aproape imposibilă din cauza cantității mari de memoria necesară accesării aleatorii (2 MB). Un procesor are avantajul în acest caz.
  • @ lucas92 nu puteți integra RAM în FPGA pentru a găzdui cantitatea de memorie necesară?
  • Probabil ați câștigat ‘ t are suficiente elemente logice în FPGA pentru aceasta.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *