Saat menggunakan FPGA biasa seperti Xilinx Spartan 3 atau Virtex 5, berapa banyak siklus yang dibutuhkan untuk melakukan perkalian penggandaan atau pembagian 64-bit floating-point 64-bit?
Sejauh yang saya mengerti, FPGA tidak memiliki FPU keras dan Anda perlu membuatnya menggunakan perpustakaan IEEE standar atau bahan lainnya. Ini berarti bahwa itu tidak akan dieksekusi dalam satu siklus tunggal, jadi saya mencari perkiraan kasar untuk membandingkan kinerja CPU 100 Mhz dengan 100 MHz Spartan / Virtex FPGA.
Saya terutama tertarik pada operator floating-point, tetapi jika Anda memiliki pengalaman dengan operasi integer yang akan dihargai juga.
Jawaban:
Saya belum melakukan ini untuk FP presisi ganda, tetapi prinsip yang sama berlaku untuk presisi tunggal, yang telah saya implementasikan divisi (seperti dikalikan dengan timbal balik).
Apa yang dimiliki FPGA ini, alih-alih FPU, adalah blok DSP / pengganda bawaan, yang mampu menerapkan multiplikasi 18 * 18 atau (Virtex-5) 18 * 25 dalam satu siklus tunggal. Dan perangkat yang lebih besar memiliki sekitar seribu perangkat ini, atau bahkan 126 atau 180 di ujung atas keluarga Spartan-3 atau Spartan-6.
Jadi Anda dapat menguraikan multiplikasi besar menjadi operasi yang lebih kecil menggunakan beberapa di antaranya (2 untuk Virtex-5 melakukan presisi tunggal) menggunakan adders DSP atau fabric FPGA untuk menjumlahkan produk parsial.
Anda akan mendapatkan jawaban dalam beberapa siklus - 3 atau 4 untuk SP, mungkin 5 untuk DP - tergantung pada bagaimana Anda menyusun pohon penambah (dan kadang-kadang, di mana alat synth bersikeras menambahkan register pipa!).
Namun itu adalah latensi - seperti pipelined, throughput akan menjadi 1 hasil per siklus clock.
Untuk divisi, saya memperkirakan operator timbal balik menggunakan tabel pencarian diikuti oleh interpolasi kuadratik. Ini akurat untuk lebih baik daripada presisi tunggal dan akan meluas (dengan lebih banyak perangkat keras) ke DP jika saya mau. Dalam Spartan-6 dibutuhkan 2 BlockRams dan 4 DSP / pengganda, dan beberapa ratus pasang LUT / FF.
Latency-nya adalah 8 siklus, tetapi lagi throughputnya adalah siklus tunggal, jadi dengan menggabungkannya dengan pengali di atas, Anda mendapatkan satu divisi per siklus clock. Itu harus melebihi 100MHz di Spartan-3. Dalam Spartan-6 estimasi sintesis adalah 185MHz tetapi dengan 1.6ns pada jalur routing tunggal, jadi 200MHz masuk akal.
Dalam Virtex-5 mencapai 200MHz tanpa usaha, seperti halnya kembar akar kuadratnya. Saya memiliki beberapa siswa musim panas yang mencoba untuk mem-pipeline ulang - dengan latensi kurang dari 12 siklus mereka mendekati 400MHz - 2,5 ns untuk akar kuadrat.
Tapi ingat Anda mungkin memiliki ratusan hingga seribu unit DSP? Itu memberi Anda satu atau dua kali lipat kekuatan pemrosesan lebih dari satu unit FP tunggal.
sumber
Jawabannya iya!
Tapi serius, itu sangat sulit untuk menghasilkan angka. Ketika mendesain logika yang kompleks, selalu ada pertukaran antara berbagai hal, dan tidak ada pendekatan yang baik untuk semua desain. Saya akan mencoba untuk menutupi yang besar.
Dengan desain logika, satu trade-off adalah ukuran vs kecepatan. Contoh mudahnya adalah katakanlah bahwa satu pengali Floating Point terlalu lambat. Untuk mempercepatnya, yang harus Anda lakukan adalah menambahkan pengganda kedua. Ukuran logika Anda berlipat ganda, tetapi lakukan jumlah penggandaan per detik. Tetapi bahkan hanya dengan melihat pengali tunggal, ada berbagai cara untuk mengalikan angka; ada yang cepat dan besar, yang lain kecil dan lambat.
Pertukaran lainnya adalah kecepatan clock vs jam per kali. Saya dapat merancang beberapa logika yang akan melakukan floating point tunggal dalam satu jam. Tapi itu juga akan membutuhkan jam menjadi lebih lambat - mungkin paling lambat 10 MHz. Atau, saya bisa mendesainnya untuk bekerja dengan jam 100 MHz tetapi akan membutuhkan 10 jam per kali. Kecepatan keseluruhannya sama (satu kali lipat dalam 100 ns), tetapi orang memiliki jam yang lebih cepat.
Terkait dengan paragraf sebelumnya adalah trade-off kecepatan clock vs latensi berlipat ganda. Ada teknik dalam desain logika yang disebut pipelining. Pada dasarnya Anda mengambil sepotong logika dan memecahnya menjadi tahap yang lebih kecil, di mana setiap tahap mengambil satu siklus jam untuk menyelesaikannya. Keuntungannya di sini adalah bahwa masing-masing tahap dapat mengerjakan penggandaan sedangkan tahap lainnya bekerja pada pengganda lainnya. Sebagai contoh, katakanlah kita menjalankan pada 100 MHz dengan pipa 10 tahap. Ini berarti bahwa akan diperlukan 10 jam untuk setiap kali, tetapi logikanya juga bekerja pada 10 kali yang berbeda secara bersamaan! Yang keren adalah itu menyelesaikan kelipatan pada setiap siklus clock. Jadi jam efektif per kalikan adalah 1, hanya perlu 10 jam untuk masing-masing kalikan untuk menyelesaikan.
Jadi jawaban atas pertanyaan Anda, seberapa cepat FPGA dapat melipatgandakan, benar-benar terserah Anda. FPGA hadir dalam berbagai ukuran dan kecepatan, dan Anda dapat mendedikasikan sebanyak mungkin logika untuk tugas yang Anda inginkan. Tapi mari kita lihat satu skenario tertentu ...
Katakanlah kita ingin menggunakan Spartan-3A terbesar dan yang kita pedulikan hanyalah 32-bit floating point. Multiply float 32-bit membutuhkan pengganda integer 24x24 dan penambah 8-bit. Ini membutuhkan empat blok pengali khusus dan beberapa irisan generik (terlalu sedikit untuk dipedulikan). XC3S1400A memiliki 32 pengganda khusus, sehingga kami dapat melakukan delapan pengganda titik apung kami secara paralel. Tebakan kasar pada kecepatan clock adalah sekitar 100 MHz. Kami dapat sepenuhnya menyalurkan desain ini sehingga kami dapat menyelesaikan empat kali lipat floating point 32-bit per siklus clock, untuk kecepatan efektif 800 juta kali lipat floating point, per detik.
Penggandaan presisi ganda membutuhkan 9 blok pengali khusus untuk setiap titik mengambang, jadi kita hanya bisa melakukan 3 kali lipat secara paralel - menghasilkan kecepatan sekitar 300 juta 64-bit titik mengambang mengalikan per detik.
Sebagai perbandingan, mari pertimbangkan seri Xilinx Virtex-7 yang lebih baru. Pengganda khusus di dalamnya lebih besar, jadi kita hanya perlu 6 blok pengali khusus untuk 64-bit floating point multiply. Ada juga 1.920 pengganda khusus pada bagian terbesar - sehingga kita dapat melakukan 320 perkalian floating point presisi ganda secara paralel. Bagian-bagian itu juga jauh lebih cepat. Saya memperkirakan bahwa kita dapat menjalankan bagian-bagian itu pada 200 MHz, memberi kita kecepatan total 64 MILIAR floating point presisi ganda dikalikan per detik. Tentu saja, chip tersebut masing-masing berharga sekitar US $ 10.000.
Divisi floating point jauh lebih sulit dilakukan dengan cepat. Logikanya jauh lebih besar, terutama dalam FPGA, dan berjalan jauh lebih lambat. Hal yang sama berlaku untuk kebanyakan CPU, dalam hal instruksi pembagian (floating dan fixed point) berjalan jauh lebih lambat. Jika kecepatan itu penting maka Anda ingin menghilangkan pembagian sebanyak mungkin. Misalnya, daripada membaginya dengan 5, Anda harus mengalikannya dengan 0,2. Bahkan, pada banyak sistem lebih cepat untuk menghitung timbal balik dan melakukan penggandaan daripada hanya melakukan pembagian.
Pertukaran yang sama berlaku untuk divisi sebagai multiplikasi - hanya saja divisi itu akan selalu jauh lebih lambat dan jauh lebih besar dari multiplikasi.
sumber
Setidaknya pada komponen divisi Altera ALT_FP, divisi 64 bit presisi ganda (52 bit mantissa) membutuhkan 10, 24 atau 61 siklus clock (dapat dipilih). Presisi tunggal yang diperluas dapat bervariasi. Misalnya divisi 43bits dengan eksponen 11 bit, mantissa adalah 26 bit yang memungkinkan untuk memilih opsi latensi keluaran jam seperti itu: 8, 18 atau 35. Mulai ISE dan periksa apa yang dapat Anda miliki di Xilinx.
sumber
Tidak ada alasan mengapa ini tidak dapat dilakukan dalam satu siklus. Akan tetapi, ini mungkin akan menjadi siklus yang agak besar dan menggunakan banyak sumber daya ...
sumber
Saya memiliki implementasi presisi ganda, floating-point multiply dan bagi. Perkalian membutuhkan 13 siklus clock dan pembagiannya membutuhkan 109 siklus clock. Keduanya disalurkan untuk throughput 100% (satu hasil per jam) dan sekitar 200MHz beroperasi pada Xilinx V5. Saya tidak tahu berapa banyak jam lebih sedikit yang bisa Anda dapatkan pada 100MHz, tetapi membaginya dengan dua akan menjadi taruhan yang aman.
Saya juga memiliki implementasi floating-point presisi tunggal yang mengambil 10 dan 51 jam dalam situasi yang sama.
sumber