Могут ли предикторы ветвления точно предсказать, когда количество итераций цикла не является постоянным?

Привлечет ли следующий код штраф за неправильное предсказание ветвления, скажем, для Intel Core i7?

for(i = 0, count = *ptr; i < count; i++) {
    // do something
}

число может быть 0, 1 или 2.


person cleong    schedule 22.09.2012    source источник
comment
Недостаточно итераций, чтобы это стало предсказуемым   -  person nullpotent    schedule 22.09.2012
comment
Кода там так мало, что в этом нет смысла. Если вы выполняете это много раз во внешнем цикле, вы можете убедить компилятор развернуть цикл (или вручную развернуть цикл), чтобы вместо этого он мог использовать условные инструкции.   -  person tc.    schedule 23.09.2012


Ответы (1)


Если count изменяется случайным образом, состояние цикла невозможно предсказать. Если он ведет себя по определенному шаблону - скажем, 0,1,2,1 несколько раз - это можно было бы точно предсказать на core2 или i7. Для других шаблонов это зависит.

См. Микроархитектура процессоров Intel, AMD и VIA: руководство по оптимизации для программистов на ассемблере и разработчиков компиляторов в главе «Предсказание ветвления» для более подробного объяснения.

person Gunther Piez    schedule 23.09.2012
comment
Что, если цикл гарантированно войдет хотя бы один раз? Дает ли это предсказателю ветвления достаточно времени, чтобы распознать количество итераций, определяемое значением одного из регистров? - person cleong; 25.09.2012
comment
Предсказатель ветвления так не работает. Он не проверяет значение регистров (пока). - person Gunther Piez; 25.09.2012