В последнее время много игрался с ARM архитектурой, и сегодня я наткнулся в x86 микробенчмарке на так называемый Jump Conditional Code Erratum, который при jmp инструкциях, которые попадают на границу кешлинии и могут замедлять горячие циклы по двойной лэтенси того самого кэша, а и в редких случаях его инвалидировать. И компиляторы/линкеры это не детектят из-за нетривиального оверхеда на размер бинаря или просто потому что это очень новая (2019) находка. Но присутствует с процессоров Sandy Bridge.



Помогает выставить -mbranches-within-32B-boundaries в компиляторах, насладиться 1% оверхеда размера бинаря и чтобы такое никогда не возникало в жизни.



Это даже выглядит как какой-то ужастик. Вы пишите код, выравнивание цикла ломается в совершенно другом месте. Ваш код откатывают, потому что "бенчмарки просели", а вы с этим местом ничего общего не имеете. Вообще.



В ARM такой проблемы быть не может, так как все инструкции по размеру 4 байта, в x86 оно переменное. Надеюсь, ARM возьмёт своё в итоге.