Lições aprendidas otimizando convoluções com SIMD: previsão de ramificações e problemas do compilador
O autor tentou otimizar operações de convolução usando instruções SIMD, mas encontrou uma degradação de desempenho. A implementação inicial usou cargas SIMD, instruções FMA e técnicas de otimização de loop, mas foi mais de duas vezes mais lenta do que a versão não vetorializada. Após a depuração, o problema foi encontrado em instruções de ramificação excessivas causando falhas na previsão de ramificação da CPU e limitações de tamanho de função inline do compilador, impedindo o uso adequado do conjunto de instruções AVX. Finalmente, reduzindo a ramificação, dividindo loops e usando adequadamente atributos de inline do compilador, o autor conseguiu melhorar o desempenho para o nível esperado. Este estudo de caso ilustra a complexidade das arquiteturas modernas de CPU e os detalhes que precisam ser considerados na otimização de desempenho.