Performance 在x86中(使用RDTSCP或RDTSC)有没有一种方法可以在不进行序列化的情况下测量多个并行加载的延迟?

Performance 在x86中(使用RDTSCP或RDTSC)有没有一种方法可以在不进行序列化的情况下测量多个并行加载的延迟?,performance,x86,memory-barriers,microbenchmark,transactional-memory,Performance,X86,Memory Barriers,Microbenchmark,Transactional Memory,我试图测量在无序处理器中并行执行的多个内存访问的延迟 问题在于,任何测量负载延迟的尝试都会使用 相对于其他负载。 以一个简单编写的代码为例,它测量两个加载的延迟: 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完成执行后才会发布到内存系统)。因此,上述代码没有

我试图测量在无序处理器中并行执行的多个内存访问的延迟

问题在于,任何测量负载延迟的尝试都会使用 相对于其他负载。

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

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的一种形式,它是根据正在测量延迟的负载排序的,而不是与任何其他指令一起显式排序的。我想知道是否有一种方法可以通过rdtscp或rdtsc来实现这一点。

我不认为有任何方法可以通过特定寄存器上的输入依赖性来采样时间,也没有任何其他方法可以让加载按顺序完成,但仍然可以分别计时。甚至让它们重叠


对于从4到512的2次幂,存在失效的mem_trans_.load_latency_gt_32等性能事件。您可以为此编程计数器和
rdpmc
。但它不会告诉你哪个负载触发了哪个事件

考虑到您的总体目标,您可以将这些计数器与
perf stat
perf record
一起使用,以在(单核)内存带宽达到最大值时获得整个循环情况的平均值

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

建议“rdtscp等待,直到所有以前的指令都已执行且所有以前的加载都全局可见”。所以它不能直接用于我的目的。认为rdtscp强制执行完全lfence-like行为:rdtscp调用两侧的任何加载指令都不会被重新排序。我在测试中观察到类似的行为,这引发了这个问题。