- Dieser Artikel behandelt eine allgemeine C++-Implementierung der binären Suche, die kürzer ist und doppelt so schnell wie die Standardfunktion
std::lower_bound.
- Die neue Implementierung ist „branchless“, weil sie zu bedingten Move-Instruktionen statt zu Verzweigungen/bedingten Sprüngen kompiliert wird.
- Die binäre Suche funktioniert, indem sie eine sortierte Liste am mittleren Element in zwei Teile aufteilt und den mittleren Wert mit einem gegebenen Wert vergleicht. Je nach Vergleichsergebnis wird entschieden, in welcher der beiden Teillisten weitergesucht wird.
- Der Artikel behandelt außerdem das Konzept der Sprungvorhersage, eine Technik, mit der Prozessoren Befehle parallel ausführen, um die Geschwindigkeit zu erhöhen. Da die binäre Suche jedoch unvorhersehbar ist, ist die Sprungvorhersage hier nicht ideal.
- Der Autor stellt
sb_lower_bound vor, eine neue Implementierung der binären Suche, die schneller ist als die Standardimplementierung und die Version branchless_lower_bound. Sie ist schneller, weil die Schleife deutlich weniger Instruktionen enthält.
- Der Autor präsentiert außerdem
bb_lower_bound, eine noch schnellere Version, die eine andere Methode zum Aufteilen der Suchliste verwendet.
- Der Artikel endet mit dem Vorschlag: Wenn der langsamste Teil eines Programms Suchvorgänge und/oder Vergleiche enthält, die der Prozessor nicht vorhersagen kann, sollte man clang mit
-mllvm -x86-cmov-converter=false ausprobieren. Wenn eine schnellere binäre Suche benötigt wird, sollte man sb_lower_bound testen.
- Der Autor stellt außerdem Code für die neuen Implementierungen der binären Suche bereit und diskutiert ihre jeweilige Leistung im Detail.
- Der Artikel wurde außerdem mit einer refaktorierten Version von
sb_lower_bound aktualisiert, die die Anzahl der Assembler-Instruktionen in der Hot Loop von 9 auf 8 reduziert, was zu einer leichten Geschwindigkeitssteigerung führt.
- Der Autor behandelt außerdem das Konzept des Prefetching, bei dem bestimmte Speicherbereiche in den Cache geladen werden, sodass beim tatsächlichen Bedarf der vorab geholten Daten nur noch L1/L2-Cache-Latenzen anfallen. Es wird auch eine Version von
sb_lower_bound mit zusätzlichem Prefetching für 256 KB+ bereitgestellt.
- Der Artikel wurde von Mihail Dumitrescu geschrieben und am 24. Juni 2023 veröffentlicht.
1 Kommentare
Hacker-News-Kommentare
lowerBounddie Sprache Nim zu verwenden, die in eine "Bare-Metal"-Sprache kompiliert wird.sb_lower_boundund ansonstenstd::lower_boundverwendet.cmov-Transformations-Pass beeinflusst, und es wird ein Link für weitere Informationen bereitgestellt.