Sebagai perpanjangan untuk jawaban moyner ini , on-chip sqrt
biasanya merupakan rsqrt
, yaitu timbal balik akar kuadrat yang menghitung a → 1 / a--√ . Jadi, jika dalam kode Anda Anda hanya akan menggunakan (jika Anda melakukan dinamika molekuler, Anda), Anda dapat menghitung secara langsung dan menyelamatkan diri Anda dari pembagian. Alasan mengapa dihitung sebagai ganti adalah bahwa iterasi Newton tidak memiliki divisi, hanya penambahan dan perkalian.1 / rr = rsqrt(r2)
rsqrt
sqrt
Sebagai catatan tambahan, divisi juga dihitung secara iteratif dan hampir sama lambatnya dengan rsqrt
perangkat keras. Jika Anda mencari efisiensi, lebih baik Anda mencoba menghilangkan divisi yang berlebihan.
Beberapa arsitektur yang lebih modern seperti arsitektur POWER IBM tidak menyediakan rsqrt
per-se, tetapi perkiraan yang akurat untuk beberapa bit, misalnya FRSQRTE . Ketika seorang pengguna menelepon rsqrt
, ini menghasilkan perkiraan dan kemudian satu atau dua (sebanyak yang diperlukan) iterasi dari algoritma Newton atau Goldschmidt menggunakan perkalian dan penambahan reguler. Keuntungan dari pendekatan ini adalah bahwa langkah-langkah iterasi dapat dilakukan pipelined dan disisipkan dengan instruksi lain tanpa memblokir FPU (untuk gambaran yang sangat bagus dari konsep ini, meskipun pada arsitektur yang lebih tua, lihat Tesis PhD Rolf Strebel ).
Untuk potensi interaksi, sqrt
operasi dapat dihindari sepenuhnya dengan menggunakan interpolasi polinomial dari fungsi potensial, tetapi pekerjaan saya sendiri (diimplementasikan dalam mdcore
) di bidang ini menunjukkan bahwa, setidaknya pada arsitektur tipe x86, sqrt
instruksi cukup cepat.
Memperbarui
Karena jawaban ini tampaknya mendapat sedikit perhatian, saya juga ingin membahas bagian kedua dari pertanyaan Anda, yaitu apakah benar-benar layak untuk mencoba meningkatkan / menghilangkan operasi dasar seperti sqrt
?
Dalam konteks simulasi Dinamika Molekuler, atau simulasi berbasis partikel apa pun dengan interaksi terbatas, ada banyak bisa diperoleh dari algoritma yang lebih baik untuk penemuan tetangga. Jika Anda menggunakan daftar Cell , atau yang serupa, untuk menemukan tetangga atau membuat daftar Verlet , Anda akan menghitung sejumlah besar jarak berpasangan palsu. Dalam kasus naif, hanya 16% pasangan partikel yang diinspeksi akan benar-benar berada dalam jarak cutoff satu sama lain. Meskipun tidak ada interaksi yang dihitung untuk pasangan tersebut, mengakses data partikel dan menghitung jarak berpasangan palsu membawa biaya besar.
Pekerjaan saya sendiri di bidang ini (di sini , di sini , dan di sini ), serta pekerjaan orang lain (mis sini ), menunjukkan bagaimana perhitungan palsu ini dapat dihindari. Algoritma tetangga-menemukan ini bahkan keluar-melakukan daftar Verlet, seperti yang dijelaskan di sini .
Poin yang ingin saya tekankan adalah bahwa meskipun mungkin ada beberapa perbaikan untuk mendapatkan dari lebih mengetahui / mengeksploitasi arsitektur perangkat keras yang mendasarinya, ada juga potensi keuntungan yang lebih besar yang bisa didapat dalam memikirkan kembali algoritma tingkat yang lebih tinggi.
rsqrtps
dan AVXvrsqrtps
juga merupakan perkiraan, mereka mendapatkan 11 hingga 12 bit pertama yang benar dan Anda harus memperbaiki dengan satu atau dua iterasi Newton jika Anda ingin lebih akurat. Ini adalah instruksi 5/1 dan 7/1 (latency / inverse throughput) pada Sandy Bridge (lihat dokumen Intel atau tabel instruksi Agner Fog yang dapat dibandingkan dengan perkalian. Sebaliknya, akurasi penuh(v)sqrtps
(atau presisi ganda(v)sqrtpd
) memerlukan 10-43 / 10-43 (lihat tabel instruksi untuk lebih jelasnya)Root kuadrat diimplementasikan dalam perangkat keras pada sebagian besar prosesor, yaitu, ada instruksi perakitan khusus dan kinerja harus sebanding dalam sebagian besar bahasa karena sangat sulit untuk memperbaiki implementasi. Anda mungkin tidak akan pernah bisa mengalahkan instruksi FSQRT, karena itu dirancang oleh beberapa perancang perangkat keras yang cerdas.
Bagaimana itu diterapkan dalam perangkat keras dapat bervariasi, tetapi mungkin semacam iterasi titik tetap, misalnya metode Newton-Raphson yang melakukan sejumlah iterasi tertentu sampai jumlah digit yang diperlukan dihitung. Metode berulang dalam perangkat keras pada umumnya jauh lebih lambat daripada operasi lain, karena beberapa siklus harus diselesaikan sebelum hasilnya siap.
Ada juga beberapa Petunjuk Streaming SIMD yang dapat digunakan pada register XMM untuk perhitungan vektor cepat yang ditemukan di sini . Register ini cukup kecil, tetapi jika Anda memiliki jumlah koordinat yang diketahui (katakanlah, sistem koordinat Kartesius tiga dimensi) mereka bisa menjadi sedikit lebih cepat.
Jika bahasa Anda cukup rendah, Anda selalu bisa mengetikkan ke tingkat yang lebih rendah atau menggunakan angka dengan tingkat yang lebih rendah untuk koordinat Anda. Ketelitian tunggal seringkali lebih dari cukup, dan dari yang saya ingat akan lebih cepat ketika menghitung akar kuadrat karena iterasi dapat dihentikan lebih awal.
Seharusnya cukup mudah untuk membandingkan bahasa yang berbeda: Cukup tulis serangkaian panjang angka acak ke sebuah file, muat menggunakan bahasa yang berbeda dan kemudian waktu akar kuadrat.
sumber
Mungkin ada peningkatan kinerja, tetapi yang pertama harus diketahui untuk mengetahui bahwa menghitung kebalikan dari sqrt adalah leher botol (dan tidak, katakanlah, memuat posisi dan menghemat gaya).
Proyek GROMACS MD tumbuh dari sebuah ide untuk mengeksploitasi rincian format titik-mengambang IEEE untuk menyemai skema iterasi Newton-Raphson untuk menghitung pendekatan yang dapat diterima untuk kebalikan dari akar kuadrat (lihat Lampiran B.3 dari http: / /www.gromacs.org/Documentation/Manual ), tetapi tidak ada CPU HPC yang digunakan di mana GROMACS masih menggunakan ide ini.
sumber