【问题标题】:how do i flush the write-back cpu cache? [closed]如何刷新回写式 CPU 缓存? [关闭]
【发布时间】:2013-11-03 23:25:25
【问题描述】:

我可能应该阅读英特尔手册,但它真的很长,我有点迷失了

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

我想知道如何确保我的写入在主内存中。

或者是否有一些完全绕过缓存的写指令?

【问题讨论】:

  • “我可能应该阅读英特尔手册” - 正确。我们不会为您阅读。别再偷懒了。
  • @MitchWheat:如果他没有写第一行,你会做出同样的回应吗?坦率地说,这是一个相当沉重的阅读材料
  • 除非您正在构建硬件,或者可能设置 DMA 传输(如果它们与 CPU 缓存一致,则为 IDK),您的数据何时到达主内存并不重要。多核系统中的内核保持它们的缓存彼此一致。英特尔在其设计中使用大型 inclusive L3 缓存的原因之一是检查 L3 标签足以判断该芯片中的任何内核是否在其缓存中的某处有缓存线。跨度>
  • 使用内存屏障(又名存储/加载栅栏)来确保写入是全局可见的,并且读取可以看到其他内核上的线程进行的任何写入。

标签: caching x86 x86-64 intel


【解决方案1】:

您可以使用流式(非临时)存储。它们旨在避免污染缓存(以获得更好的性能),但这也意味着它们只会将您的数据直接写入内存,以便它们可以用于可靠性。

要么在汇编中使用 MOVNT* 指令,要么检查你的编译器是否为此提供了内在函数。

MS 编译器应该支持 _mm_stream_ps/si/..:
http://msdn.microsoft.com/en-us/library/bb531466%28v=vs.90%29.aspx

GCC 可能会以不同的方式称呼它(至少是新的 SSE 风格),试试 __builtin_ia32_movntq/ps/..
http://gcc.gnu.org/onlinedocs/gcc/X86-Built_002din-Functions.html

请注意,数据持久性是一个很大的话题,如果这是您的目标,那么它可能还不够,您还应该确保您有围栏同步点来保证这些存储已完成,然后才能保证数据是安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2012-07-01
    • 2010-09-15
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多