Измерение FLOPs приложения с помощью инструмента linux perf - PullRequest
4 голосов
/ 02 декабря 2010

Я хочу измерить количество операций с плавающей запятой и арифметических операций, выполняемых некоторым приложением с помощью «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;
  }
}

Ответы [ 2 ]

4 голосов
/ 10 сентября 2012

Используемое событие зависит от процессора. Вы можете использовать libpfm4 (http://perfmon2.git.sourceforge.net/git/gitweb-index.cgi), чтобы определить, какие события доступны (с помощью программы showevinfo), а затем check_events из того же дистрибутива, чтобы выяснить необработанные коды для события. Мой процессор Sandy Bridge поддерживает событие FP_COMP_OPS_EXE, которое у меня есть эмпирически найденный близко соответствует количеству FLOP.

2 голосов
/ 02 декабря 2010

Я не уверен насчет perf, но у oprofile есть события с плавающей запятой для многих процессоров.Возможны некоторые совпадения, поскольку INST_RETIRED также является допустимым событием oprofile.

...