Presisi floating-point tunggal versus ganda

13

Angka floating point presisi tunggal mengambil setengah memori dan pada mesin modern (bahkan pada GPU tampaknya) operasi dapat dilakukan dengan mereka pada kecepatan hampir dua kali lipat dibandingkan dengan presisi ganda. Banyak kode FDTD yang saya temukan secara eksklusif menggunakan aritmatika dan penyimpanan presisi tunggal. Apakah ada aturan praktis tentang kapan dapat diterima untuk menggunakan presisi tunggal untuk memecahkan sistem persamaan skala kecil? Saya menganggap itu harus sangat bergantung pada nomor kondisi matriks.

Selain itu, apakah ada teknik yang efektif yang menggunakan presisi ganda jika diperlukan dan tunggal di mana akurasi ganda tidak diperlukan. Sebagai contoh, saya akan berpikir bahwa untuk perkalian vektor matriks atau produk dot vektor, mungkin ide yang baik untuk mengakumulasi hasil dalam variabel presisi ganda (untuk menghindari kesalahan pembatalan), tetapi entri individual dikalikan satu sama lain dapat dikalikan menggunakan presisi tunggal.

Apakah FPU modern memungkinkan konversi dari presisi tunggal (float) ke presisi ganda (ganda) dan sebaliknya? Atau apakah ini operasi yang mahal?

Costis
sumber

Jawaban:

7

Untuk semua masalah non-sepele (yaitu, untuk orang-orang di mana kinerja penting) hampir semua memori yang Anda miliki akan berada dalam matriks, dan relatif sedikit dalam vektor. Misalnya, untuk elemen Taylor-Hood 3d untuk persamaan Stokes, Anda memiliki beberapa ratus elemen per baris dalam matriks, dan ini jauh melebihi jumlah memori yang diperlukan untuk vektor. Dengan demikian kami telah bermain dengan gagasan menyimpan matriks sebagai mengapung dan vektor sebagai ganda. Saya tidak ingat hasil timing kami tetapi saya tahu pasti bahwa kami belum melihat masalah dengan pembulatan dll. Jadi pendekatan ini pasti bekerja.

Wolfgang Bangerth
sumber
Terima kasih, Prof. Bangerth. Bagaimana dengan untuk pemecah matriks berulang? Apakah Anda meningkatkan presisi hingga dua kali lipat untuk produk matriks-vektor atau menurunkan elemen vektor menjadi tunggal untuk pengganda dan membuat cadangan untuk menggandakan untuk akumulasi?
Costis
Saya tentu saja berbicara tentang pemecah iteratif. Kami melakukan semua vektor dalam presisi ganda (karena itu tidak masalah), sehingga operasi dst = matrix src terjadi sebagai double = float double. Akumulasi kemudian terjadi dalam presisi ganda, tetapi saya sebenarnya akan sangat terkejut jika itu penting sama sekali.
Wolfgang Bangerth
Ada kertas di luar sana (dari mungkin 2 dekade yang lalu) yang menunjukkan bahwa produk titik harus dilakukan lebih dari presisi ganda. Saya tidak memiliki referensi yang berguna, tetapi saya akan melihat apakah saya dapat menemukannya nanti.
Bill Barth
Ya, itu tidak akan mengejutkan saya. Itu juga cocok dengan apa yang kita lakukan.
Wolfgang Bangerth
Anda menggunakan presisi quad untuk produk dot? Jika ya, keren! Saya belum pernah mendengar ada yang melakukan ini di perpustakaan.
Bill Barth
3

Saran saya akan fokus terutama pada konsumsi memori untuk keputusan kapan harus menggunakan presisi tunggal (float). Jadi data curah untuk perhitungan FDTD harus menggunakan float, tapi saya akan menjaga deskripsi masalah itu sendiri (seperti geometri, parameter material, kondisi eksitasi) dan semua data meta terkait dalam double.

Saya akan menjaga semua kinerja tidak kritis dan tidak dianalisis secara mendalam dalam perhitungan ganda. Khususnya, saya akan menyimpan data poligon dan deskripsi geometri lainnya dalam bentuk dobel (mungkin bahkan bilangan bulat jika mungkin), karena pengalaman mengatakan bahwa Anda tidak akan pernah mendapatkan bagian geometris komputasi dari kode Anda sepenuhnya kuat, bahkan jika itu mungkin secara teori.

Bagian ketiga yang akan saya pertahankan adalah perhitungan analitik, termasuk pintasan menggunakan dekomposisi nilai eigen non-simetris. Sebagai contoh, saya memiliki fungsi 2D simetris rotasi piecewise yang ditentukan, dan saya perlu transformasi Fourier-nya. Akan ada berbagai cara numerik yang melibatkan FFT dan "filter low pass analitik" yang tepat untuk mendapatkannya "secara efisien". Karena kinerjanya tidak kritis, saya menggunakan ekspresi analitik "tepat" yang melibatkan fungsi Bessel. Karena ini adalah jalan pintas untuk memulai, dan saya tidak akan menghabiskan waktu menganalisis perbanyakan kesalahan rumus rumit saya, saya lebih baik menggunakan presisi ganda untuk perhitungan itu. (Masih ternyata hanya beberapa ekspresi ekuivalen analitik untuk rumus yang dapat digunakan,

Thomas Klimpel
sumber