Suchkosten im Vergleich zu Berechnungen

12

Ich bin daran interessiert, Berechnungen aufzustellen, um zu prüfen, ob ein Abstandskriterium erfüllt ist: Das heißt, der Abstand zwischen einem Vektor xi und einem anderen Vektor xj sollte kleiner sein als ein Wert rmax . Meine Daten sind nach einem orthogonalen Koordinatenraster unterteilt. Da mein Grenzwert kleiner ist als der Abstand zwischen den Endpunkten der Koordinaten des nächsten Nachbarn, möchte ich eine "Oktanten" -Variable hinzufügen, um zu überprüfen, ob die Einstellungen korrekt sind:

if octant[j] in allowed_list continue

als "Kurzschluss" zu

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

Meine Frage lautet: Wie effizient sind boolesche Suchen und Vergleiche im Vergleich zu Gleitkommaoperationen rechnerisch? Lohnt sich dies für moderne Architekturen?

aeismail
quelle
3
Möchten Sie Ihren Code verzweigen und testen? Ich fühle mich wie die Standardantwort auf die meisten dieser Fragen: "Ist es besser, sie (in eine Richtung) oder (in eine andere Richtung) zu codieren?" Arten von Fragen ist "Probieren Sie es aus und bewerten Sie es."
Geoff Oxberry
1
Nur meine 2 Cent. Wie Geoff schrieb, ist diese Art von Ratschlag das, was ich immer bekam, wenn ich ähnliche Fragen zum Stackoverflow in Bezug auf den C ++ - Code stellte: Code alles zuerst, organisiere den Code so, dass ich modular und wiederverwendbar bleibe, und beginne erst dann mit dem Refactoring. Es gibt eine 80-20-Regel: Software verbringt 80% der Zeit mit 20% des Codes. Warten Sie, bis die Struktur
fertig
@GeoffOxberry: Meine Frage ist nicht so spezifisch: Ich möchte nur wissen, ob die Durchführung einer Booleschen Prüfung einen Hardware- oder Compilervorteil gegenüber einer Gleitkommaoperation bietet.
Aeismail
3
Aber deine Frage ist zu allgemein. Niemand kann es sagen, ohne einen konkreten Code zu sehen. Es gibt eine Faustregel, die besagt, dass selbst die besten Programmierer ohne Profilerstellung nicht erkennen können, wo die Engpässe in ihrem Code liegen. Ich habe die letzten 25 Jahre mit Programmieren verbracht und weiß, dass das für mich zutrifft.
Wolfgang Bangerth

Antworten:

15

Meine Faustregel ist, dass es besser ist, neu zu berechnen, als zu speichern, wenn Sie eine Menge effizient berechnen können (gute Auslastung der FPU), und zwar in weniger als 50 Flops pro doppeltem Präzisionswert. Der seit Jahrzehnten anhaltende Trend geht dahin, dass sich die Fließkommafähigkeit schneller verbessert als die Speicherleistung, und aufgrund physikalischer Einschränkungen und des Energiebedarfs des schnellen Speichers wahrscheinlich nicht nachlässt. Der Wert 50 ist für alle gängigen Computerplattformen (Intel / AMD, Blue Gene und GPUs) gleich groß.

Ungefähre Kostenschätzungen pro Kern

[Richtlinien für 2011/2012 Intel- und AMD-basierte Maschinen]

  • ns: Zeit für eine Gleitkommaoperation mit doppelter Genauigkeit als Teil eines vektorisierten Codes ohne Datenabhängigkeiten und verschachteltes Multiplizieren / Addieren0.05
  • ns: Zeit für eine nicht vektorisierte Gleitkommaoperation ohne Vektorisierung oder Datenabhängigkeiten0.2
  • ns: Zeit für eine nicht vektorisierte Gleitkommaoperation ohne Vektorisierung oder Datenabhängigkeiten, jedoch ohne verschachtelte Multiplikation / Addition (1 Taktzyklus)0.4
  • bis 0,8 ns: Latenz zum Referenz-L1-Cache0.40.8
  • ns: Latenz einer Gleitkommaoperation (vektorisiert oder nicht)2
  • bis 5 ns: Zeit zum Laden eines Wertes mit doppelter Genauigkeit aus dem Speicher als Teil eines perfekt vorabgerufenen und voll ausgelasteten Streams35
  • bis 5 ns: indirekter Funktionsaufruf (virtuelle Methode oder Funktionszeiger, ohne Registerdruck)35
  • ns: bedingte Verzweigung falsch vorhergesagt5
  • bis 8 ns: Zeit für eine Division (vektorisiert oder nicht, kann nicht gleichzeitig mit anderen Anweisungen ausgeführt werden)48
  • ns: L1-Cache-Fehler von lokalem L2 erfüllt12
  • ns: Best-Case-Befehl zum Vergleichen und Vertauschen oder Abrufen und Hinzufügen von Atomen12
  • - 50 ns: L1-Schreib-Cache-Fehler oder Atomic-Befehl, bei dem die Cache-Zeile lokal verfügbar ist, der aktuelle Core jedoch exklusiven Zugriff erhalten muss3050
  • ns: Cache-Miss oder Atomic-Befehl aus dem Off-Socket oder Speicher erfüllt100
  • 1031 μ
  • 10410 μ
  • 106
  • 2106MPI_Allreduce
  • 107
  • 5108
  • 1.81012

Weitere Lektüre

Jed Brown
quelle
Ich fand diese Informationen wirklich nützlich. Woher haben Sie diese Daten übrigens? Ich suche Hinweise zum Zitieren.
Eldila