Hesaplamalara karşılık arama maliyetleri


12

Ben bir mesafe kriteri sağlandığında olmadığını kontrol etmek hesaplamaları yapmak isteyen am: Bir vektör arasındaki mesafe olduğunu ve anter vektör az bazı değer daha olmalı . Verilerim dikey bir koordinat ızgarasına göre bölümlendi. Kesim, en yakın komşu koordinatların uç noktaları arasındaki mesafeden daha küçük olduğu için, şeylerin doğru ayarlanıp ayarlanmadığını kontrol etmek için bir "oktant" değişkeni eklemek istiyorum:xixjrmax

if octant[j] in allowed_list continue

"kısa devre" olarak

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

Benim sorum: Boole aramaları ve karşılaştırmaları kayan nokta işlemlerine göre hesaplama ne kadar verimli? Bu modern mimariler üzerinde yapmaya değer mi?


3
Kodunuzu dallayıp test etmek ister misiniz? Bu "çoğu (bir şekilde) veya (başka bir şekilde) kodlamak daha iyi mi?" tür sorular "Deneyin ve kıyaslayın."
Geoff Oxberry

1
Sadece 2 sentim. Geoff yazdığı gibi, bu tür tavsiye her zaman C ++ kodu ile ilgili stackoverflow, benzer sorular sordum ne var: önce her şeyi kod, modüler ve yeniden kullanılabilir kalır ve sadece sonra yeniden düzenleme başlar kod düzenleyin. 80-20 kuralı vardır: yazılım kodun% 20'sine% 80 zaman harcıyor. Yapı kalkana kadar bekleyin ve sonra değiştirin, test edin, değiştirin, test edin ..
tmaric

@GeoffOxberry: Sorum o kadar spesifik değil: Sadece kayan nokta işlemi yapmaya kıyasla boole kontrolü yapmak için verilen bir donanım veya derleyici avantajı olup olmadığını bilmek istiyorum.
aeismail

3
Ama sorunuz çok genel. Kimse somut bir kod görmeden söyleyemez. En iyi programcıların bile kodlarının darboğazlarının nerede olduğunu söyleyemediklerini söyleyen bir kural var. Son 25 yılımı programlayarak geçirdim ve bunun benim için geçerli olduğunu biliyorum.
Wolfgang Bangerth

Yanıtlar:


15

Temel kuralım, çift kesinlik değeri başına 50 flopten daha az bir miktarda verimli bir şekilde hesaplayabiliyorsanız (FPU'nun iyi kullanımı), yeniden hesaplamak saklamaktan daha iyidir. On yıllardır istikrarlı olan eğilim, kayan nokta kapasitesinin bellek performansından daha hızlı gelişmesi ve hızlı belleğin fiziksel kısıtlamaları ve enerji gereksinimleri nedeniyle atılma olasılığı yoktur. 50 değeri, tüm popüler bilgi işlem platformları (Intel / AMD, Blue Gene ve GPU'lar) için doğru büyüklüktedir.

Çekirdek başına yaklaşık maliyet tahminleri

[2011/2012 Intel ve AMD tabanlı makineler için yönergeler]

  • 0.05 ns: veri bağımlılıkları ve aralıklı çarpma / ekleme olmadan bir vektörize kodun bir parçası olarak bir çift duyarlıklı kayan nokta işlemi yapma zamanı
  • 0.2 ns: vektörizasyon veya veri bağımlılıkları olmadan bir vektörize edilmemiş kayan nokta işlemi yapma zamanı
  • 0.4 ns: vektörleştirme veya veri bağımlılıkları olmadan, ancak araya eklenmiş çarpma / ekleme (1 saat döngüsü) olmadan bir vektörize edilmemiş kayan nokta işlemi yapma süresi
  • 0.4 ila ns: referans L1 önbelleği0.8
  • 2 ns: bir kayan nokta işleminin gecikmesi (vectorized ya da vector)
  • 3 ila ns: mükemmel önceden getirilmiş ve tam olarak kullanılan akışın bir parçası olarak bellekten bir çift kesinlik değeri yükleme süresi5
  • 3 ila ns: dolaylı işlev çağrısı (sanal yöntem veya işlev işaretçisi, kayıt basıncı olmadan)5
  • 5 ns: koşullu dal yanlış tahmin
  • 4 ila ns: bir bölüm için zaman (vektörlenmiş veya değil, diğer talimatlarla aynı anda çalışamaz)8
  • 12 ns: L1 önbellek yerel L2'den memnun
  • 12 ns: en iyi durum karşılaştırma ve değiştirme veya getirme ve ekleme atomik talimatı
  • 30 - ns: Önbellek hattının yerel olarak kullanılabildiği L1 yazma önbellek kaçırma veya atomik talimat, ancak mevcut çekirdek özel erişim elde etmek zorundadır50
  • 100 ns: önbellek veya bellekten memnun önbellek kaçırma veya atomik talimat
  • 103 ns ( s): süslü bir ağ için donanım ağı gecikmesi1 μ
  • 104 ns ( s): ağa iyi eşlendiğinde düşük veri komşu değişimi10 μ
  • 106 ns (1 ms): paralel dosya sisteminde dosya oluşturma süresi (işlem başına)
  • 2106 ns (2 ms): MPI_Allreducebüyük bir makinede küçük veriler (örn. Bir norm veya nokta ürün)
  • 107 ns (10 ms): yerel disk araması
  • 5108 ns (500 ms): kullanılabilir tüm belleği yeniden yazma süresi
  • 1.81012 ns (0.5 saat): tüm makine durumunu diske kontrol etme süresi

daha fazla okuma


Bu bilgiyi gerçekten yararlı buldum. Bu arada, bu verileri nereden aldınız? Alıntı yapmak için referanslar arıyorum.
Eldila
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.