我聽說有人使用FPGA來改善諸如比特幣開採,電子交易和蛋白質折疊之類的系統的性能。
當CPU運行速度通常至少快一個數量級(就時鐘速度而言)時,FPGA如何與CPU競爭?
我聽說有人使用FPGA來改善諸如比特幣開採,電子交易和蛋白質折疊之類的系統的性能。
當CPU運行速度通常至少快一個數量級(就時鐘速度而言)時,FPGA如何與CPU競爭?
CPU是順序處理設備。它們將一種算法分解為一系列操作,並一次執行一個。
FPGA是(或可以配置為)並行處理設備。整個算法可能在單個時鐘滴答中執行,或者在最壞的情況下,其時鐘滴答要比順序處理器少。邏輯複雜度增加的代價之一通常是設備時鐘的下限。
考慮到以上幾點,FPGA可以勝任CPU的某些任務,因為它們可以執行相同的任務。更少的時鐘滴答聲,儘管總體時鐘速率較低。可以實現的增益在很大程度上取決於算法,但是對於FFT之類的而言,至少不是一個數量級是非典型的。
此外,因為您可以在FPGA中構建多個並行執行單元,如果您要通過相同的算法傳遞大量數據,則可以跨並行執行單元分配數據,並獲得比甚至多核CPU更高的吞吐量。 p>
您為此付出的代價是功耗和$$$。
Markt基本上是正確的,但是我在這裡投入2美分:
想像一下,我告訴你我想寫一個程序來反轉a內的位順序。 32位整數。像這樣:
int reverseBits(int input){output = 0; for(int i = 0; i < 32; i ++){//檢查是否設置了最低位if(input & 1!= 0){輸出=輸出| 1; //將最低位設置為與輸出匹配! }輸入=輸入>> 1;輸出=輸出<< 1; }返回輸出;}
現在,我的實現並不優雅,但是我敢肯定,您同意這樣做會涉及到一些操作,並且可能還會存在某種循環。這意味著在CPU中,您花費了不止一個週期來實現此操作。
在FPGA中,您可以將其簡單地連接為一對鎖存器。您將數據放入某個寄存器,然後以相反的位順序將其連接到另一個寄存器中。這意味著該操作將在FPGA中的單個時鐘週期內完成。因此,FPGS在一個週期內完成了一項操作,該操作使您的通用CPU花費了數千個週期才能完成!此外,您可以並行連接這些寄存器中的幾百個。因此,如果您可以將數百個數移入FPGA,那麼在一個週期內,它將在數百個FPGA時鐘週期內完成數百次數千次操作。
通用CPU可以做很多事情,但是作為限制,我們設置了通用和簡單指令,這些指令必須擴展為簡單指令列表才能完成某些任務。因此,我可以使通用CPU擁有“ 32位寄存器的反向位順序”之類的指令,並賦予CPU與我們剛剛構建的FPGA相同的功能,但是卻有無限數量的此類有用指令,因此我們FPGA,CPLD和ASIC都使您可以訪問原始硬件,這使您可以定義瘋狂的操作,例如“使用解密AES256加密字節”。鍵”或“解碼h.264視頻的幀”。它們在FPGA中具有超過一個時鐘週期的等待時間,但是與以數百萬行的通用彙編代碼寫出操作相比,它們可以以更加高效的方式實現。這還具有使許多此類操作的固定用途FPGA / ASIC更加節能的優勢,因為它們不必做過多的工作!
並行性是另一個重要的部分指出,儘管這也很重要,但是最主要的是,FPGA並行化執行操作所需的周期時,CPU中已經很昂貴的內容。一旦您開始說“我可以在10個FPGA週期中執行一個任務,這需要花費我的CPU 100,000個週期,並且我一次可以並行執行4個任務,”您就可以很容易地理解為什麼FPGA可能會佔用大量資源比CPU快!
那麼,為什麼我們不使用FPGA,CPLD和ASIC?因為通常它是一個完整的芯片,只執行一個操作就不做任何事情。這意味著,儘管您可以使一個過程在FPGA / ASIC中更快地運行多個數量級,但是當該操作不再有用時,您將無法在以後對其進行更改。一旦插入電路中就不能(通常)更改FPGA的原因是接口的佈線是固定的,並且通常電路中不包含允許您重新對FPGA進行更有用配置的組件。有一些研究人員試圖構建混合的FPGA-CPU模塊,其中一部分CPU像FPGA一樣可以進行重新連接/重新編程,從而允許您“裝載” CPU的有效部分,但是這些都不是據我所知曾經將它推向市場。
這裡給出的所有其他流行答案都討論了FPGA和CPU之間的字面差異。他們指出了FPGA的並行特性與CPU的順序特性,或給出了為什麼某些算法在FPGA上可以很好地工作的示例。所有這些都是正確的,但是我建議CPU和FPGA之間存在更根本的區別。
FPGA和CPU之間的共同點是什麼?它們都建立在矽片上。在某些情況下,實際上是相同的矽工藝。
根本的區別是我們堆積在矽片上的抽象。從矽到封裝IC,一個人不可能理解一個現代CPU設計的全部細節。因此,作為工程過程的一部分,我們將復雜的問題分為較小的可管理的問題,人類可以將其包裹住。
請考慮將該矽片轉變為可正常運行的CPU所需的條件。下面是實現該目標所需的抽象層的簡化視圖:
首先,我們有工程師知道如何用矽製造晶體管。他們知道如何設計功率為10兆赫茲或什至100吉赫茲的微型晶體管,它們可以汲取功率並進行開關,並且他們知道如何設計強大的晶體管,這些晶體管可以以足夠的功率驅動信號,以將其發送出IC封裝並通過PCB
然後,我們有數字邏輯設計人員,他們知道如何將這些晶體管放到具有數百個不同邏輯單元的庫中。邏輯門,觸發器,多路復用器和加法器僅舉幾例。全部具有多種配置。
接下來,我們會有各種工程師組成的小組,他們知道如何將這些數字(有時是模擬)塊放在一起,以形成更高級別的功能塊,例如高速收發器,存儲控制器,分支預測變量,ALU等。
然後,我們有CPU設計人員通過將這些功能單元整合到一個完整的系統中來架構高端CPU設計。
而且還不止於此。此時,我們有一個運行中的CPU,它可以運行彙編代碼,但這不是大多數程序員如今使用的語言。
,並且抽象層可以從那裡繼續。這裡重要的一點是,這些抽象層相結合,產生了一個基於CPU的系統,該系統可以大規模擴展,並且只佔定制矽設計的一小部分。
但是,這裡要指出的重要一點是,每個抽象本身也要承擔成本。晶體管設計人員並沒有為每個用例構建完美的晶體管。他建立了一個合理的庫,因此有時使用的晶體管比實際完成工作所需的功率或矽要多一些。同樣,邏輯設計人員不會構建所有可能的邏輯單元。他們可能會構建4輸入NAND門和8輸入NAND門,但是當另一位工程師需要6輸入NAND時會發生什麼呢?他使用一個8輸入NAND門,並束縛了2個未使用的輸入,這導致了矽資源的浪費和電力不足。因此,它沿著抽象鏈上升。每層都為我們提供了一種處理複雜性的方法,但同時又向我們收取了矽和功耗方面的額外增量成本。
現在將這些抽象與FPGA所需的抽象進行比較。本質上,FPGA抽像在以上列表中的#2處停止。 FPGA使開發人員可以在數字邏輯層工作。比這要復雜得多,因為在這一層上對CPU進行了“硬編碼”,並且必須在運行時配置FPGA(順便說一句,這就是為什麼CPU通常以更高的頻率運行),但是最重要的重要事實是,事實遠非如此FPGA的抽像要比CPU少。 ,這意味著設計人員離矽片更近了。他沒有支付CPU所需的所有許多抽象層的費用。他的編碼水平較低,必須付出更多的努力才能實現給定的功能,但是他可以獲得更高的性能。 。所有這些CPU抽像都有充分的理由。它們為我們提供了更為簡單的編碼範例,這意味著更多的人可以輕鬆地為他們開發。反過來,這意味著存在更多的CPU設計,因此,我們從CPU中獲得了巨大的價格/規模/上市時間收益。
因此,您擁有了它。 FPGA具有更少的抽象,因此它們可以更快,更節能,但難以編程。 CPU具有許多抽象設計,以使其易於開發,可擴展且廉價。但是他們為獲得這些利益放棄了交易的速度和力量。
儘管其他答案都是正確的,但它們都還沒有解決您所提問題中的比特幣挖掘示例,這確實是一個不錯的示例。比特幣挖礦涉及重複計算密碼散列函數(即另一SHA-256計算結果的SHA-256),其中只有單個32位整數發生變化,直到生成的散列具有某些屬性為止。每個SHA-256由相同算法的64次重複組成,涉及32位加法,移位和更多位處理操作。
如果在32位(或更多)CPU上編程此循環,您會發現它的指令集非常適合該任務-SHA-256旨在在CPU上高效運行。仍然,您將僅使用現代CPU矽面積的2%,具有諸如緩存,乘法,除法,浮點運算,分支和分支預測等面積密集型功能,這些功能根本沒有使用或無法提供顯著的功能。
在像FPGA這樣的可配置硬件中,您只需實現這2%,然後通過忘記所有有關代碼執行的方式來進一步優化,而是設計門以直接計算其中的每一個重複的子功能。經過流水線處理,以便每個時鐘週期將結果傳遞到下一個時鐘週期,並重複128次(以及每個SHA-256開始和結束的一些特殊附加邏輯),最終每個時鐘週期都會得到結果(可能在標榜為比其簡單的邏輯上支持300 MHz的FPGA上,每秒可散發1億個哈希),而在現代CPU上,每核每千個時鐘週期可得到一個結果,例如,在多核多核-GHz CPU。
如果您對這個特定示例感興趣,您可能想看看我有關bitcoin.stackexchange上ASIC礦工內部的相關答案,因為許多FPGA礦工都在同一工作使用可配置而非定制硬件的方式。僅出於完整性考慮:還有其他可能性,例如限製或避免流水線,我通過使用多個獨立的SHA-256哈希來支持更為瑣碎的並行化。依靠FPGA內部及其總尺寸的限制,即使您在設計整個芯片(而不只是FPGA的配置)方面擁有完全的自由度時,門數和佈線開銷的效率也會降低,甚至可以提供更好的性能。
上面的答案雖然正確,但是卻忽略了為什麼FPGA(和定制ASIC)特別適合比特幣計算的觀點。
真正的優勢在於,SHA-256計算的很大一部分是可以在接線中完成的邏輯運算(例如,移位)。這樣,它們需要0個時鐘週期。
另一個重要的優點是,FPGA的功耗效率(即,每瓦MIPS)比CPU要高得多,因此計算所需的能量要大得多。減。這一點很重要,因為挖掘比特幣的成本取決於您用來製造比特幣的電量。您還可以在板上添加更多執行單元,以使其更快。缺點是製造定制ASIC的成本很高,因此您需要出售相當多的芯片來支付製造成本。
GPU也用於製造比特幣,但由於它們是能源效率低得多,它們已經在FPGA和定制ASIC方面失去了基礎。