Как посчитать количество гостевых инструкций, выполненных QEMU от начала до конца прогона? - PullRequest
0 голосов

Я хочу сравнить гостевые инструкции в секунду QEMU, чтобы сравнить их с другими симуляторами.

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

Единственное решение, которое у меня сейчас есть, - записывать все инструкции с помощью простой трассировки exec_tb или -d in_asm: Как использовать простой QEMUтрассировать бэкэнд? и затем посчитать оттуда инструкции. Но это, вероятно, значительно снизит производительность моделирования из-за операций вывода, поэтому мне, скорее всего, придется запускать тестовую программу дважды, один с другим, а другой без трассировки, и надеяться, что оба выполнения похожи (должно быть, особенно для однопоточного пользователя)режим симуляции).

Я видел опцию -icount, которая звучит многообещающе от названия, но когда я передал ее в QEMU 4.0.0, я не увидел, чтобы что-то произошло. Должен ли он где-то печатать счетчик команд? Следующий патч выглядит незакрытым и не предлагает: https://lists.gnu.org/archive/html/qemu-devel/2015-08/msg01275.html

1 Ответ

1 голос
/ 08 ноября 2019

Текущие выпущенные версии QEMU не предоставляют никаких средств для этого. Предстоящая поддержка «TCG-плагина», которая должна выйти в выпуске 4.2 в конце года, позволит вам написать простой плагин «считать выполненные инструкции», но это (как и при трассировке -d) добавит накладные расходы. .

Опция -icount, безусловно, сбивает с толку, но она заставляет эмулируемый ЦП (пытаться) запускаться с определенным количеством выполняемых инструкций в секунду, в отличие от значения по умолчанию «максимально быстро»». Это приводит к более высоким издержкам (и останавливает QEMU, используя несколько потоков хоста для гостей SMP), но является более детерминированным.

С точки зрения философии, «количество команд в секунду» является довольно вводящим в заблуждение показателем для эмуляторов, поскольку время, затрачиваемоеВыполнение инструкции может значительно отличаться от аппаратного. Загрузки и магазины работают медленнее, чем на реальном оборудовании. Инструкции с плавающей запятой невероятно медленны (возможно, в 10 раз или хуже от целочисленной арифметической инструкции, где реальное оборудование может выполнять оба за один цикл). У эмуляторов JIT, таких как QEMU, есть профиль производительности start-stop, где выполнение полностью останавливается, пока мы переводим блок кода, тогда как реальный процессор или интерпретирующий эмулятор не будут иметь этих пауз. Степень влияния времени JIT будет зависеть от того, будет ли ваш код часто перезапускать ранее переведенный горячий код или большую часть своего времени он тратит на выполнение «нового» кода, и от того, выполняет ли он действия, приводящие к тому, что JIT отбрасывает старый код (например, самоизменяющийся код или частые переключения между процессами). Если у вас в эмуляторе есть «IPS meter», вы увидите, что значение, о котором оно сообщается, сильно колеблется, когда гостевой код выполняется и выполняет разные действия. Вам, вероятно, лучше просто выбрать эталонный тест, который, по вашему мнению, отражает ваш реальный сценарий использования, запустить его на различных эмуляторах и сравнить время настенных часов, необходимое для его завершения.

...