Почему все машины имеют два этапа (LOOP <25 и LOOP> 100)?
Первый разрыв возникает, когда самый внутренний цикл, for(j = 0;j < LOOP;j += 1)
, перестает правильно предсказывать свой выход,На моей машине это происходит, когда LOOP
достигает 24 итераций.
Вы можете увидеть это довольно ясно с помощью perf stat -I3000
, чтобы чередовать выходные данные теста с характеристиками производительности:
BenchWithFixture/RandomTarget/21 727779 ns 727224 ns 3851 78.6834M items/s
45.003283831 2998.636997 task-clock (msec)
45.003283831 118 context-switches # 0.039 K/sec
45.003283831 0 cpu-migrations # 0.000 K/sec
45.003283831 0 page-faults # 0.000 K/sec
45.003283831 7,777,209,518 cycles # 2.595 GHz
45.003283831 26,846,680,371 instructions # 3.45 insn per cycle
45.003283831 6,711,087,432 branches # 2238.882 M/sec
45.003283831 1,962,643 branch-misses # 0.03% of all branches
BenchWithFixture/RandomTarget/22 751421 ns 750758 ns 3731 76.2169M items/s
48.003487573 2998.943341 task-clock (msec)
48.003487573 111 context-switches # 0.037 K/sec
48.003487573 0 cpu-migrations # 0.000 K/sec
48.003487573 0 page-faults # 0.000 K/sec
48.003487573 7,778,285,186 cycles # 2.595 GHz
48.003487573 26,956,175,646 instructions # 3.47 insn per cycle
48.003487573 6,738,461,171 branches # 2247.947 M/sec
48.003487573 1,973,024 branch-misses # 0.03% of all branches
BenchWithFixture/RandomTarget/23 774490 ns 773955 ns 3620 73.9325M items/s
51.003697814 2999.024360 task-clock (msec)
51.003697814 105 context-switches # 0.035 K/sec
51.003697814 0 cpu-migrations # 0.000 K/sec
51.003697814 0 page-faults # 0.000 K/sec
51.003697814 7,778,570,598 cycles # 2.595 GHz
51.003697814 21,547,027,451 instructions # 2.77 insn per cycle
51.003697814 5,386,175,806 branches # 1796.776 M/sec
51.003697814 72,207,066 branch-misses # 1.12% of all branches
BenchWithFixture/RandomTarget/24 1138919 ns 1138088 ns 2461 50.2777M items/s
57.004129981 2999.003582 task-clock (msec)
57.004129981 108 context-switches # 0.036 K/sec
57.004129981 0 cpu-migrations # 0.000 K/sec
57.004129981 0 page-faults # 0.000 K/sec
57.004129981 7,778,509,575 cycles # 2.595 GHz
57.004129981 19,061,717,197 instructions # 2.45 insn per cycle
57.004129981 4,765,017,648 branches # 1589.492 M/sec
57.004129981 103,398,285 branch-misses # 1.65% of all branches
BenchWithFixture/RandomTarget/25 1171572 ns 1170748 ns 2391 48.8751M items/s
60.004325775 2998.547350 task-clock (msec)
60.004325775 111 context-switches # 0.037 K/sec
60.004325775 0 cpu-migrations # 0.000 K/sec
60.004325775 0 page-faults # 0.000 K/sec
60.004325775 7,777,298,382 cycles # 2.594 GHz
60.004325775 17,008,954,992 instructions # 2.19 insn per cycle
60.004325775 4,251,656,734 branches # 1418.230 M/sec
60.004325775 131,311,948 branch-misses # 2.13% of all branches
Перед переходом коэффициент ошибочного прогнозирования ветвления составляет около 0,03%, а затем он скачетпримерно до 2,13% справа, когда тест замедляется, или увеличение на два порядка.Уровень ошибочных прогнозов на самом деле немного ниже, чем вы ожидаете: с 25 ответвлениями (плюс еще пара для внешних циклов) вы ожидаете около 1 / 25 == 4%
ошибочных прогнозов, но мы не видим этого, не зная почему.
На моей машине первый цикл (только с вызовом pool[0](0,0,0,0,0)
), как и ваш, не имеет перехода при ~ 24 LOOP
итерациях, но почему мне не понятно.Мой опыт показывает, что счетчики TAGE обычно не могут обрабатывать циклы с постоянной итерацией длиннее 24-х циклов, но здесь может быть некоторое взаимодействие с косвенным предиктором ветвления.Это довольно интересно.
Почему все время без исполнения имеет странный пик, когда 32 <= LOOP <= 41? </p>
Я также испытал это локально.В моем тесте это также было связано с неправильными прогнозами в ветвях: когда время шло, ошибались и прогнозы.Опять же, как работает прогнозирование (так хорошо), здесь неясно, но, очевидно, при этих значениях алгоритм получает ошибки прогнозирования.
Почему время без исполнения и время исполнения у машин Kaby Lake(M1 и M2) имеют прерывистый интервал, когда 72 <= LOOP <= 94? </p>
Я испытал то же самое: итерация 72 работала со скоростью 28M циклов в секунду, а итерация 73 только со скоростью 20M (ипоследующие итерации тоже были медленными).Опять же, различие может быть связано с ошибочными прогнозами ветвлений: они увеличились с 0,01% до 1,35% с итерации 72 до 73. Это почти точно одно неверное прогнозирование на выполнение внешнего цикла, поэтому, скорее всего, это неверный прогноз при выходе.
Почему M4 (серверный процессор) имеет большую дисперсию по сравнению с M3 (процессор для настольных ПК)?
Ваш тест очень длинный, поэтому в нем много измененийиспытывать различные источники дисперсии, такие как прерывания, переключение контекста, изменения частоты ядра и так далее.
Поскольку это совершенно другая аппаратная и, возможно, программная конфигурация, неудивительно, что наблюдается неравномерное отклонение.Вы можете уменьшить количество внешних итераций, чтобы сократить эталонный тест и посмотреть, уменьшится ли количество выбросов (но их величина увеличится).Вы также можете переместить синхронизацию во внешнем цикле, поэтому вы синхронизируете меньшую секцию и посмотрите на гистограмму, чтобы увидеть, как результаты различных систем распределяются за этот меньший интервал.
Для более глубокого взгляда на источникиДисперсия и как их диагностировать, посмотрите на этот ответ .