Может ли быть унаследована оптимизация предсказания ветвлений? - PullRequest
1 голос
/ 21 июня 2020

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

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Это может иметь смысл в ограниченном смысле.

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

Для интерпретатора это кажется немного менее полезно, но можно представить себе некоторые сложные конструкции, которые объединяют некоторые смежные инструкции вместе в одну операцию для повышения эффективности, и это может выиграть от предсказания ветвления. Точно так же интерпретатор может выиграть от распознавания циклов.

0 голосов
/ 21 июня 2020

По-видимому, вы говорите о виртуальной машине, которая интерпретирует байт-код, а не аппаратную виртуализацию ЦП.

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

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

Обратите внимание, что для чистого интерпретатора, не использующего JITing, управляющие зависимости в гостевом коде становятся зависимостями данных в интерпретаторе, в то время как последовательность различных инструкций в гостевой системе создает управляющую зависимость в интерпретаторе (для отправки в функции обработчика). См. Как именно R зависит от предсказания ветвлений?

Возможно, вам нужно позаботиться о предсказании ветвлений в процессоре, который будет запускать ваш код. В последнее время (как Intel после Haswell) процессоры, наконец, неплохо подходят для этого, используя предикторы IT-TAGE: Прогнозирование ветвлений и производительность интерпретаторов - не верьте фольклору .

Вы не 't реализует предсказание ветвлений в программном обеспечении, но для старых процессоров это стоило настройки интерпретаторов с учетом аппаратного предсказания ветвлений. Оптимизация предварительной выборки X86: поточный код "вычисленного перехода" имеет некоторые ссылки, особенно статью Дарека Михоцки , в которой обсуждается, насколько плохо это отстойно для старых процессоров (текущих на момент написания) на иметь одну «большую центральную» ветвь диспетчеризации, например, один switch, в который возвращается каждая функция-обработчик инструкций. Это означает, что весь шаблон, которому должна следовать инструкция, какая другая инструкция должна быть предсказана для этого единственного перехода. Без чего-то вроде IT-TAGE состояние прогнозирования для одной ветки очень ограничено.

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

...