当今的大多数处理器都配备了硬件性能计数器。此类计数器可用于对微架构事件进行计数,以便分析目标程序以提高其性能。通常,剖析和分析是这些计数器的主要目标。
根据文献中的研究论文,这些计数器缺乏准确性。例如,如果我们想计算给定代码中已退出指令的数量,则该值可能会从运行变为另一个扰动问题。已经讨论了一些指南以提高测量的准确性。监控多个事件可以更好地了解正在执行的程序,从而提高测量精度。
用于硬件性能监控的用户定义事件的作者提出了一种新方法,使用户能够定义自己的事件以供 PAPI ( Performance API ) 使用,PAPI 是一种广泛用于以简单方式访问硬件性能计数器的基础设施。不幸的是,论文没有详细解释我们如何定义用户定义的事件并在我们的程序中使用它们。
例如(基于 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
}
但是,计数和 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 的值。
任何帮助将不胜感激。