是否可以使用最新的 Intel x86 芯片上的性能计数器来测量成功的存储转发操作的数量?
我看到了ld_blocks.store_forward
衡量存储转发失败的事件,但我很清楚是否可以衡量成功的案例。
是否可以使用最新的 Intel x86 芯片上的性能计数器来测量成功的存储转发操作的数量?
我看到了ld_blocks.store_forward
衡量存储转发失败的事件,但我很清楚是否可以衡量成功的案例。
我没有看到比您为 SKL 所做的更多的事情,但是较旧的 uarches 可能有更多详细信息:
对于 Core2(Intel 容易混淆地称为 Core 微架构),优化手册文档(在 B.7 EVENT RATIOS FOR INTEL CORE MICROARCHITECTURE 中):
B.7.5.2 4K 别名和存储转发块检测
- 重叠存储率阻塞的负载:
LOAD_BLOCK.OVERLAP_STORE/CPU_CLK_UNHALTED.CORE
4K aliasing 和 store forwarding block 是两种不同的场景,由于不同的原因,load 被前面的 store 阻塞了。这两种情况都是由同一事件检测到的:
LOAD_BLOCK.OVERLAP_STORE
。“Loads Blocked by Overlapping Store Rate”的高值表示 4K 混叠或存储转发块可能会影响性能
这可能算作停滞和成功的存储转发。(还有 4k 混叠,所以你需要避免或减去它。)
B.7.5.3 通过前面的存储加载块
- 未知存储地址阻止的加载
Rate: LOAD_BLOCK.STA / CPU_CLK_UNHALTED.CORE
“Loads Blocked by Unknown Store Address Rate”的高值表示加载经常被前面的具有未知地址的存储阻塞,这意味着性能损失。
- 未知存储数据速率阻止的负载:
LOAD_BLOCK.STD / CPU_CLK_UNHALTED.CORE
“Loads Blocked by Unknown Store Data Rate”的高值表示负载经常被先前的具有未知数据的存储阻塞,并意味着性能下降。
最后两个计数器似乎计算成功的存储转发,但仅在检测到(可能的)重叠后负载实际上必须等待的情况下。
没有记录事件来计算成功的存储转发操作的数量。但是,我已经为此目的在 Haswell 和 Broadwell 上通过实验确定了一组未记录的事件。特别是,任何事件代码为 0x2 且 umask 为奇数(任何奇数,例如 1)的事件似乎都非常准确地表示了成功存储转发的事件,即计数与预期一致,标准偏差实际上为零. 我认为您可以在以后(甚至更早)的微架构上使用相同的事件。同样,这些事件都没有记录在案。