Beim Lesen von Artikeln finde ich häufig Oct-Tree-Implementierungen von Geometriedarstellungen, um die Daten zu sortieren. Wenn ich jedoch über das Problem nachdenke, scheinen Hash-Tabellen insgesamt besser zu sein.
Hash-Tabellen bieten für die meisten Anwendungen bessere Durchschnitts- und schlechtere Szenarien:
Wenn Sie beispielsweise einen Okt-Baum durch Raytracing verfolgen, werden Sie durch Beinaheunfälle durch eine binäre Baumsubstruktur iteriert, die O (nlogn) ist, während die Hash-Tabelle O (n) ist.
Hash-Tabellen sind in der GPU einfacher zu generieren, da sie keine andere logische Position im Speicher als ihre Hash-Position benötigen.
Die meisten Vorteile, die Baumstrukturen gegenüber Hash-Tabellen haben, scheinen auch auf der GPU nicht zu gelten.
In Grafiken mögen wir es nicht, Speicher neu zuzuweisen, daher weisen wir normalerweise zu viel Speicher im VRAM zu, um eine Datenstruktur wiederverwenden zu können. Daher scheinen die Eigenschaften von Binärbäumen (speichereffizient) für GPU-Anwendungen nicht sehr relevant zu sein.
Die Datenkohärenz für das Caching scheint ebenfalls nicht zu gelten. Bei einem GPU-generierten Baum ist es aufgrund der Asynchronität sehr schwierig zu gewährleisten, dass logisch geschlossene Werte auch im zugrunde liegenden Speicher nahe beieinander gespeichert werden. Sie werden also sowieso um Zeiger herumspringen.
Es ist auch viel einfacher, bestimmte GPU-freundliche Heuristiken in einer Hash-Tabelle zu erzwingen als in einem Baum. Begrenzen Sie beispielsweise die Anzahl der Hash-Lookups auf eine feste Anzahl, z. B. 20, und verwenden Sie dieselbe Logik, um zu verhindern, dass Warps unterschiedliche Verzweigungscodes ausführen. Im Wesentlichen können Sie immer die 20 möglichen Kollisionen überprüfen und das Ergebnis einfach mit der Zelle interpolieren, die den Schlüssel enthält. In einem Baum hängt das Durchlaufen der Datenstruktur viel mehr von den Daten selbst und weniger von der Datenstruktur ab.
Warum werden Okt-Bäume so viel häufiger verwendet als Hash-Tabellen?