Komputasi relatif dari titik tetap vs perhitungan titik mengambang?

9

Saya memiliki sistem pemrosesan sinyal digital yang beroperasi pada mesin x86 cepat menggunakan angka floating point presisi ganda . Terpikir oleh saya bahwa saya tidak benar-benar menggunakan rentang dinamis yang besar dari representasi floating point - semua jumlah cocok dengan mudah dalam kisaran ± 32768.

Pertanyaan saya: mungkinkah beralih ke perhitungan titik tetap akan memberikan manfaat dalam akurasi numerik (prioritas tinggi) atau waktu komputasi (prioritas rendah)?

Tentu saja, jawabannya tergantung pada berapa banyak bit yang tersedia untuk perhitungan titik tetap. Berapa banyak bit presisi yang digunakan sistem titik tetap tipikal? Apakah mungkin untuk secara efisien melakukan perhitungan titik tetap, dengan, katakanlah, 64 bit ( bagian bilangan bulat 16 bit, bagian pecahan 48 bit ) pada x86-64?

Saya selalu berpikir bahwa perhitungan titik tetap hanya digunakan dalam situasi di mana daya CPU terbatas - apakah masuk akal untuk menggunakan perhitungan titik tetap ketika daya CPU tidak menjadi masalah?

nibot
sumber
Apakah Anda benar-benar membutuhkan lebih dari ~ 15 angka signifikan yang memberikan nilai floating-point presisi ganda kepada Anda? Walaupun generalisasi luas itu buruk, saya akan mengatakan bahwa jika Anda melihat agregat semua sistem DSP titik tetap, bilangan bulat 16-bit cenderung menjadi format yang paling umum.
Jason R

Jawaban:

7

Akurasi numerik bilangan bulat hanya akan lebih baik daripada akurasi numerik float jika resolusi bilangan bulat lebih baik. Doubles memiliki 52 bit fraksional, jadi float presisi ganda memiliki resolusi lebih buruk daripada bilangan bulat di sekitar , yang jauh lebih besar dari 32768 ( 2 15 ). Jadi, tidak, akurasi numerik tidak akan lebih baik jika Anda pergi ke bilangan bulat.252215

Masalah kedua adalah kecepatan. Jawabannya adalah: itu tergantung pada perangkat kerasnya. Jika Anda menjalankan program Anda pada prosesor sinyal digital yang memiliki banyak titik tetap, kalikan / terakumulasi inti, maka ya, itu akan jauh lebih cepat di titik tetap. Pada chip x86, di sisi lain, itu mungkin sebenarnya akan lebih lambat di titik tetap. Saya melakukan persis apa yang Anda bicarakan sekali dan melihat waktu eksekusi saya meningkat.

Setelah melakukan pencarian di internet saya menemukan bahwa itu adalah hal biasa. Alasannya adalah karena ia memiliki prosesor floating-point khusus yang tidak melakukan apa-apa ketika Anda beralih ke titik tetap, sedangkan perangkat keras titik tetap dibagi dengan tindakan titik tetap biasa, seperti aritmatika pointer.

Jika Anda ingin mempercepat pemrosesan, cara untuk melakukannya adalah mengubah dari pelampung presisi ganda ke pelampung presisi tunggal. Itu akan menghasilkan peningkatan kecepatan yang signifikan. Itu tentu saja akan mengurangi akurasi angka Anda.

Jim Clay
sumber
Saya mengerti apa yang dikatakan jawaban ini ketika saya menulis milik saya. Yang ini lebih baik. Jika saya tidak salah, juga, saya membaca di suatu tempat bahwa pada beberapa komputer (64 bit mungkin?) Tipe floating point hardware asli ganda, jadi menggunakan presisi tunggal (empat byte) mengapung sebenarnya bisa lebih lambat. Ini adalah sesuatu yang harus dipertimbangkan.
heltonbiker
Pelampung presisi tunggal memiliki mantissae 23 bit, dobel memiliki 52 bit.
Paul R
Saya menyarankan 16 bit integer + 48 bit fraksi sebagai alternatif untuk floating point presisi ganda. Saya sebutkan 32.768 untuk menunjukkan bahwa nilai saya akan dengan mudah masuk ke dalam rentang ini. Mengingat pembatasan nilai-nilai ini, saya pikir Q16.48 akan memberikan akurasi numerik yang lebih besar daripada floating point presisi ganda.
nibot
1
@nibot Oke. Ganda akan memiliki presisi yang lebih baik dari -16 hingga +16, dan bilangan bulat pecahan akan memiliki presisi yang lebih baik di tempat lain hingga -32769 dan +32768. Mereka tentu saja tidak bisa mewakili apa pun di luar itu. Mereka juga akan lebih lambat dari dua kali lipat. Bagi saya jangkauan terbatas dan kecepatan lambat akan menjadi masalah, tapi YMMV.
Jim Clay
6

Kelebihan titik tetap sebagian besar dalam hal daya (seperti ketika Anda memiliki pilihan perangkat keras prosesor, atau prosesor pandai mematikan unit fungsional yang tidak digunakan). Itu karena unit titik tetap umumnya lebih kecil (lebih sedikit transistor, kabel lebih pendek, lebih sedikit kapasitansi untuk diatasi per MAC) untuk teknologi tertentu dan tingkat masalah operasi, daripada floating point.

Namun sejumlah besar prosesor kontemporer umum (server, PC, dan bahkan ponsel), memiliki FPU lebih banyak dan lebih cepat (terutama unit FP presisi tunggal) daripada pengganda bilangan bulat, dan sebagian besar daya sistem bukan dari menggunakan FPU, jadi gunakan tetap -point akan memiliki sedikit atau tidak ada keuntungan untuk perhitungan DSP pada produk-produk ini, dan kemungkinan dapat menjadi kerugian dalam hal kinerja murni. Menggunakan teknologi saat ini, setiap keuntungan untuk titik tetap sebagian besar akan bertambah sebagian besar pada produk tertanam kecil, seperti perangkat berukuran tombol.

Namun, pertimbangkan juga memori dan jejak cache prosesor. Penggunaan cerdas tipe data yang lebih kecil (int pendek dan mengambang) agar sesuai dengan perhitungan besar sepenuhnya dalam cache data dapat mengimbangi keuntungan bandwidth FPU murni.

hotpaw2
sumber
2
+1 untuk menyebutkan pentingnya masalah cache sehubungan dengan kinerja. Pada prosesor x86 modern, mendesain algoritme Anda dengan mengingat cache dapat memiliki efek besar pada kinerja.
Jason R
5

Lebih suka float presisi tunggal hingga dua kali lipat - ini akan membagi dua bandwidth memori Anda, jejak cache dan persyaratan penyimpanan, dan membuat beberapa operasi matematika lebih cepat. Ini juga membuka kemungkinan SIMD 4 arah jika optimasi lebih lanjut diperlukan.

Titik tetap hanya benar-benar bermanfaat ketika Anda tidak memiliki FPU - CPU x86 paling modern memiliki dua FPU sehingga tidak ada yang bisa diperoleh dari menggunakan titik tetap, dan kinerja bahkan mungkin jauh lebih buruk dengan titik tetap. (Perhatikan juga bahwa titik tetap memerlukan instruksi tambahan dibandingkan dengan titik mengambang untuk operasi seperti penggandaan.)

Paul R
sumber
Saya tertarik untuk meningkatkan akurasi numerik, bukan menguranginya.
nibot
Bagaimana Anda melihat titik tetap meningkatkan akurasi numerik relatif terhadap ganda, yang sudah 52 bit presisi dan rentang dinamis yang sangat besar?
Paul R
Yah, saya bisa menggunakan format titik tetap dengan lebih dari 52 bit.
nibot
Karena Anda tampaknya membutuhkan setidaknya 16 bit untuk bagian integer dari representasi titik tetap Anda, ini akan membawa Anda lebih dari 64 bit, jadi Anda mungkin kemudian melihat format yang CPU Anda bahkan tidak memiliki instruksi integer asli. Dalam hal ini Anda mungkin juga hanya menggunakan perpustakaan integer besar yang ada atau serupa. Namun, pertanyaan paling penting untuk dijawab adalah: seberapa banyak ketelitian yang Anda butuhkan ?
Paul R
3

Selain jawaban yang sangat baik yang diberikan di sini, beberapa hal perlu ditambahkan:

  • Ada situasi di mana bahkan jika Anda memiliki persyaratan yang sangat mendasar pada rentang dinamis dari data yang Anda proses, Anda masih akan membutuhkan ketepatan yang sangat baik untuk beberapa operasi yang dilakukan di atasnya - misalnya Anda akan ingin menerapkan filter IIR yang membutuhkan koefisien yang relatif kecil; dan memotongnya akan menyebabkan ketidakstabilan. Segera setelah sistem Anda memiliki umpan balik, ada kemungkinan masalah kuantisasi / pemotongan yang baik akan menggigit Anda saat menggunakan titik tetap - Anda harus lebih berhati-hati tentang hal-hal seperti filter topologi dan skema pemotongan / fraksi-penghematan.
  • Tidak seperti banyak arsitektur DSP / DSC, x86 tidak memiliki operasi integer jenuh (well, itu ada di SSE, bukan pada kode skalar standar). Ini berarti bahwa jika terjadi luapan, hal-hal buruk dapat terjadi - nilai mengubah tanda dan "membungkus". Anda harus ekstra hati-hati dengan luapan dan rentang dinamis, atau tes percikan pada rentang operanseluruh kode Anda. Ini bisa sangat merusak kinerja. Sebagai perbandingan, floating point lebih tahan terhadap masalah-masalah ini, karena rentang dinamis yang besar memberi Anda lebih banyak "ruang kepala", dan luapan tidak akan menyebabkan kegagalan bencana. Sebagian besar kode pemrosesan sinyal audio yang berjalan pada komputer desktop menggunakan rentang -1.0 .. 1.0, presisi tunggal atau ganda; jadi ini memberi lebih dari ratusan dB ruang kepala. Saya telah menulis kode pemrosesan sinyal audio dengan kedua pendekatan, dan ketika menggunakan floating point hanya ada beberapa tempat ketika saya harus secara eksplisit klip / jenuh sinyal - biasanya hanya pada akhir rantai pemrosesan sinyal atau di tempat-tempat di mana umpan balik terjadi.
pichenettes
sumber
1

Beberapa hal yang perlu dipertimbangkan:

  • Sebagian besar prosesor modern telah mengoptimalkan angka-angka floating-point selama bertahun-tahun, dan bahkan GPU sudah digunakan untuk itu, sangat berhasil;
  • Perhitungan titik tetap merusak data Anda dan dapat menyebabkan masalah serius ketika operasi aritmatika tidak dikondisikan dengan baik (itu sebabnya angka titik tetap diganti dengan angka titik mengambang);
  • Bahkan jika Anda menggunakan celana pendek yang ditandatangani untuk MENGANDUNG data Anda (lot dataloggers menggunakan presisi 16bit), PERHITUNGAN harus dilakukan dalam floating point kemudian dikonversi kembali ke bilangan bulat, jika tidak mungkin ada artefak seperti kuantisasi dan alias.

Sebagai kata terakhir, saya pikir data dunia nyata kita sangat berharga dan angka buta komputer adalah pekerjaan rendah hati. Komputer harus melakukan pekerjaan berat untuk data Anda dan untuk Anda, dan tidak diperlakukan seolah-olah itu adalah bintang nyata dalam pertunjukan.

heltonbiker
sumber
Saya tidak bermaksud mengatakan bahwa saya akan menggunakan celana pendek 16-bit untuk memuat jumlah saya, melainkan sesuatu seperti format titik tetap 64-bit dengan bagian integer 16-bit dan bagian fraksional 48-bit. Motivasinya adalah, jika saya tidak menggunakan sebagian besar bit eksponen dalam format floating point, apakah akurasi numerik saya akan meningkat jika saya malah menggunakan bit tersebut untuk memberikan angka signifikan tambahan?
nibot
215
Satu hal lagi: Sepertinya bagi saya bahwa StackOverflow (bukan DSP.SE, di sini) akan menjadi tempat yang ideal untuk mendapatkan alasan yang lebih dalam tentang pro dan kontra dari satu format di atas yang lain.
heltonbiker