Как определить пользовательское событие, которое будет измеряться PAPI? - PullRequest
1 голос
/ 05 марта 2019

Большинство современных процессоров оснащены аппаратными счетчиками производительности. Такие счетчики могут использоваться для подсчета событий микроархитектуры с целью анализа целевой программы для повышения ее производительности. Как правило, профилирование и анализ являются основными целями этих счетчиков.

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

Авторы Пользовательские события для мониторинга производительности оборудования был предложен новый метод, позволяющий пользователям определять свои собственные события, которые будут использоваться PAPI ( Performance API ), который инфраструктура, широко используемая для простого доступа к аппаратным счетчикам производительности. К сожалению, статья не объясняет подробно, как мы определяем определяемые пользователем события и используем их в нашей программе.

Например (на основе PAPI), я пытаюсь определить новое событие, которое включает n собственные / предустановленные события, такие как (PAPI_TOT_INS, PAPI_BR_TKN и PAPI_STR_INS), а затем использовать его как одно событие в моем код.


изм:

Исходя из упомянутой статьи, я установил переменную среды PAPI USER_EVENTS FILE, чтобы указать на файл, содержащий пользовательские события, и этот файл будет инициироваться и анализироваться путем вызова функции PAPI_library_init. Event_file очень прост (только для тестирования):

#define a 5

tot_ins, PAPI_TOT_CYC|a|*

Мой код выглядит так:

#include <stdio.h>
#include <stdlib.h>
#include <papi.h>


int main(int argc, char** argv) {

long_long val[10000]; 

 int EventSet = PAPI_NULL;
 long_long values[1];

PAPI_library_init(PAPI_VER_CURRENT);
PAPI_create_eventset(&EventSet);

//tot_ins is the name of the event defined in event-file
int counter_code;
PAPI_event_name_to_code("tot_ins",& counter_code);
printf("code =%x\n",counter_code);

PAPI_add_event(EventSet,counter_code);

int k;
int index=0;

for (k=0; k<5; k++)
{  

       PAPI_start(EventSet);

int i;

for (i=0; i<100; i++)
{
int x;
int y;
int z;

x=i+2;
y=x+i/15;
z=x/y;

}

       PAPI_read(EventSet, values) ;
       //printf("test number  %d        %lld \n",k,values[0]);
       printf("%lld\n",values[0]);
       PAPI_stop(EventSet, values) ;

printf("\n---------------------------------- \n");
 }// end k 

}

Однако вывод кажется странным как для счета, так и для счетчика

Я определил простое событие в текстовом файле (в ОС Linux Ubuntu) и установил переменную среды, чтобы указать этому файлу. Но в коде оба

PAPI_event_name_to_code("tot_ins",& counter_code); //(retvalue=-7)

и

PAPI_add_event(EventSet,counter_code); //(retvalue=-10)

возвращает значение, не равное PAPI_OK.

любая помощь будет оценена.

...