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,