首页 > 解决方案 > 有没有一种方法可以在 x86 中并行测量多个负载的延迟(使用 RDTSCP 或 RDTSC),而无需序列化?

问题描述

我正在尝试测量在乱序处理器中并行执行的多个内存访问的延迟。

问题是任何测量负载延迟的尝试都将其相对于其他负载序列化。

以一个简单编写的代码为例,它测量两个负载的延迟:

1. rdtscp
2. load-1
3. rdtscp

4. rdtscp 
5. load-2
6. rdtscp

在上面的代码中,根据我的测试,Intel x86 中rdtscp的ordering 属性序列化了load-1 和load-2 的执行(即load-2 仅在load-1 完成执行后才发布到内存系统)。结果,上面的代码没有利用可用的内存带宽。理想情况下,我想确保负载的最大吞吐量,同时独立测量每个负载的延迟。

有没有办法测量 load-1 和 load-2 的延迟,同时允许它们并行执行?

理想情况下,我需要的是一种 rdtscp 形式,它根据正在测量延迟的负载进行排序,而不是使用任何其他指令明确排序。我想知道是否有办法使用rdtscprdtsc来获得它。

标签: performancex86memory-barriersmicrobenchmarktransactional-memory

解决方案


我不认为有任何方法可以对特定寄存器的输入依赖性进行采样,或者任何其他方法可以让加载无序完成,但仍然单独计时。甚至只是让它们重叠。


对于从 4 到 512 的 2 的幂,有 perf 事件mem_trans_retired.load_latency_gt_32等等。您可以为此编写计数器rdpmc。但它不会告诉您哪个负载触发了哪个事件。

鉴于您的总体目标,当(单核)内存带宽被最大化时,您可以使用这些计数器perf statperf record获取整个循环情况的平均值。

请注意,它们计算从第一次调度(到加载端口)的延迟,而不是发送到后端。


推荐阅读