performance - 有没有一种方法可以在 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 形式,它根据正在测量延迟的负载进行排序,而不是使用任何其他指令明确排序。我想知道是否有办法使用rdtscp或rdtsc来获得它。
解决方案
我不认为有任何方法可以对特定寄存器的输入依赖性进行采样,或者任何其他方法可以让加载无序完成,但仍然单独计时。甚至只是让它们重叠。
对于从 4 到 512 的 2 的幂,有 perf 事件mem_trans_retired.load_latency_gt_32
等等。您可以为此编写计数器rdpmc
。但它不会告诉您哪个负载触发了哪个事件。
鉴于您的总体目标,当(单核)内存带宽被最大化时,您可以使用这些计数器perf stat
或perf record
获取整个循环情况的平均值。
请注意,它们计算从第一次调度(到加载端口)的延迟,而不是发送到后端。
推荐阅读
- arrays - 在线 c 编译器将数组中未定义数字的值打印为零,而我的则给出一些随机值,例如 6356940
- event-handling - Shopware 6:商务活动问题、多个订单确认
- c - 如何更改特定内存地址中的值?
- ios - Swift 中存储属性和计算属性的值
- r - 如何在 R 中的时间序列图中仅包含交易日
- elixir - 在 Elixir 中最后一个斜杠后删除字符串
- javascript - Node.js 脚本在本地工作,但在 firebase 服务上不能在本地工作?
- reactjs - 我如何在反应原生钩子中使背景颜色动态
- python - 在 python 中可视化数据
- c# - 没有代理的 HttpWebRequest 很慢