Как определить пользовательское событие, которое будет измеряться счетчиком производительности оборудования?
Большинство современных процессоров оснащены аппаратными счетчиками производительности. Такие счетчики могут использоваться для подсчета событий микроархитектуры с целью анализа целевой программы для повышения ее производительности. Как правило, профилирование и анализ являются основными целями этих счетчиков.
Основываясь на научных работах, представленных в литературе, эти счетчики недостаточно точны. Например, если мы хотим подсчитать количество отложенных инструкций в данном коде, значение может быть изменено от запуска к другой задаче возмущения. Было обсуждено несколько руководящих принципов для повышения точности измерений. Мониторинг нескольких событий может обеспечить лучшее понимание выполняемой программы и, следовательно, повысить точность измерений.
Авторы статьи Пользовательские события для мониторинга производительности оборудования был предложен новый метод, позволяющий пользователям определять свои собственные события, которые будут использоваться Папи(Performance API), который представляет собой инфраструктуру, широко используемую для легкого доступа к аппаратным счетчикам performacne. К сожалению, в статье подробно не объясняется, как мы определяем пользовательские события и используем их в нашей программе.
Например (на основе PAPI), я стремлюсь определить новое событие, которое включает в себя n собственных/предустановленных событий, таких как (PAPI_TOT_INS, PAPI_BR_TKN и PAPI_STR_INS), а затем использовать его как одно событие в моем коде.
Что я уже пробовал:
Основываясь на упомянутой статье, я установил переменную окружения PAPI USER_EVENTS FILE для указания на файл, содержащий пользовательские события, и этот файл будет инициироваться и анализироваться вызовом функции PAPI_library_init. Event_file очень прост (только для тестирования):
#определите 5
tot_ins, PAPI_TOT_CYC|а|*
Мой код выглядит примерно так:
#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 }
Однако выходные данные кажутся странными как для подсчета, так и для counter_code
Я определил простое событие в текстовом файле (в Linux Ubuntu OS) и установил переменную окружения для указания на этот файл. А в коде, как
PAPI_event_name_to_code("tot_ins",& counter_code); //(retvalue=-7)
и
PAPI_add_event(EventSet,counter_code); //(retvalue=-10)
возвращает значение, не равное PAPI_OK.
любая помощь будет оценена по достоинству.