【问题标题】:x86-64: Cache load and eviction instructionx86-64:缓存加载和驱逐指令
【发布时间】:2016-08-02 11:25:21
【问题描述】:

对于 x86-64 架构,是否有可以将给定内存地址的数据加载到缓存的指令?同样,是否有一条指令可以在给定与该缓存行对应的内存地址(或类似缓存行标识符的东西)的情况下驱逐该缓存行?

【问题讨论】:

标签: assembly x86 x86-64 cpu-cache


【解决方案1】:

预取数据到缓存中(不加载到寄存器中):

PREFETCHT0 [address]
PREFETCHT1 [address]
PREFETCHT2 [address]

内在:void _mm_prefetch (char const* p, int hint)

请参阅insn ref manual 和其他指南,了解不同的接近提示的含义。 ( 标签 wiki 上的其他链接)。

著名的What Every Programmer Should Know About Memory 文章是在 P4 时写的。当前的 CPU 具有更智能的硬件预取器,超线程不仅仅用于运行预取线程。预取线程是一个死主意。除此之外,关于缓存的优秀文章;我用a modern review 写了一个 SO 答案,说明了 Ulrich 的原作中发生了哪些变化以及哪些内容仍然相关。搜索其他 SO 帖子和内容以决定何时实际预取。

不要不要过度使用英特尔 IvyBridge 上的软件预取。该特定微架构存在性能错误,只能退休one prefetch per 43 clocks


刷新包含给定地址的缓存行:

clflush [address]
clflushopt [address]   ; Newer CPUs only.  Weakly ordered, with higher throughput.

内在:void _mm_clflushopt (void const * p)

有一个recent question about its performance

【讨论】:

  • 个人电脑- 你做什么工作?您是为英特尔工作,还是从事严重的 HPC 优化?只是好奇。您需要考虑将内容放在像 Agner Fog 这样的网站上,可能带有指向 S.O. 的链接。答案!
  • @BrettHale:我实际上是失业的 ATM。这是我喜欢的爱好:P(以及为什么我有这么多时间写 SO 答案)。如果有人想雇用我来优化这些废话,那就太好了。
  • _mm_clflushopt() 似乎不受 MSVC 2017 工具集 v141 的支持。
  • @SergeRogatch:如果您需要刷新一个大缓冲区,您可以在 asm 中编写一个包含循环的整个函数。性能差异可以是very significant for larger buffers。或者,您当然可以只使用对英特尔内部函数具有更新支持的编译器,无论是针对该文件还是针对您的整个项目。
猜你喜欢
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2016-02-13
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多