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?
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.