我正在尝试使用PAPI读取硬件计数器之一。当我尝试从perf_event
列表中读取事件时,它工作正常。但是,现在我需要从perf_event_uncore
列表中读取其中一个计数器,该列表是通过papi_native_avail
获得的,但出现错误。它运行在带有Linux 5.4.0-3-amd64版本的层叠湖架构上。
int err = PAPI_event_name_to_code("skx_unc_imc0::UNC_M_WPQ_CYCLES_FULL",&native);
if (err != PAPI_OK)
printf("PAPI_event_name_to_code error: %d\n", err);
err = PAPI_add_event(EventSet, native);
if (err!= PAPI_OK)
printf("PAPI_add_event error: %d\n", err);
即使PAPI_event_name_to_code
返回PAPI_OK,PAPI_add_event
返回-1,也就是PAPI_EINVAL
-无效参数。我尝试了几种计数器形式perf_event_uncore
,但遇到了同样的问题。我是否需要使用其他函数将其添加到事件集中?还是我做错了什么?
我找到了解决方案。在添加如下cpu = 0规范后:PAPI_event_name_to_code("skx_unc_imc0::UNC_M_WPQ_CYCLES_FULL:cpu=0",&native)
调用PAPI_add_event
函数时没有错误。
还要注意,我已经检查过了,这个特定的硬件计数器不能与其他计数器一起计数,因此它应该是事件集中的唯一事件。