Измерение флопов приложения с инструментом Linux perf

StackOverflow https://stackoverflow.com/questions/4335011

  •  30-09-2019
  •  | 
  •  

Вопрос

Я хочу измерить 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top