加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在不触摸缓存的情况下编写或读取内存

发布时间:2020-12-16 05:54:37 所属栏目:百科 来源:网络整理
导读:有没有办法写入/读取内存,而不会触摸x86 CPU下的L1 / L2 / L3缓存? 并且x86 CPU中的缓存是否完全由硬件管理? EDIT: I want to do this because I want to sample the speed of memory and see if any part of memory’s performance degrades. 解决方法 CP
有没有办法写入/读取内存,而不会触摸x86 CPU下的L1 / L2 / L3缓存?

并且x86 CPU中的缓存是否完全由硬件管理?

EDIT: I want to do this because I want to sample the speed of memory and see if any part of memory’s performance degrades.

解决方法

CPU确实在硬件上管理自己的缓存,但x86为您提供了一些影响此管理的方法.

要访问内存而不进行缓存,您可以:

>使用x86非时间指令,它们意味着告诉CPU,您不会再次使用此数据,因此无需将其保留在缓存中. x86中的这些指令通常称为movnt *(根据数据类型的后缀,例如用于将普通整数加载到通用寄存器的movnti).还有使用类似技术的流加载/存储的说明,但更适合于高BW流(连续加载完整行时).
要使用这些,可以使用内联汇编代码,也可以使用编译器提供的内在函数,大部分调用该类的_mm_stream_ *
>将特定区域的内存类型更改为不可缓存.既然你表示你不想禁用所有的缓存(而且也是正确的,因为这也包括代码,堆栈,页面映射等),你可以将你的基准数据集所在的特定区域定义为不可缓存的,使用MTRR(存储器类型范围寄存器).有几种方法可以做到这一点,您需要阅读一些文档.
>最后一个选项是正常获取行,这意味着它最初被缓存,但是强制它使用专用的clflush指令清除所有缓存级别(或者如果要刷新整个缓存,则使用完整的wbinvd).确保正确地围绕这些操作,以确保它们完成(当然,不要将它们作为延迟的一部分来衡量).

话虽如此,如果你想做所有这些只是为了记忆读取时间,你可能会得到不好的结果,因为大多数CPU处理非时间或不可缓存的访问“低效”.如果你刚刚强迫读取来自内存,最好是通过顺序访问足够大的数据集来处理高速缓存LRU,从而不能适应任何缓存.这将使大多数LRU方案(不是全部!)首先删除最旧的行,所以下次你环绕时,它们必须来自内存.

请注意,为了正常工作,您需要确保您的HW预取器无法帮助(并且意外地覆盖了您要测量的延迟) – 禁用它,或使访问步伐足够远,使其无效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读