- Este artículo analiza una implementación general de búsqueda binaria en C++ que es el doble de rápida y más corta que la función estándar
std::lower_bound.
- La nueva implementación es "sin ramas" porque se compila usando instrucciones de movimiento condicional en lugar de ramas/saltos condicionales.
- La búsqueda binaria funciona dividiendo una lista ordenada en dos partes en el elemento medio y comparando el valor medio con un valor dado. Según el resultado de la comparación, decide en cuál de las dos sublistas seguir buscando.
- El artículo también analiza el concepto de predicción de ramas, una técnica con la que el procesador ejecuta instrucciones en paralelo para aumentar la velocidad. Sin embargo, como la búsqueda binaria es impredecible, la predicción de ramas no es ideal.
- El autor presenta una nueva implementación de búsqueda binaria,
sb_lower_bound, que es más rápida que la implementación estándar y que la versión branchless_lower_bound. Es más rápida porque tiene muchas menos instrucciones dentro del bucle.
- El autor también presenta una versión aún más rápida,
bb_lower_bound, que usa otro método para dividir la lista de búsqueda.
- El artículo concluye sugiriendo que, si la parte más lenta de tu programa incluye búsquedas y/o comparaciones que el procesador no puede predecir, pruebes
clang con -mllvm -x86-cmov-converter=false. Si necesitas una búsqueda binaria más rápida, prueba sb_lower_bound.
- El autor también proporciona código para las nuevas implementaciones de búsqueda binaria y analiza en detalle el rendimiento de cada una.
- El artículo fue actualizado con una versión refactorizada de
sb_lower_bound que reduce la cantidad de instrucciones de ensamblador en el bucle crítico de 9 a 8, lo que mejora ligeramente la velocidad.
- El autor también analiza el concepto de prefetching, que consiste en traer ciertas partes de la memoria a la caché para que, cuando los datos precargados realmente se necesiten, solo haya latencia de caché L1/L2. También se ofrece una versión de
sb_lower_bound con prefetching agregado para 256 KB o más.
- El artículo fue escrito por Mihail Dumitrescu y publicado el 24 de junio de 2023.
1 comentarios
Opiniones en Hacker News
lowerBound.sb_lower_boundpara tipos básicos ystd::lower_boundpara todo lo demás.