5

Я хотел бы знать, как писать эффективные таблицы перехода для процессоров x64, либо в C, C++, либо в сборку. Ввод известен заранее, но невозможно предсказать алгоритмически. Предполагая, что я могу смотреть так далеко вперед, как хочу во входном потоке, есть ли способ, который я могу динамически сказать процессору, который адресует следующую ветку, будет идти?Как я могу динамически намекнуть цель ветвления на процессор x64?

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

Понимая, что это очень конкретный вопрос, и что я, вероятно, не смогли передать это правильно, вот несколько альтернативных формулировок:

Есть ли x64 эквивалентно hbr Hint для отделения на процессоре Cell ?

Помогает ли сборка cmp раньше, чем ее условная ветвь, как у Itanium?

Является ли предсказанная цель косвенного прыжка когда-либо на основе значения регистра вместо последнего используемого адреса?

Спасибо!

ответ

1

Если вам не удается найти точный ответ, вы можете использовать предиктор обратного адреса вместо целевого буфера ветви. Общая методика называется контекстной резьбой, а описание можно найти в статье Context Threading: A Flexible and Efficient Dispatch Technique for Virtual Machine Interpreters.

Идея для вас: если вы можете смотреть достаточно далеко в будущее, для каждого входа, который определяет изменение потока управления, вы JIT-компилируете/испускаете одну прямую инструкцию call в некоторую исполняемую память. Например, если у вас было десять единиц ввода, вы выбрали бы 10 вызовов.

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

Одностороннее примечание, я не человек архитектуры ЦП, поэтому я, возможно, упрощаю вещи, но в принципе я думаю, что это должно сработать.