Лучше всего запустить приложение под симулятором x86, таким как MARSSx86 или Sniper .Используя эти симуляторы, вы можете плавно изменять моделируемую задержку памяти или любые другие параметры системы 1 и видеть, как изменяется производительность вашего приложения.Это общий подход в академических кругах (часто вместо модели x86 будет смоделирована общая машина, что дает вам доступ к большему количеству реализаций симулятора).
Основной недостаток использования симулятора заключается в том, что даже хорошие симуляторы не являютсяполностью точны, и насколько они точны, зависит от кода.Определенные типы отклонений от фактической производительности не особенно проблематичны при ответе на вопрос «как производительность изменяется с задержкой», но симулятор, который не моделирует путь доступа к памяти, может дать ответ, который далек от реальности.
Если вы действительно не можете использовать симуляцию, вы можете использовать любой двоичный инструмент перезаписи, такой как PIN-код, для определения местоположения доступа к памяти.nop
будет плохим выбором, потому что он выполняется очень быстро, потому что вы не можете добавить зависимость между результатом загрузки памяти и инструкцией nop.Эта последняя проблема означает, что она добавляет только дополнительную «работу» в месте каждой загрузки, но работа не зависит от самой нагрузки, поэтому не имитирует увеличение задержки памяти.
Лучшим подходом было быследуйте за каждой нагрузкой с помощью операции с большой задержкой, которая использует результат нагрузки в качестве входа и выхода (но не изменяет его).Может быть, что-то вроде imul reg, reg, 1
, если reg
получил результат загрузки (но это добавляет только 3 цикла, так что вы могли бы искать более длинные инструкции по задержке, если вы хотите добавить большую задержку).
1 По крайней мере, в пределах набора вещей, смоделированного симулятором.