Koszty przeglądów a obliczenia

12

Jestem zainteresowany konfiguracją obliczeń, aby sprawdzić, czy kryterium odległości jest spełnione: to znaczy odległość między wektorem a innym wektorem x j powinna być mniejsza niż pewna wartość r m a x . Moje dane są podzielone według ortogonalnej siatki współrzędnych. Ponieważ mój punkt odcięcia jest mniejszy niż odległość między punktami końcowymi współrzędnych najbliższego sąsiada, chciałbym dodać zmienną „oktantową”, aby sprawdzić, czy wszystko jest ustawione poprawnie:xixjrmax

if octant[j] in allowed_list continue

jako „zwarcie” do

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

Moje pytanie brzmi: jak wydajne obliczeniowo są wyszukiwania boolowskie i porównania w stosunku do operacji zmiennoprzecinkowych? Czy warto to robić na nowoczesnych architekturach?

eeismail
źródło
3
Czy byłbyś skłonny rozgałęzić swój kod i przetestować go? Czuję się jak standardowa odpowiedź na większość z nich: „Czy lepiej jest to kodować (w jedną stronę) czy (w inny sposób)?” Rodzaje pytań to „Wypróbuj i przetestuj”.
Geoff Oxberry
1
Tylko moje 2 centy. Jak napisał Geoff, tego rodzaju porady zawsze otrzymuję, kiedy zadaję podobne pytania na temat przepełnienia stosu, dotyczące kodu C ++: najpierw koduj wszystko, organizuj kod, aby pozostać modułowy i wielokrotnego użytku, a dopiero potem zacznij refaktoryzować. Istnieje zasada 80-20: oprogramowanie spędza 80% czasu na 20% kodu. Poczekaj, aż struktura się podniesie, a następnie zmień, przetestuj, zmień, przetestuj ..
tmaric
@GeoffOxberry: Moje pytanie nie jest tak szczegółowe: chcę tylko wiedzieć, czy wykonanie kontroli boolowskiej ma przewagę sprzętową lub kompilatorową w porównaniu z operacją zmiennoprzecinkową.
aeismail
3
Ale twoje pytanie jest zbyt ogólne. Nikt nie może powiedzieć, nie widząc żadnego konkretnego kodu. Ogólna zasada mówi, że nawet najlepsi programiści nie są w stanie stwierdzić, gdzie są wąskie gardła ich kodu bez profilowania. Przez ostatnie 25 lat programowałem i wiem, że to dla mnie prawda.
Wolfgang Bangerth

Odpowiedzi:

15

Moją ogólną zasadą jest to, że jeśli możesz skutecznie obliczyć pewną ilość (dobre wykorzystanie FPU) w mniej niż 50 flopach na wartość podwójnej precyzji, lepiej jest przeliczyć niż zapisać. Tendencja, która utrzymuje się od dziesięcioleci, polega na zdolności zmiennoprzecinkowej do poprawiania się szybciej niż wydajność pamięci i prawdopodobnie nie ustąpi z powodu fizycznych ograniczeń i zapotrzebowania energetycznego na szybką pamięć. Wartość 50 jest odpowiedniej wielkości dla wszystkich popularnych platform obliczeniowych (Intel / AMD, Blue Gene i GPU).

Szacunkowe koszty przybliżone na rdzeń

[wytyczne dla komputerów z procesorami Intel i AMD 2011/2012]

  • ns: czas na wykonanie jednej operacji zmiennoprzecinkowej podwójnej precyzji jako części kodu wektorowego bez zależności danych i przeplatania pomnóż / dodaj0.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

Dalsza lektura

Jed Brown
źródło
Informacje te okazały się bardzo przydatne. Przy okazji, skąd masz te dane? Szukam odniesień do cytowania.
Eldila