- Este artigo discute uma implementação genérica de busca binária em C++ que é duas vezes mais rápida e mais curta que a função padrão
std::lower_bound.
- A nova implementação é "sem desvios" porque é compilada usando instruções de movimento condicional em vez de desvios/saltos condicionais.
- A busca binária funciona dividindo uma lista ordenada em duas partes no item do meio e comparando o valor central com um valor fornecido. Dependendo do resultado da comparação, decide-se em qual das duas sublistas continuar procurando.
- O artigo também discute o conceito de predição de desvios, uma técnica em que o processador executa instruções em paralelo para acelerar a execução. No entanto, como a busca binária é imprevisível, a predição de desvios não é ideal.
- O autor apresenta
sb_lower_bound, uma nova implementação de busca binária mais rápida que a implementação padrão e que a versão branchless_lower_bound. Ela é mais rápida porque há muito menos instruções dentro do loop.
- O autor também apresenta
bb_lower_bound, uma versão ainda mais rápida que usa outro método para particionar a lista de busca.
- O artigo termina com a sugestão de que, se a parte mais lenta do seu programa envolve buscas e/ou comparações que o processador não consegue prever, vale tentar usar o clang com
-mllvm -x86-cmov-converter=false. Se você precisar de uma busca binária mais rápida, experimente sb_lower_bound.
- O autor também fornece o código das novas implementações de busca binária e discute detalhadamente o desempenho de cada uma.
- O artigo foi atualizado com uma versão refatorada de
sb_lower_bound, reduzindo o número de instruções de assembly no loop crítico de 9 para 8, o que trouxe uma pequena melhora de velocidade.
- O autor também discute o conceito de prefetching, que consiste em trazer partes específicas da memória para o cache para que, quando os dados pré-buscados forem realmente necessários, haja apenas a latência do cache L1/L2. Também é fornecida uma versão de
sb_lower_bound com prefetching adicionado para 256 KB+.
- O artigo foi escrito por Mihail Dumitrescu e publicado em 24 de junho de 2023.
1 comentários
Opiniões no Hacker News
lowerBound.sb_lower_boundpara tipos primitivos estd::lower_boundnos demais casos.cmove fornece um link para mais informações.