【发布时间】:2022-12-24 22:02:08
【问题描述】:
我正在尝试使用英特尔 PMU 性能监控 (PEBS) 对 C/C++ 应用程序二进制文件中的所有加载和存储操作进行采样。
我正在使用的代码库使用perf_event_open() 来设置监控加载要么店铺在 attr->config 字段中,如下面的代码 sn-p 所示。我想添加另一个开关盒来示例加载和存储操作。但我不知道如何将此 attr->config 字段配置为英特尔 PMU 的适当十六进制值,例如代码 sn-p 中当前存在的值,用于加载或存储。我将不胜感激任何指示或帮助。
提前致谢。
switch(aType)
{
case LOAD:
{
/* comment out by Me
// attr->config = 0x1cd;
#if defined PEBS_SAMPLING_L1_LOAD_MISS
//attr->config = 0x5308D1; // L1 load miss
attr->config = 0x8d1; // perf stat -e mem_load_uops_retired.l1_miss -vvv ls // for broadwell
#elif defined PEBS_SAMPLING_LLC_LOAD_MISS
attr->config = 0x5320D1; // LLC load miss
#else
attr->config = 0x5381d0; //All Load
#endif
*/
// attr->config = 0x5308D1; // L1 load miss
// attr->config = 0x5320D1; // LLC load miss
// attr->config1 = 0x3;
// added by me
attr->config = 0x5381d0; //All Load added by me
attr->precise_ip = 3;
load_flag = true;
break;
}
case STORE:
default:
{
attr->config = 0x5382d0;//0x2cd;
// attr->config = 0x8d1; //mem_load_uops_retired.l3_miss
// attr->config1 = 0x0;
attr->precise_ip = 3;
store_flag = true;
break;
}
}
attr->read_format = PERF_FORMAT_GROUP | PERF_FORMAT_ID;
// attr->task = 1;
// fresh creation
// return registerDevice(sessionId);
}
【问题讨论】:
-
您当然可以使用两个单独的计数器,一个用于加载,一个用于存储,但是如果您可以使用同一个计数器计算 L3 未命中数或用于加载和存储的任何内容,这是一个很好的问题。如果你不能,我不会感到惊讶;在加载执行单元加载访问缓存;仅当访问缓存到达存储缓冲区的头部时才存储访问缓存。
-
非常感谢@PeterCordes。实际上我想知道如何设置两个不同的事件,比如 STORE,我将 perf config 设置为
attr->config = 0x5381d0然后 pebs 监视这个事件,如果我将事件设置为 0x5382d0,那么它监视 STORE,但是是否有任何十六进制值对于事件类型 LOAD_AND_STORE?感谢获得顺便说一句。 -
是的,我知道这就是你要问的,我只是建议一个解决方法。我对这个问题投了赞成票,所以也许肯定知道没有 LOAD_AND_STORE 事件类型的人可以注意到并回答它。
-
您可以使用
LONGEST_LAT_CACHE.MISS计算所有 L3 缓存未命中数;见definition of linux perf cache-misses event?。这是按高速缓存行计算的,而不是按指令计算的,并且至少包括一些硬件预取。 (包括代码获取、加载、来自商店的 RFO,以及大概的页面浏览。)但是perf list没有将其作为 Precise 事件提及。 IDK 如果这意味着它不能使用 PEBS,或者如果它只是与特定指令无关。
标签: linux performance cpu-architecture perf intel-pmu