Прогнозирование ветвей может быть таким эффективным. Как предполагает Питер Кордес, я проверил промахи с ответами с perf stat
. Вот результаты:
N time cycles branch-misses (%) approx-time
===============================================================
8 2.2 9,084,889,375 34,806 ( 0.00) 2.2
9 2.2 9,212,112,830 39,725 ( 0.00) 2.2
10 2.2 9,264,903,090 2,394,253 ( 0.06) 2.2
11 2.2 9,415,103,000 8,102,360 ( 0.19) 2.2
12 2.3 9,876,827,586 27,169,271 ( 0.63) 2.3
13 4.6 19,572,398,825 486,814,972 (11.33) 4.6
14 9.5 39,813,380,461 1,473,662,853 (34.31) 9.5
15 11.6 49,079,798,916 1,915,930,302 (44.61) 11.7
16 12.7 53,216,900,532 2,113,177,105 (49.20) 12.7
20 12.9 54,317,444,104 2,149,928,923 (50.06) 12.9
Note: branch-misses (%) is calculated for 2^32 branches
Как вы можете видеть, когда N<=12
, предиктор ветвления может предсказать большинство ветвей (что удивительно: предиктор ветвления может запомнить результат 4096 последовательных случайных ветвлений!). Когда N>12
, промахи начинают расти. На N>=16
он может только правильно прогнозировать ~ 50%, что означает, что он так же эффективен, как случайные броски монет.
Требуемое время можно приблизить, посмотрев на столбец времени и пропущенных переходов (%): я добавил последний столбец, approx-time
. Я рассчитал это следующим образом: 2.2+(12.9-2.2)*branch-misses %/100
. Как видите, approx-time
равно time
(без учета ошибки округления). Таким образом, этот эффект можно прекрасно объяснить с помощью предсказания ветвлений
Первоначально предполагалось рассчитать, сколько циклов обходится из-за пропущенной ветви (в данном конкретном случае - как и в других случаях это число может отличаться):
(54,317,444,104-9,084,889,375)/(2,149,928,923-34,806) = 21.039 = ~21 cycles.