История изменений
Исправление firkax, (текущая версия) :
Athlon II X4 620 (2600MHz, но кажется какой-то cpufreq governor его меняет и ставит 800 при idle), Linux
На первой итерации цикл оказывается такой:
119d: 48 8b 04 ce mov (%rsi,%rcx,8),%rax
11a1: 48 19 04 cf sbb %rax,(%rdi,%rcx,8)
11a5: 48 ff c1 inc %rcx
11a8: 75 f3 jne 119d <.bL11>
Т.е. медленно если цикл начинается на b4..bf, разница всё так же на 30-35%.
ZEROADD=0 avg=168 | 199 162 162 162 162 162
ZEROADD=1 avg=167 | 199 162 161 162 162 161
ZEROADD=2 avg=168 | 199 162 163 162 163 162
ZEROADD=3 avg=125 | 157 119 120 119 119 119
ZEROADD=4 avg=125 | 156 120 119 119 120 119
ZEROADD=5 avg=123 | 143 119 119 120 119 119
ZEROADD=6 avg=125 | 153 120 119 119 120 119
ZEROADD=7 avg=118 | 119 118 119 118 119 118
ZEROADD=8 avg=125 | 157 120 119 120 119 119
ZEROADD=9 avg=120 | 152 114 115 114 115 114
ZEROADD=10 avg=120 | 150 115 115 114 115 115
ZEROADD=11 avg=131 | 160 125 126 126 125 126
ZEROADD=12 avg=122 | 150 116 117 117 117 116
ZEROADD=13 avg=122 | 152 117 117 116 117 117
ZEROADD=14 avg=118 | 119 118 119 118 119 119
ZEROADD=15 avg=122 | 149 117 117 116 117 117
ZEROADD=16 avg=124 | 155 118 119 118 119 118
ZEROADD=17 avg=124 | 156 119 118 119 119 118
ZEROADD=18 avg=123 | 142 120 119 119 120 119
ZEROADD=19 avg=134 | 163 129 130 129 129 129
ZEROADD=20 avg=129 | 162 123 123 124 123 124
ZEROADD=21 avg=127 | 148 124 123 123 123 124
ZEROADD=22 avg=134 | 166 128 128 128 129 127
ZEROADD=23 avg=161 | 162 161 162 162 161 162
ZEROADD=24 avg=168 | 200 161 162 162 161 162
ZEROADD=25 avg=169 | 197 164 164 164 164 164
ZEROADD=26 avg=170 | 199 164 164 164 165 164
ZEROADD=27 avg=167 | 199 162 162 161 162 161
ZEROADD=28 avg=168 | 200 163 162 162 163 162
ZEROADD=29 avg=167 | 199 160 161 161 161 161
ZEROADD=30 avg=161 | 161 163 161 161 161 161
ZEROADD=31 avg=166 | 196 161 161 161 161 160
ZEROADD=32 avg=168 | 199 162 162 162 163 162
ZEROADD=33 avg=161 | 162 161 162 162 162 162
ZEROADD=34 avg=162 | 163 162 162 163 162 162
ZEROADD=35 avg=119 | 119 120 119 119 120 119
ZEROADD=36 avg=119 | 120 119 120 119 119 120
ZEROADD=37 avg=119 | 119 120 119 119 120 119
ZEROADD=38 avg=122 | 122 123 122 122 123 122
ZEROADD=39 avg=119 | 119 121 119 118 119 118
...
Athlon II X2 3000MHz downclock to 800 MHz, FreeBSD
0000000000400992 <.bL11>:
400992: 48 8b 04 ce mov (%rsi,%rcx,8),%rax
400996: 48 19 04 cf sbb %rax,(%rdi,%rcx,8)
40099a: 48 ff c1 inc %rcx
40099d: 75 f3 jne 400992 <.bL11>
ZEROADD=0 avg=423 | 425 424 426 424 422 422
ZEROADD=1 avg=438 | 442 438 438 435 439 439
ZEROADD=2 avg=552 | 553 552 551 552 556 549
ZEROADD=3 avg=553 | 553 559 555 553 552 550
ZEROADD=4 avg=559 | 560 558 559 563 558 556
ZEROADD=5 avg=560 | 560 559 561 562 561 561
ZEROADD=6 avg=553 | 553 557 553 552 553 555
ZEROADD=7 avg=556 | 555 558 555 562 556 555
ZEROADD=8 avg=549 | 548 548 551 550 546 551
ZEROADD=9 avg=550 | 552 552 549 551 550 551
ZEROADD=10 avg=551 | 550 549 556 552 554 549
ZEROADD=11 avg=553 | 552 551 558 551 554 553
ZEROADD=12 avg=552 | 553 554 553 551 554 552
ZEROADD=13 avg=552 | 554 554 553 552 552 548
ZEROADD=14 avg=408 | 402 407 406 409 418 407
ZEROADD=15 avg=410 | 410 409 411 415 409 407
ZEROADD=16 avg=409 | 409 409 409 411 408 410
ZEROADD=17 avg=409 | 407 407 412 412 408 408
ZEROADD=18 avg=406 | 413 406 404 405 403 407
ZEROADD=19 avg=410 | 419 411 408 408 411 408
ZEROADD=20 avg=390 | 391 394 391 390 390 389
ZEROADD=21 avg=392 | 394 392 392 392 393 391
ZEROADD=22 avg=429 | 429 432 431 428 431 428
ZEROADD=23 avg=407 | 400 401 399 405 419 419
ZEROADD=24 avg=411 | 416 417 418 412 401 402
ZEROADD=25 avg=402 | 403 404 403 399 407 401
ZEROADD=26 avg=401 | 404 403 403 401 399 399
ZEROADD=27 avg=406 | 404 406 405 409 410 405
ZEROADD=28 avg=405 | 405 405 407 406 405 404
ZEROADD=29 avg=408 | 409 409 408 406 409 407
ZEROADD=30 avg=432 | 436 432 431 433 432 432
ZEROADD=31 avg=428 | 426 432 430 430 427 428
ZEROADD=32 avg=423 | 425 422 426 422 422 421
ZEROADD=33 avg=439 | 439 438 443 444 436 438
ZEROADD=34 avg=552 | 552 551 554 556 551 551
...
Замедление если начало 94..9f - в целом то же самое.
Однако это всё не совпадает с изначальным тестом где замедление было на ba..c5 т.е. на 6 байт ниже. Ещё не выяснил от чего зависит, но по-моему это намёк на то что границы 16-байтовых блоков с адресами заканчивающимися на 0 тут ни при чём (да и цикличность тут не 16 а 32-байтовая)
Исходная версия firkax, :
Athlon II X4 620, Linux
На первой итерации цикл оказывается такой:
119d: 48 8b 04 ce mov (%rsi,%rcx,8),%rax
11a1: 48 19 04 cf sbb %rax,(%rdi,%rcx,8)
11a5: 48 ff c1 inc %rcx
11a8: 75 f3 jne 119d <.bL11>
Т.е. медленно если цикл начинается на b4..bf, разница всё так же на 30-35%.
ZEROADD=0 avg=168 | 199 162 162 162 162 162
ZEROADD=1 avg=167 | 199 162 161 162 162 161
ZEROADD=2 avg=168 | 199 162 163 162 163 162
ZEROADD=3 avg=125 | 157 119 120 119 119 119
ZEROADD=4 avg=125 | 156 120 119 119 120 119
ZEROADD=5 avg=123 | 143 119 119 120 119 119
ZEROADD=6 avg=125 | 153 120 119 119 120 119
ZEROADD=7 avg=118 | 119 118 119 118 119 118
ZEROADD=8 avg=125 | 157 120 119 120 119 119
ZEROADD=9 avg=120 | 152 114 115 114 115 114
ZEROADD=10 avg=120 | 150 115 115 114 115 115
ZEROADD=11 avg=131 | 160 125 126 126 125 126
ZEROADD=12 avg=122 | 150 116 117 117 117 116
ZEROADD=13 avg=122 | 152 117 117 116 117 117
ZEROADD=14 avg=118 | 119 118 119 118 119 119
ZEROADD=15 avg=122 | 149 117 117 116 117 117
ZEROADD=16 avg=124 | 155 118 119 118 119 118
ZEROADD=17 avg=124 | 156 119 118 119 119 118
ZEROADD=18 avg=123 | 142 120 119 119 120 119
ZEROADD=19 avg=134 | 163 129 130 129 129 129
ZEROADD=20 avg=129 | 162 123 123 124 123 124
ZEROADD=21 avg=127 | 148 124 123 123 123 124
ZEROADD=22 avg=134 | 166 128 128 128 129 127
ZEROADD=23 avg=161 | 162 161 162 162 161 162
ZEROADD=24 avg=168 | 200 161 162 162 161 162
ZEROADD=25 avg=169 | 197 164 164 164 164 164
ZEROADD=26 avg=170 | 199 164 164 164 165 164
ZEROADD=27 avg=167 | 199 162 162 161 162 161
ZEROADD=28 avg=168 | 200 163 162 162 163 162
ZEROADD=29 avg=167 | 199 160 161 161 161 161
ZEROADD=30 avg=161 | 161 163 161 161 161 161
ZEROADD=31 avg=166 | 196 161 161 161 161 160
ZEROADD=32 avg=168 | 199 162 162 162 163 162
ZEROADD=33 avg=161 | 162 161 162 162 162 162
ZEROADD=34 avg=162 | 163 162 162 163 162 162
ZEROADD=35 avg=119 | 119 120 119 119 120 119
ZEROADD=36 avg=119 | 120 119 120 119 119 120
ZEROADD=37 avg=119 | 119 120 119 119 120 119
ZEROADD=38 avg=122 | 122 123 122 122 123 122
ZEROADD=39 avg=119 | 119 121 119 118 119 118
...
Athlon II X2, FreeBSD
0000000000400992 <.bL11>:
400992: 48 8b 04 ce mov (%rsi,%rcx,8),%rax
400996: 48 19 04 cf sbb %rax,(%rdi,%rcx,8)
40099a: 48 ff c1 inc %rcx
40099d: 75 f3 jne 400992 <.bL11>
ZEROADD=0 avg=423 | 425 424 426 424 422 422
ZEROADD=1 avg=438 | 442 438 438 435 439 439
ZEROADD=2 avg=552 | 553 552 551 552 556 549
ZEROADD=3 avg=553 | 553 559 555 553 552 550
ZEROADD=4 avg=559 | 560 558 559 563 558 556
ZEROADD=5 avg=560 | 560 559 561 562 561 561
ZEROADD=6 avg=553 | 553 557 553 552 553 555
ZEROADD=7 avg=556 | 555 558 555 562 556 555
ZEROADD=8 avg=549 | 548 548 551 550 546 551
ZEROADD=9 avg=550 | 552 552 549 551 550 551
ZEROADD=10 avg=551 | 550 549 556 552 554 549
ZEROADD=11 avg=553 | 552 551 558 551 554 553
ZEROADD=12 avg=552 | 553 554 553 551 554 552
ZEROADD=13 avg=552 | 554 554 553 552 552 548
ZEROADD=14 avg=408 | 402 407 406 409 418 407
ZEROADD=15 avg=410 | 410 409 411 415 409 407
ZEROADD=16 avg=409 | 409 409 409 411 408 410
ZEROADD=17 avg=409 | 407 407 412 412 408 408
ZEROADD=18 avg=406 | 413 406 404 405 403 407
ZEROADD=19 avg=410 | 419 411 408 408 411 408
ZEROADD=20 avg=390 | 391 394 391 390 390 389
ZEROADD=21 avg=392 | 394 392 392 392 393 391
ZEROADD=22 avg=429 | 429 432 431 428 431 428
ZEROADD=23 avg=407 | 400 401 399 405 419 419
ZEROADD=24 avg=411 | 416 417 418 412 401 402
ZEROADD=25 avg=402 | 403 404 403 399 407 401
ZEROADD=26 avg=401 | 404 403 403 401 399 399
ZEROADD=27 avg=406 | 404 406 405 409 410 405
ZEROADD=28 avg=405 | 405 405 407 406 405 404
ZEROADD=29 avg=408 | 409 409 408 406 409 407
ZEROADD=30 avg=432 | 436 432 431 433 432 432
ZEROADD=31 avg=428 | 426 432 430 430 427 428
ZEROADD=32 avg=423 | 425 422 426 422 422 421
ZEROADD=33 avg=439 | 439 438 443 444 436 438
ZEROADD=34 avg=552 | 552 551 554 556 551 551
...
Замедление если начало 94..9f - в целом то же самое.
Однако это всё не совпадает с изначальным тестом где замедление было на ba..c5 т.е. на 6 байт ниже. Ещё не выяснил от чего зависит, но по-моему это намёк на то что границы 16-байтовых блоков с адресами заканчивающимися на 0 тут ни при чём (да и цикличность тут не 16 а 32-байтовая)