[英]Why does my Intel Skylake / Kaby Lake CPU incur a mysterious factor 3 slowdown in a simple hash table implementation?
[英]What will be the exact code to get count of last level cache misses on Intel Kaby Lake architecture
我读了一篇有趣的论文,名为“对最后一级缓存的高分辨率侧通道攻击”,并希望找到我自己机器的索引哈希函数 - 即Intel Core i7-7500U(Kaby Lake架构) - 遵循这项工作的线索。
为了对散列函数进行逆向工程,本文提到了第一步:
for (n=16; ; n++)
{
// ignore any miss on first run
for (fill=0; !fill; fill++)
{
// set pmc to count LLC miss
reset_pmc();
for (a=0; a<n; a++)
// set_count*line_size=2^19
load(a*2^19);
}
// get the LLC miss count
if (read_pmc()>0)
{
min = n;
break;
}
}
如何在C ++中编写reset_pmc()
和read_pmc()
代码? 从我到目前为止在线阅读的所有内容来看,我认为它需要内联汇编代码,但我不知道用什么指令来获取LLC未命中数。 如果有人可以为这两个步骤指定代码,我将不得不承担责任。
我在VMware工作站上运行Ubuntu 16.04.1(64位)。
PS:我在英特尔架构软件开发人员手册的第18章第3B卷中找到了这些LONGEST_LAT_CACHE.REFERENCES
和LONGEST_LAT_CACHE.MISSES
,但我不知道如何使用它们。
您可以使用perf
作为Cody建议来测量代码外部的事件,但我怀疑您的代码示例中需要对性能计数器进行细粒度的编程访问。
要做到这一点,您需要启用计数器的用户模式读取,并且还可以对它们进行编程。 由于这些是受限制的操作,因此至少需要操作系统内核的一些帮助才能做到这一点。 滚动你自己的解决方案将非常困难,但幸运的是,Ubunty 16.04有几个现有的解决方案:
rdpmc
指令)。 它是读取计数器的最准确和最精确的方法,它包括“开销减法”功能,通过减去由PMU读取代码本身引起的事件,可以为您提供测量区域的真实PMU计数。 您需要固定到单个核心以使计数有意义,如果您的过程中断,您将获得虚假结果。 perf_events
。 perf stat
相似的整个过程而不是标记API。 要使用标记API,您仍然需要将您的过程作为可能的测量过程的子项运行,但您可以通过编程方式读取过程中的计数器值,这正是您所需要的(据我所知)。 我不确定在使用标记API时设置和读取计数器有多么可取。 所以你有很多选择! 我认为所有这些都可以工作,但我可以亲自为libpfc
担保,因为我自己在Ubuntu 16.04上使用它同样的目的。 该项目正在积极开发,可能是上述最准确(最少开销)的项目。 所以我可能从那个开始。
上述所有解决方案都应该能够适用于Kaby Lake,因为每个连续的“性能监控架构”的功能似乎通常都是前一个的超集,并且通常会保留API。 但是,对于libpfc
,作者将其限制为仅支持Haswell的体系结构(PMA v3),但您只需在本地更改一行代码即可解决此问题。
1实际上,它们通常都被称为PCM ,我怀疑新项目只是旧PCM项目的官方开源延续(也可以源形式提供,但没有社区贡献机制) 。
我会使用PAPI,请参阅http://icl.cs.utk.edu/PAPI/这是一个跨平台的解决方案,有很多支持,特别是来自hpc社区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.