Я профилирую приложение, написанное с помощью PIN-кода. Исходный код приложения использует массив - я хочу, чтобы PIN-код перехватил каждую инструкцию загрузки, сделанную для массива.
В настоящее время я аннотировал исходный код приложения, которое пытаюсь профилировать. Каждый раз, когда я читаю из массива, я сначала вызываю функцию startRegionOfInterest (). Закончив чтение из массива, я вызываю другую функцию endRegionOfInterest (). Я могу использовать ПИН-код, чтобы легко перехватывать вызовы этих двух функций - всякий раз, когда между этими двумя вызовами существует нагрузка, я предполагаю, что это нагрузка на интересующий меня массив.
Однако это довольно крупный план, и поэтому я классифицирую множество нагрузок, НЕ относящихся к интересующему массиву, как считывания в массив.
Есть ли для меня более простой способ более точно уловить все нагрузки на интересующий меня массив?
1 ответ
В своем методе startRegionOfInterest
вы можете использовать какую-то последовательность индикаторов для передачи адреса массива в инструмент PIN. Например, сохраните магическую константу, а затем сохраните адрес массива, например:
volatile void *sink;
void startRegionOfInterest(void *array) {
sink = (void *)0x48829d2f384be;
sink = array;
}
В инструменте ввода PIN-кода вы ищете хранилище магической константы (в вызове startRegionOfInterest
для дополнительной специфичности, если хотите), а затем вы знаете, что следующее хранилище - это адрес массива. Аналогичным образом можно указать длину.
Реализуя последовательность с помощью встроенного asm вместо этого, вы можете удалить вариабельность, связанную с поведением компилятора и оптимизатора, хотя я думаю, что подход volatile
должен работать на практике (хотя вам, возможно, придется пропустить некоторые промежуточные инструкции, не связанные с сохранением. A godbolt.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.