Как справиться с прогнозированием ветвлений при использовании случая переключения в эмуляции ЦП

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

В настоящее время у меня есть довольно простой, но полностью функционирующий интерпретируемый эмулятор Intel 8080, написанный на C, сердцем операции является 256-длинная таблица case switch -для обработки каждого кода операции. Моя первоначальная мысль заключалась в том, что это, очевидно, будет самый быстрый метод работы, поскольку кодирование кода операции не является согласованным во всем наборе инструкций 8080, а декодирование добавит много сложности, несогласованности и одного -несоответствия. Таблица случаев коммутатора -, заполненная макросами до -процессора, очень аккуратна и проста в обслуживании.

К сожалению, после прочтения вышеупомянутого поста мне пришло в голову, что предсказатель ветвления на моем компьютере абсолютно никак не может предсказать переход для случая переключения. Таким образом, каждый раз, когда перемещается случай переключателя -, конвейер должен быть полностью очищен,что приводит к задержке в несколько циклов в том, что в противном случае должно быть невероятно быстрой программой (. В моем коде нет даже умножения ).

Я уверен, что большинство из вас думает: «О, решение здесь простое, перейдите к динамической перекомпиляции». Да, похоже, что это урежет большую часть корпуса коммутатора -и значительно увеличит скорость. К сожалению, меня больше всего интересует эмуляция старых 8 -и 16 -битных консолей (, Intel 8080 здесь только пример, так как это мой самый простой фрагмент эмулируемого кода ), где цикл и синхронизация точно соответствуют Инструкция важна, так как видео и звук должны обрабатываться на основе этих точных временных интервалов.

При работе с таким уровнем точности производительность становится проблемой даже для старых консолей (. Посмотрите, например, на bSnes ). Есть ли какой-либо выход или это просто вопрос -факта -при работе с процессорами с длинными конвейерами?

18
задан Community 23 May 2017 в 12:08
поделиться