Измерение флопов приложения с инструментом Linux perf
Вопрос
Я хочу измерить Ammount с плавающей запятой и арифметическими операциями, выполненными каким -то приложением с «perf», новой командой интерфейса командной строки в подсистеме счетчика производительности Linux. (Для целей тестирования я использую простое приложение для фиктивного манекена, которое я создал, см. Ниже).
Поскольку я не мог найти никаких событий «перф», определенных для измерения операций FP и целочисленного, я начал копать в кодах соревнований по оборудованию необработанного оборудования (для использования с -rnnn, где NNN является шестнадцатеричным значением кода события). Таким образом, моя реальная проблема заключается в том, что коды, которые я нашел для пенсионных инструкций (Inst_retire), не проводят различие между FP и другими инструкциями (x87 и MMX/SSE). Когда я попытался использовать соответствующие Umasks для конкретного кода, я обнаружил, что каким -то образом «perf» не понимает и не поддерживает включение Umask. Я пытался с:
% perf stat -e rC0 ./a.out
что дает мне инструкции в отставке, но
% perf stat -e rC002 ./a.out
Что должно дать мне выполненные инструкции x87, говорится, что я предоставил неправильные параметры. Может быть, так, но как правильный способ использовать Umasks of Raw Addurant Events с «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;
}
}
Решение
Событие для использования зависит от процессора. Вы можете использовать libpfm4 (http://perfmon2.git.sourceforge.net/git/gitweb-index.cgi), чтобы определить, какие доступные события (с использованием программы Showevinfo), а затем Check_events из того же распределения, чтобы выяснить сырое Коды для события. Мой процессор Sandy Bridge поддерживает событие fp_comp_ops_exe, которое я эмпирически обнаружил, тесно связан с количеством флопа.
Другие советы
Я не уверен насчет PERF, но OproFile имеет события плавающей запятой для многих процессоров. Там может быть некоторое совпадение, так как Inst_retired также является действительным событием OproFile.