Biaya pencarian versus perhitungan

12

Saya tertarik dalam mendirikan perhitungan untuk memeriksa apakah kriteria jarak puas: yaitu, jarak antara vektor dan vektor anter x j harus kurang dari beberapa nilai r m a x . Data saya dipartisi berdasarkan kisi koordinat ortogonal. Karena cutoff saya lebih kecil dari jarak antara titik akhir koordinat tetangga terdekat, saya ingin menambahkan variabel "oktan" untuk memeriksa apakah semuanya diatur dengan benar:xixjrmax

if octant[j] in allowed_list continue

sebagai "hubungan arus pendek" ke

if dist(x[i], x[j]) < r_max

Pertanyaan saya adalah: seberapa efisien komputasi boolean lookups dan perbandingan relatif terhadap operasi floating-point? Apakah ini layak dilakukan pada arsitektur modern?

aeismail
sumber
3
Apakah Anda bersedia untuk bercabang kode Anda dan mengujinya? Saya merasa seperti jawaban standar untuk sebagian besar dari ini "Apakah lebih baik untuk kode itu (satu arah) atau (beberapa cara lain)?" jenis pertanyaan adalah "Cobalah dan patok itu."
Geoff Oxberry
1
Hanya 2 sen saya. Seperti Geoff menulis, saran semacam ini adalah apa yang selalu saya dapatkan ketika saya mengajukan pertanyaan serupa tentang stackoverflow, mengenai kode C ++: kode semuanya terlebih dahulu, atur kode sehingga saya tetap modular dan dapat digunakan kembali, dan baru kemudian mulai refactoring. Ada aturan 80-20: perangkat lunak menghabiskan 80% waktu untuk 20% kode. Tunggu hingga strukturnya naik, lalu ubah, uji, ubah, uji ..
tmaric
@ GeoffOxberry: Pertanyaan saya tidak begitu spesifik: Saya hanya ingin tahu apakah ada keuntungan perangkat keras atau kompiler yang diberikan untuk melakukan pemeriksaan boolean dibandingkan dengan melakukan operasi floating-point.
aeismail
3
Tetapi pertanyaan Anda terlalu umum. Tidak ada yang tahu tanpa melihat kode konkret. Ada aturan praktis yang mengatakan bahwa bahkan programmer terbaik tidak dapat mengetahui di mana kemacetan kode mereka tanpa profil. Saya telah menghabiskan 25 tahun terakhir saya pemrograman dan saya tahu itu benar bagi saya.
Wolfgang Bangerth

Jawaban:

15

Aturan praktis saya adalah bahwa jika Anda dapat menghitung beberapa kuantitas secara efisien (pemanfaatan FPU yang baik) dalam waktu kurang dari 50 jepit per nilai presisi ganda, lebih baik untuk menghitung ulang daripada menyimpan. Tren, yang telah stabil selama beberapa dekade, adalah untuk kemampuan floating point untuk meningkatkan lebih cepat daripada kinerja memori, dan tidak mungkin mengalah karena kendala fisik dan kebutuhan energi dari memori cepat. Nilai 50 adalah besarnya yang tepat untuk semua platform komputasi populer (Intel / AMD, Blue Gene, dan GPU).

Perkiraan biaya perkiraan per inti

[pedoman untuk mesin berbasis Intel dan AMD 2011/2012]

  • 0.05
  • 0.2
  • 0.4
  • 0.40.8
  • 2
  • 35
  • 35
  • 5
  • 48
  • 12
  • 12
  • 3050
  • 100
  • 1031 μ
  • 10410 μ
  • 106
  • 2106MPI_Allreduce
  • 107
  • 5108
  • 1.81012

Bacaan lebih lanjut

Jed Brown
sumber
Saya menemukan informasi ini sangat berguna. Omong-omong, dari mana Anda mendapatkan data ini? Saya mencari referensi untuk dikutip.
Eldila