Разница между ошибочно предсказанными ветвями и выполненными неверно предсказанными ветвями

У меня есть необычный случай, когда я изучаю относительно тривиальную Java, которая должна хорошо предсказывать поведение ветвления, но likwid-perfctr сообщает об огромной (50%) вероятности неверного предсказания ветвления. Тем не менее, время выполнения не согласуется с этой ошибкой прогнозирования (ИПЦ очень низкий, около 0,3, а задержки на передней и задней части низкие). Подобная программа на C++ не подвержена ошибкам, но на самом деле имеет немного более длительное время выполнения.

Похоже, что расхождение в событиях BR_MISP_RETIRED_ALL_BRANCHES и BR_MISP_EXEC_ANY. Первый, который используется для вычисления коэффициента неверных прогнозов, является большим, по одному событию в цикле. Последний, очень маленький, согласуется с ожидаемой ошибкой прогнозирования, а также с временем выполнения.

Для других примеров программ, которые я пробовал, которые показывают серьезные неправильные прогнозы (например, ветвление на случайное значение в массиве), значения очень похожи.

Кто-нибудь знает точное значение этих двух счетчиков? Как может счетчик "отставки" быть в 25 раз больше, чем счетчик "exec" для неправильно предсказанных ветвей - когда любая ветвь должна быть выполнена до того, как она будет удалена?

0 ответов

Другие вопросы по тегам