Created attachment 9208 [details] to reproduce misaligned loop Мужчины, надеюсь что импортонезависимость вашего дистрибутива день ото дня крепчает. Я написал тугой цикл, который должен выполняться со скоростью 2.5 цикла на итерацию, а он выполняется со скоростью 3.5 цикла на итерацию. Я некоторое время чесал репу, пока не заметил, что компилятор выравнивает этот цикл на 12 mod 16, и даже более того 28 mod 32, и даже более того 60 mod 64! Приложил файл bench-patch.c (из своего репозитория pfor16.git), на котором можно воспроизвести невыровненный цикл. while (e1--) { unsigned w = Bload16le(src); unsigned i = w & Mask(7); unsigned x = w >> 7; src += 2; v[i] += x << m; } $ gcc -DPatch=patch128 -DM=2 -g -O2 -Wall bench-patch.c && objdump -S ./a.out | sed -n '/while (e1--)/,/AGGR/p' while (e1--) { 12b1: 4c 89 c2 mov %r8,%rdx 12b4: 85 c9 test %ecx,%ecx 12b6: 0f 84 84 00 00 00 je 1340 <bench+0x1e0> 12bc: 0f b7 02 movzwl (%rdx),%eax 12bf: 48 83 c2 02 add $0x2,%rdx 12c3: 49 89 c6 mov %rax,%r14 12c6: c1 e8 05 shr $0x5,%eax 12c9: 41 83 e6 7f and $0x7f,%r14d 12cd: 25 fc 07 00 00 and $0x7fc,%eax 12d2: 66 42 01 04 76 add %ax,(%rsi,%r14,2) 12d7: 4c 39 fa cmp %r15,%rdx 12da: 75 e0 jne 12bc <bench+0x15c> Мужчины, "jne 12bc" - это как такое выравнивание называется? Это выравнивание называется последние четыре байта кеш-линии. Что-то не так у вас в консерватории. $ gcc --version x86_64-alt-linux-gcc (GCC) 10.2.1 20201125 (ALT Sisyphus 10.2.1-alt2)