Bagaimana FPGA mengungguli CPU?


55

Saya mendengar orang menggunakan FPGA untuk meningkatkan kinerja sistem yang melakukan hal-hal seperti penambangan bit-koin, perdagangan elektronik, dan pelipatan protein.

Bagaimana FPGA dapat bersaing dengan CPU pada kinerja ketika CPU biasanya menjalankan setidaknya urutan besarnya lebih cepat (dalam hal kecepatan clock)?


13
FPGA melakukan semuanya sekaligus.
Ignacio Vazquez-Abrams

Jawaban:


48

CPU adalah perangkat pemrosesan berurutan. Mereka memecah algoritma menjadi urutan operasi dan menjalankannya satu per satu.

FPGA adalah (atau, dapat dikonfigurasi sebagai) perangkat pemrosesan paralel. Seluruh algoritme dapat dieksekusi dalam satu tick tunggal jam, atau, kasus terburuk, tick tick clock jauh lebih sedikit daripada yang dibutuhkan prosesor berurutan. Salah satu biaya untuk kompleksitas logika yang meningkat biasanya batas bawah di mana perangkat dapat clock.

Mengingat hal di atas, FPGA dapat mengungguli CPU dalam melakukan tugas-tugas tertentu karena mereka dapat melakukan tugas yang sama dalam waktu yang lebih singkat, meskipun pada laju jam keseluruhan yang lebih rendah. Keuntungan yang dapat dicapai sangat tergantung pada algoritma, tetapi setidaknya urutan besarnya tidak sama untuk sesuatu seperti FFT.

Lebih lanjut, karena Anda dapat membangun beberapa unit eksekusi paralel menjadi FPGA, jika Anda memiliki volume data yang besar yang ingin Anda lewati algoritma yang sama, Anda dapat mendistribusikan data di seluruh unit eksekusi paralel dan mendapatkan pesanan lebih lanjut dengan throughput yang lebih tinggi daripada yang bisa dicapai bahkan dengan CPU multi-core.

Harga yang Anda bayar untuk keuntungannya adalah konsumsi daya dan $$$.


2
+1; Namun FPGA tidak seinamis CPU, itulah sebabnya CPU biasanya lebih cocok untuk PC
Nick Williams

17
"Harga yang Anda bayar untuk keuntungannya adalah konsumsi daya dan $$$." - Ini sering benar, tetapi Anda dapat mengalahkan mesin Intel Xeon multi-$ 1000 bernilai tinggi dengan Xilinx Spartan-6 low-end untuk banyak algoritma. Tapi itu biasanya membutuhkan banyak waktu rekayasa dan Anda mungkin berakhir dengan desain yang sangat khusus yang hanya berfungsi untuk satu aplikasi dan sulit untuk diubah. Jadi tradeoffnya bukan hanya kekuatan dan uang, tetapi waktu pengembangan algoritma, usabilitas ulang dan fleksibilitas. (Meskipun Anda dapat berdebat waktu == uang.)
wjl

markt, tentang kalimat terakhirmu, bukankah daya FPGA jauh lebih rendah daripada CPU? Ada berbagai perangkat untuk CPU dan FPGA, tetapi jika kita melihat yang digunakan untuk hal-hal seperti penambangan bit-koin, bukankah CPU yang digunakan untuk tugas-tugas itu jauh lebih haus daya daripada FPGA yang akan bekas?
David Gardner

4
@ David: Ketika berbicara tentang penambangan Bitcoin, metrik yang relevan adalah jumlah hash per watt. Markt berbicara tentang konsumsi daya secara keseluruhan. Artinya, FPGA yang diberikan dapat mengkonsumsi 3x kekuatan CPU yang khas, tetapi lebih dari 3x lebih cepat di penambangan Bitcoin; jadi untuk Bitcoin itu adalah kemenangan.
Billy ONeal

2
@Billy: jumlah hash per watt · detik, bukan per watt.
Paŭlo Ebermann

34

Markt memiliki ini sebagian besar benar, tetapi saya akan membuang 2 sen saya di sini:

Bayangkan saya mengatakan kepada Anda bahwa saya ingin menulis sebuah program yang membalik urutan bit di dalam integer 32-bit. Sesuatu seperti ini:

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

Sekarang implementasi saya tidak elegan, tapi saya yakin Anda setuju bahwa akan ada sejumlah operasi yang terlibat dalam melakukan ini, dan mungkin semacam loop. Ini berarti bahwa dalam CPU, Anda telah menghabiskan lebih dari 1 siklus untuk mengimplementasikan operasi ini.

Dalam FPGA, Anda bisa memasang ini sebagai sepasang kait. Anda memasukkan data Anda ke dalam register, lalu Anda mengirimkannya ke register berbeda dalam urutan bit terbalik. Ini berarti bahwa operasi akan selesai dalam satu siklus clock tunggal dalam FPGA. Dengan demikian, dalam satu siklus, FPGS telah menyelesaikan operasi yang mengambil CPU tujuan umum Anda ribuan siklus untuk menyelesaikan! Selain itu, Anda dapat memasang mungkin beberapa ratus register ini secara paralel. Jadi jika Anda dapat memindahkan beberapa ratus angka ke FPGA, dalam satu siklus akan menyelesaikan ribuan operasi itu ratusan kali lipat, semua dalam 1 siklus clock FPGA.

Ada banyak hal yang dapat dilakukan oleh CPU dengan tujuan umum, tetapi sebagai batasan, kami membuat instruksi umum dan sederhana yang perlu diperluas ke daftar instruksi sederhana untuk menyelesaikan beberapa tugas. Jadi saya dapat membuat CPU tujuan umum memiliki instruksi seperti "urutan bit terbalik untuk register 32 bit" dan memberikan CPU kemampuan yang sama dengan FPGA yang baru saja kami buat, tetapi ada jumlah tak terbatas dari instruksi berguna yang mungkin, dan kami hanya memasukkan yang membutuhkan biaya dalam CPU populer.

FPGA, CPLD, dan ASIC semuanya memberi Anda akses ke perangkat keras mentah, yang memungkinkan Anda untuk menentukan operasi gila seperti "mendekripsi byte terenkripsi AES256 dengan kunci" atau "bingkai decode video h.264". Ini memiliki latensi lebih dari satu siklus clock dalam FPGA, tetapi mereka dapat diimplementasikan dalam cara yang jauh lebih efisien daripada menuliskan operasi dalam jutaan baris kode perakitan tujuan umum. Ini juga memiliki manfaat menjadikan FPGA / ASIC tujuan-tetap untuk banyak operasi ini lebih hemat daya karena mereka tidak harus melakukan banyak pekerjaan asing!

Paralelisme adalah bagian lain yang menunjukkan, dan sementara itu penting juga, hal utama adalah ketika FPGA memparalelkan sesuatu yang sudah mahal dalam CPU dalam hal siklus yang diperlukan untuk melakukan operasi. Setelah Anda mulai mengatakan "Saya dapat melakukan dalam 10 siklus FPGA tugas yang membutuhkan CPU 100.000 siklus saya, dan saya dapat melakukan tugas ini secara paralel 4 item sekaligus," Anda dapat dengan mudah melihat mengapa FPGA bisa menjadi hal yang banyak. lebih cepat dari CPU!

Jadi mengapa kita tidak menggunakan FPGA, CPLD, dan ASIC untuk semuanya? Karena secara umum itu adalah seluruh chip yang tidak melakukan apa pun kecuali satu operasi. Ini berarti bahwa meskipun Anda bisa mendapatkan proses untuk menjalankan banyak pesanan lebih besar di FPGA / ASIC Anda, Anda tidak dapat mengubahnya nanti ketika operasi itu tidak lagi berguna. Alasan Anda tidak dapat (secara umum) mengubah FPGA setelah berada dalam suatu rangkaian adalah karena kabel untuk antarmuka telah diperbaiki, dan biasanya rangkaian tersebut tidak menyertakan komponen yang memungkinkan Anda memprogram ulang FPGA menjadi konfigurasi yang lebih bermanfaat. Ada beberapa peneliti yang mencoba membangun modul hybrid FPGA-CPU, di mana ada bagian dari CPU yang mampu dirancang ulang / diprogram ulang seperti FPGA, memungkinkan Anda untuk "memuat" bagian efektif dari CPU,


2
Untuk contoh membalikkan bit (dan semua tugas swap / pemilihan bit lainnya) tidak benar-benar membutuhkan 1 siklus clock, dibutuhkan 0. Dalam contoh Anda, dibutuhkan 1 siklus clock untuk menyimpan data dalam kait , yang bukan merupakan operasi yang sama. Dibutuhkan 1 clock cycle apakah Anda membalikkan bit atau tidak. Operasi membalikkan bit adalah 0 siklus clock; tidak ada overhead, hanya routing yang berbeda. Perbedaannya bukan hanya semantik, terutama ketika Anda mulai menambahkan sesuatu. Misalnya, berapa lama waktu yang diperlukan untuk mengubah kata 32-bit menjadi 3 bit, lalu menukar setiap gigitan lainnya, lalu membalikkannya?
wjl

1
"hybrid FPGA-CPU module" - ini telah ada di pasaran sejak lama (lihat xilinx.com/products/silicon-devices/soc/zynq-7000/index.htm untuk yang sukses modern), tetapi bahkan tanpa dukungan khusus, menggabungkan perangkat lunak & HDL umumnya dilakukan dengan menerapkan CPU lunak di dalam FPGA pada fabric.
wjl

@ wjl Anda benar bahwa secara teknis tidak memerlukan siklus untuk melakukan operasi itu sendiri. Saya berpendapat bahwa contoh Anda hanya berbeda secara semantik, sebagian besar karena melakukan tiga operasi secara logis diterjemahkan ke dalam pola bit tetap (yaitu saya mulai dengan b1b2b3b4 dan saya akhiri dengan b3b1b4b2). Ini adalah poin saya di seluruh jawaban. Saya mencoba menunjukkan bahwa menggambarkan operasi sebagai serangkaian langkah sering hanya diperlukan ketika Anda memiliki set instruksi / pengaturan gerbang yang tetap.
Kit Scuzz

@wjl: Cara david-gardner mengajukan pertanyaan, ia tampaknya mengatakan "CPU" setara dengan Intel atau AMD x86 / x86_64 CPU yang sangat clock, pipeline, dan dioptimalkan. Ada banyak "CPU" lunak, tetapi saya tidak ada yang dirancang untuk duduk di FPGA dapat clock seperti i7, juga tidak hampir dioptimalkan atau mampu. Adapun hibrida, saya lebih berarti seperti ini: newsroom.intel.com/docs/DOC-1512 yang tampaknya memang ada
Kit Scuzz

1
Zynq benar-benar tidak terlalu buruk dari prosesor (ARM Cortex-A9 - hal yang sama yang menjalankan komputer tablet, dll), tapi saya setuju akan jauh lebih hebat untuk memiliki FPGA terintegrasi dengan x86_64 kecepatan tinggi. =)
wjl

25

Semua jawaban populer lainnya yang disajikan di sini berbicara tentang perbedaan literal antara FPGA dan CPU. Mereka menunjukkan sifat paralel dari FPGA vs sifat berurutan dari sebuah CPU, atau memberikan contoh mengapa algoritma tertentu mungkin bekerja dengan baik pada FPGA. Semua itu bagus dan benar, tetapi saya menyarankan bahwa ada perbedaan yang lebih mendasar antara CPU dan FPGA.

Apa persamaan umum antara FPGA dan CPU? Keduanya dibuat di atas silikon. Dan dalam beberapa kasus secara harfiah proses silikon yang sama.

Perbedaan mendasar adalah abstraksi yang kita susun di atas silikon itu. Tidak mungkin bagi satu manusia untuk memahami detail lengkap dari desain CPU modern tunggal dari silikon ke IC yang dikemas. Jadi sebagai bagian dari proses rekayasa kami membagi masalah kompleks menjadi masalah yang lebih kecil yang dapat dikelola manusia sehingga dapat membungkus kepala mereka.

Pertimbangkan apa yang diperlukan untuk mengubah silikon itu menjadi CPU yang berfungsi. Inilah pandangan yang agak disederhanakan dari lapisan abstraksi yang diperlukan untuk tujuan itu:

  1. Pertama, kami memiliki insinyur yang tahu cara membuat transistor dari silikon. Mereka tahu bagaimana merancang transistor kecil yang menyedot daya dan beralih pada tingkat 10 atau bahkan 100-an gigahertz, dan mereka tahu bagaimana merancang transistor gemuk yang dapat menggerakkan sinyal dengan daya yang cukup untuk mengirim mereka keluar dari paket IC dan melintasi PCB ke chip lain.

  2. Kemudian kami memiliki perancang logika digital yang tahu bagaimana menempatkan transistor-transistor itu ke perpustakaan dengan ratusan sel logika yang berbeda. Gerbang logika, sandal jepit, muxes, dan adders, untuk beberapa nama. Semua dalam berbagai konfigurasi.

  3. Selanjutnya kita memiliki berbagai kelompok insinyur yang tahu bagaimana menempatkan blok-blok digital (dan kadang-kadang analog) untuk membentuk blok fungsional tingkat tinggi seperti transceiver kecepatan tinggi, pengontrol memori, prediktor cabang, ALU, dll.

  4. Kemudian kami memiliki perancang CPU untuk merancang desain CPU kelas atas dengan menyatukan unit-unit fungsional tersebut ke dalam sistem yang lengkap.

Dan itu tidak berhenti di situ. Pada titik ini kami memiliki CPU yang berfungsi yang menjalankan kode assembly tetapi itu bukan bahasa yang kebanyakan programmer tulis hingga saat ini.

  1. Kami mungkin memiliki kompiler C yang mengkompilasi ke kode assembly (mungkin melalui beberapa representasi perantara)
  2. Kita bisa menambahkan abstraksi lain di atas C untuk mendapatkan bahasa berorientasi objek
  3. Kita bahkan dapat menulis mesin Virtual di atas C atau C ++ sehingga kita dapat menginterpretasikan hal-hal seperti kode byte Java

Dan lapisan abstraksi dapat melanjutkan dari sana. Poin penting di sini adalah bahwa lapisan-lapisan abstraksi bergabung untuk menghasilkan sistem berbasis CPU yang skala besar-besaran dan biaya sebagian kecil dari desain silikon kustom.

NAMUN, poin penting yang harus dibuat di sini adalah bahwa setiap abstraksi juga membawa biaya itu sendiri. Perancang transistor tidak membangun transistor yang sempurna untuk setiap kasus penggunaan. Dia membangun perpustakaan yang masuk akal, dan kadang-kadang sebuah transistor digunakan yang menghabiskan daya lebih sedikit atau sedikit lebih banyak silikon daripada yang benar-benar dibutuhkan untuk pekerjaan yang sedang dilakukan. Dan demikian pula para perancang logika tidak membangun setiap sel logika yang mungkin. Mereka mungkin membangun gerbang NAND 4 input dan gerbang NAND 8 input tetapi apa yang terjadi ketika insinyur lain membutuhkan 6 input NAND? Dia menggunakan 8 input gerbang NAND dan mengikat 2 input yang tidak digunakan yang menghasilkan sumber daya silikon yang hilang dan tenaga yang terpotong. Dan begitulah seterusnya rantai abstraksi. Setiap lapisan memberi kita cara untuk menangani kompleksitas,

Sekarang bandingkan abstraksi itu dengan apa yang dibutuhkan untuk FPGA. Pada dasarnya, abstraksi FPGA berhenti di # 2 dalam daftar di atas. FPGA memungkinkan pengembang untuk bekerja di lapisan logika digital. Ini agak lebih canggih daripada itu karena CPU 'hard coded' pada layer ini dan FPGA harus dikonfigurasi pada waktu berjalan (yang, BTW, itulah mengapa CPU biasanya menjalankan frekuensi yang jauh lebih tinggi), tetapi kebenaran penting yang penting adalah bahwa itu jauh beberapa abstraksi untuk FPGA daripada untuk CPU.

Jadi, Mengapa FPGA bisa lebih cepat dari CPU? Pada dasarnya itu karena FPGA menggunakan abstraksi yang jauh lebih sedikit daripada CPU, yang berarti perancang bekerja lebih dekat dengan silikon. Dia tidak membayar biaya dari semua lapisan abstraksi yang diperlukan untuk CPU. Dia kode pada tingkat yang lebih rendah dan harus bekerja lebih keras untuk mencapai sedikit fungsionalitas yang diberikan tetapi hadiah dia mendapatkan kinerja yang lebih tinggi.

Tapi tentu saja ada sisi buruk untuk abstraksi yang lebih sedikit juga. Semua abstraksi CPU itu ada karena alasan yang bagus. Mereka memberi kita paradigma pengkodean yang lebih sederhana yang berarti lebih banyak orang dapat dengan mudah mengembangkannya. Yang pada gilirannya berarti ada lebih banyak desain CPU yang ada dan dengan demikian kami memiliki manfaat harga / skala / waktu-ke-pasar yang besar dari CPU.

Jadi begitulah. FPGA memiliki abstraksi yang lebih sedikit sehingga dapat lebih cepat dan lebih hemat daya tetapi sulit diprogram. CPU memiliki banyak desain abstraksi untuk membuatnya mudah dikembangkan, terukur, dan murah. Tetapi mereka melepaskan kecepatan dan kekuatan dalam perdagangan untuk keuntungan itu.


Juga, FPGA dirancang menggunakan blok berulang sederhana yang akan melakukan tugas logis sederhana. Mereka dibuat khusus untuk jenis tugas tertentu. CPU, OTOH, memiliki banyak bagian fungsional yang kompleks yang semuanya melakukan hal yang berbeda. Orang dapat mempertimbangkan bahwa CPU adalah sekelompok banyak perangkat seperti FPGA yang berbeda (setelah semua, itu semua hanya silikon, elektronik, dan matematika). Jadi ini bukan tentang abstraksi, ini tentang kompleksitas. CPU adalah perangkat kompleks yang terdiri dari berbagai jenis perangkat listrik, sedangkan FPGA terdiri dari beberapa. CPU adalah senapan sementara FPGA adalah senapan.
AbstractDissonance

21

Sementara jawaban lainnya semuanya benar, belum ada satupun yang membahas contoh penambangan bitcoin dari pertanyaan Anda, yang memang merupakan contoh yang layak. Penambangan Bitcoin berulang kali melibatkan penghitungan fungsi hash kriptografis, SHA-256 dari hasil perhitungan SHA-256 lain, dari data di mana hanya satu bilangan bulat 32-bit berubah, hingga hash yang dihasilkan memiliki sifat tertentu. Setiap SHA-256 terdiri dari 64 pengulangan dari algoritma yang sama yang melibatkan penambahan 32-bit, bithift, dan beberapa operasi bit-mangling lainnya.

Jika Anda memprogram loop ini pada CPU 32-bit (atau lebih), Anda akan menemukan set instruksi yang sangat cocok untuk tugas --- SHA-256 dirancang untuk berjalan secara efisien pada CPU. Tetap saja Anda hanya akan menggunakan sekitar 2% dari area silikon CPU modern, dengan fungsi intensif seperti caching, perkalian, pembagian, operasi floating point, percabangan dan prediksi brach, dll., Baik tidak digunakan sama sekali atau tidak dapat memberikan signifikan peningkatan kinerja untuk tugas khusus ini.

Dalam perangkat keras yang dapat dikonfigurasi seperti FPGA, Anda hanya mengimplementasikan 2% itu, dan mengoptimalkan lebih lanjut dengan melupakan semua tentang eksekusi kode, alih-alih merancang gerbang untuk secara langsung menghitung masing-masing subfungsi yang sering diulang. Pipelined sedemikian rupa sehingga masing-masing dari mereka melewati hasil ke dalam setiap clock clock berikutnya, dan diulang 128 kali (dan dengan beberapa logika tambahan khusus di mana setiap SHA-256 dimulai dan berakhir), Anda akhirnya mendapatkan hasil setiap siklus clock (untuk mungkin 100 juta hash per detik pada FPGA yang diiklankan untuk mendukung 300 MHz pada logika yang lebih sederhana daripada ini) sementara pada CPU modern, Anda dapat mengharapkan satu hasil setiap beberapa ribu clock clock per core, katakanlah 10 juta hash per detik pada multi-core multi CPU -GHz.

Jika contoh khusus ini menarik bagi Anda, Anda mungkin ingin melihat jawaban terkait saya tentang internal ASIC penambang di bitcoin.stackexchange, karena banyak penambang FPGA bekerja dengan cara yang sama menggunakan perangkat keras yang dapat dikonfigurasi daripada yang dibuat khusus. Demi kelengkapannya saja: Ada kemungkinan lain, seperti membatasi atau menghindari perpipaan yang saya jelaskan demi paralelisasi yang lebih sepele dengan menggunakan beberapa hashers SHA-256 yang independen. Bergantung pada kendala yang diberikan oleh internal FPGA Anda dan ukuran totalnya, yang bahkan dapat memberikan kinerja yang lebih baik walaupun akan lebih efisien dalam hal jumlah gerbang dan perutean overhead jika Anda memiliki kebebasan sempurna dalam merancang seluruh chip, bukan hanya konfigurasi FPGA. .


3
Itu poin yang sangat bagus tentang pemanfaatan silikon.
tandai

Tapi mungkin (secara tidak sengaja!) Menyesatkan, mengingat bahwa FPGA terdiri dari sel yang agak rumit dengan banyak gerbang fisik, yang aplikasi tipenya hanya menggunakan sebagian kecil lagi, yang memungkinkan pabriknya untuk mengiklankan jumlah gerbang yang setara dalam upaya untuk memberi tahu Anda berapa banyak semua dari itu mungkin bernilai dalam aplikasi "khas" ...
piramida

3

Jawaban di atas, meskipun benar, kehilangan poin tentang mengapa FPGA (dan ASIC khusus) sangat baik untuk perhitungan bitcoin.

Keuntungan sebenarnya adalah bahwa sebagian besar perhitungan SHA-256 adalah operasi logis (misalnya, bit shift) yang dapat dilakukan dalam perkabelan. Ketika dilakukan dengan cara ini, mereka membutuhkan 0 siklus clock.

Keuntungan penting lainnya adalah FPGA jauh lebih hemat daya (yaitu MIPS per Watt) daripada CPU, sehingga jumlah energi yang dibutuhkan untuk perhitungan jauh lebih sedikit. Ini penting karena biaya penambangan bitcoin tergantung pada berapa banyak listrik yang Anda gunakan untuk membuatnya.

Chip ASIC lebih hemat energi daripada FPGA, sehingga mereka dapat mengeksekusi kode yang sama jauh lebih murah. Anda juga dapat menjejalkan lebih banyak unit eksekusi di papan untuk membuatnya lebih cepat. Kerugiannya adalah biaya pembuatan ASIC khusus sangat tinggi sehingga Anda perlu menjual beberapa chip untuk menutupi biaya pembuatan.

GPU, juga digunakan untuk membuat bitcoin, tetapi karena mereka jauh lebih hemat energi, mereka telah kehilangan landasan bagi FPGA dan ASIC khusus.


Jika Anda melihat algoritma hashing Monero alias cryptonight, Anda akan melihat bahwa implementasi FPGA hampir mustahil karena tingginya jumlah memori yang perlu diakses secara acak (2MB). CPU memiliki keunggulan dalam hal ini.
lucas92
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.