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:
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?
efficiency
eeismail
źródło
źródło
Odpowiedzi:
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]
MPI_Allreduce
Dalsza lektura
źródło