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

В настоящее время я аннотировал исходный код приложения, которое пытаюсь профилировать. Каждый раз, когда я читаю из массива, я сначала вызываю функцию startRegionOfInterest (). Закончив чтение из массива, я вызываю другую функцию endRegionOfInterest (). Я могу использовать ПИН-код, чтобы легко перехватывать вызовы этих двух функций - всякий раз, когда между этими двумя вызовами существует нагрузка, я предполагаю, что это нагрузка на интересующий меня массив.

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

Есть ли для меня более простой способ более точно уловить все нагрузки на интересующий меня массив?

1
Farhad 29 Июн 2020 в 04:28

1 ответ

Лучший ответ

В своем методе startRegionOfInterest вы можете использовать какую-то последовательность индикаторов для передачи адреса массива в инструмент PIN. Например, сохраните магическую константу, а затем сохраните адрес массива, например:

volatile void *sink;

void startRegionOfInterest(void *array) {
    sink = (void *)0x48829d2f384be;
    sink = array;
}

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

Реализуя последовательность с помощью встроенного asm вместо этого, вы можете удалить вариабельность, связанную с поведением компилятора и оптимизатора, хотя я думаю, что подход volatile должен работать на практике (хотя вам, возможно, придется пропустить некоторые промежуточные инструкции, не связанные с сохранением. A godbolt.

2
BeeOnRope 29 Июн 2020 в 03:10