我有一个关于 PAPI(性能应用程序编程接口)的问题。我下载并安装了 PAPI 库。仍然不确定如何正确使用它以及我需要什么额外的东西才能使它工作。我正在尝试在 C 中使用它。我有这个简单的程序:
int retval;
retval = PAPI_library_init(PAPI_VER_CURRENT);
if (retval != PAPI_VER_CURRENT && retval > 0) {
printf("PAPI error: 1\n");
exit(1);
}
if (retval < 0)
printf("PAPI error: 2\n");
retval = PAPI_is_initialized();
if (retval != PAPI_LOW_LEVEL_INITED)
printf("PAPI error: 2\n");
int num_hwcntrs = 0;
if ((num_hwcntrs = PAPI_num_counters()) <= PAPI_OK)
printf("This system has %d available counters. \n", num_hwcntrs);
我已经包含了 papi.h 库,并且正在使用 gcc -lpapi 标志进行编译。我在路径中添加了库,以便它能够编译和运行,但结果我得到了这个:
该系统有 0 个可用计数器。
思想初始化似乎有效,因为它没有给出错误代码。任何建议或建议将有助于确定我没有做对或错过正确运行它的地方。我的意思是,我的系统中应该有可用的计数器,更准确地说,我需要缓存未命中和缓存命中计数器。
在我运行另一个简单程序后,我尝试计算可用计数器,它给出了错误代码 -25:
int numEvents = 2;
long long values[2];
int events[2] = {PAPI_L3_TCA,PAPI_L3_TCM};
printf("PAPI error: %d\n", PAPI_start_counters(events, numEvents));
更新:我只是尝试使用命令检查终端硬件信息:papi_avail | 更多的; 我得到了这个:
可用的 PAPI 预设和用户定义的事件以及硬件信息。
PAPI 版本:5.7.0.0
操作系统:Linux 4.15.0-45-generic
供应商字符串和代码:GenuineIntel (1, 0x1)
型号字符串和代码:Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz (78, 0x4e)
CPU 修订版:3.000000
CPUID : 系列/型号/步进 6/78/3, 0x06/0x4e/0x03
CPU 最大频率:2800
CPU 最小 MHz : 400
总核心数:4
每个核心的 SMT 线程数:2
每个插槽的核心数:2
插座:1
每个 NUMA 区域的核心数:4
NUMA 地区:1
在虚拟机中运行:否
硬件计数器数量:0
最大复用计数器:384
快速计数器读取 (rdpmc):否
PAPI 预设事件
Name Code Avail Deriv Description (Note)
PAPI_L1_DCM 0x80000000 否 否 1 级数据缓存未命中
PAPI_L1_ICM 0x80000001 否 否 1 级指令高速缓存未命中
PAPI_L2_DCM 0x80000002 否 否 2 级数据缓存未命中
PAPI_L2_ICM 0x80000003 否 否 二级指令高速缓存未命中......
所以因为 Number Hardware Counters 是 0,我不能用这个工具用 PAPI 的预设事件来计算缓存未命中?是否有任何有用的配置,或者我应该在更换笔记本电脑之前忘记它?