Как измерить производительность ARM?

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

Мой вопрос в том, почему моделируемые инструкции отличаются каждый раз, когда я запускаю программное обеспечение (другое, но близкое приближение)? Разве это не должно быть одинаковым каждый раз? Разве это не так, программное обеспечение, которое я пишу на C, будет скомпилировано в инструкции ассемблера ARM, и каждый раз, когда запускается программное обеспечение, имитированные инструкции будут состоять в том, сколько раз выполняются эти инструкции ассемблера ARM? Он должен быть одинаковым каждый раз?

Как измерить производительность? Возьмите 10 образцов симулированных инструкций и получите среднее значение?

Ответ 1

Из моего опыта в реальном (немодулированном) ARM, если я беру количество циклов для раздела кода, количество циклов будет меняться, это происходит потому, что:

  • В середине исполняемого кода могут быть контекстные переключатели.
  • Исходное состояние CPU может отличаться при вводе кода. (например, содержание конвейера, предсказание ветвей и т.д.).
  • Состояние кэша будет отличаться при входе в раздел кода.
  • Внешние факторы, такие как другое аппаратное обеспечение, доступ к внешней памяти.

Из-за всего этого, получение среднего (плюс некоторые другие статистические меры) действительно является единственным практическим подходом для реального оборудования и реальной ОС. В хорошем симуляторе некоторые из этих факторов или потенциально устранены.

На некоторых реальных чипах (или если поддерживается имитатором) может быть полезно ARM Блок мониторинга производительности.

Если вы кодируете Cortex A8 это, это классный онлайн-счетчик циклов, который действительно поможет вам выжать больше производительности из вашего кода.