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)