Я хочу измерить количество операций с плавающей запятой и арифметических операций, выполняемых некоторым приложением с помощью «perf», новой команды интерфейса командной строки для подсистемы счетчика производительности linux. (Для тестирования я использую простое фиктивное приложение, которое я создал, см. Ниже).
Поскольку я не смог найти никаких «perf» событий, определенных для измерения FP и целочисленных операций, я начал копаться в сырых аппаратных кодах событий (для использования с -rNNN, где NNN - шестнадцатеричное значение кода события). Поэтому моя настоящая проблема заключается в том, что коды, которые я нашел для вышедших из употребления инструкций (INST_RETIRED), не делают различий между FP и другими инструкциями (X87 и MMX / SSE). Когда я попытался использовать соответствующие umasks для конкретного кода, я обнаружил, что каким-то образом 'perf' не понимает или не поддерживает включение umask. я пробовал с:
% perf stat -e rC0 ./a.out
, который дает мне инструкции на пенсию, но
% perf stat -e rC002 ./a.out
, который должен дать мне выполненные инструкции X87, говорит, что я указал неверные параметры. Может быть и так, но как правильно использовать маски сырых аппаратных событий с «perf»? в общем, как получить точное число операций с плавающей запятой и целочисленных операций, выполняемых программой с помощью инструмента perf?
Большое спасибо,
Константин Боянов
Вот мое тестовое приложение:
int main(void){
float numbers[1000];
float res1;
double doubles[1000];
double res2;
int i,j=3,k=42;
for(i=0;i<1000;i++){
numbers[i] = (i+k)*j;
doubles[i] = (i+j)*k;
res1 = numbers[i]/(float)k;
res2 = doubles[i]/(float)j;
}
}