热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在未缓存的地址上写入完整的缓存行,然后在x64上再次读取它

如何解决《在未缓存的地址上写入完整的缓存行,然后在x64上再次读取它》经验,为你挑选了1个好方法。

在x64上,如果您首先在短时间内在先前未缓存的地址上写入完整缓存行的内容,然后在再次从该地址读取后不久,CPU是否可以避免必须从内存读取该地址的旧内容?

同样有效的是,先前的内存内容并不重要,因为全部高速缓存行中的数据已被完全覆盖?我可以理解,如果这是对未缓存地址的部分缓存行写入,然后是读取,则将产生必须与主内存等同步的开销。

从文档方面看,写分配,写合并和监听使我对此事有些困惑。目前,我认为x64 CPU无法做到这一点?



1> BeeOnRope..:

通常,后续读取应该很快-只要存储到装载转发能够工作。实际上,它根本与写入整个缓存行无关:即使对于较小的写入,它也应该工作(具有相同的警告)!

基本上,在正常(即WB内存区域)映射的内存上发生的事情是,存储将向CPU 的存储缓冲区添加多个条目。由于关联的内存当前未缓存,因此这些条目将保留一段时间,因为将发生RFO请求,以将该行拉入缓存以进行写入。

同时,您发出了一些针对刚刚写入的相同内存的负载,并且通常由存储到负载转发来满足这些负载,这几乎只是注意到存储已经在相同地址和使用的存储缓冲区中它是加载的结果,而无需进入内存。

现在,商店转发并不总是有效。特别是,当负载仅部分重叠最近涉及的存储时,它将永远无法在任何Intel(或可能是AMD)CPU上运行。也就是说,如果您向地址10写入4个字节,然后从地址9读取4个字节,则只有3个字节来自该写入,而9处的字节必须来自其他地方。在这种情况下,所有Intel CPU只需等待所有涉及的存储区被写入,然后解决负载。

过去,还有许多其他情况也会失败,例如,如果您发布了一个较小的读取,而该读取已完全包含在较早的存储中,则该读取通常会失败。例如,给定地址10的4字节写入,从地址12的2字节读取完全包含在较早的写入中-但由于硬件不够复杂,无法检测到这种情况,因此通常不转发。

但是,最近的趋势是,除了上面提到的“未完全包含读取”的情况以外,所有情况都可以在现代CPU上成功转发。血腥的细节在stuffedcow上有很多漂亮的图片,而且Agner在他的微体系结构指南中也很好地涵盖了细节。

在上面的链接文档中,这是Agner关于Skylake上的商店转发的评价:

在某些情况下,Skylake处理器可以将内存写入转发给来自同一地址的后续读取。存储转发比以前的处理器快一个时钟周期。对于32或64位的操作数,在最佳情况下,写存储器后再从同一地址进行读取需要4个时钟周期,而对于其他操作数大小,则需要5个时钟周期。

当128或256位的操作数未对齐时,存储转发将增加多达3个时钟周期的损失。

当任何大小的操作数越过高速缓存行边界(即可被64字节整除的地址)时,存储转发通常会额外花费4-5个时钟周期。

写入后再从相同地址进行较小的读取几乎不会造成任何损失。

当读偏移量但完全包含在写所覆盖的地址范围内时,写64位或更少的位,然后进行较小的读,将产生1-3个时钟的损失。

对齐写入128或256位,然后读取两个半部或四个四分之一等中的一个或两个,等等,几乎没有损失。不适合两半或四分之一的部分读取可能会额外花费11个时钟周期。

大于写入的读取,或覆盖写入和未写入字节的读取,大约需要11个时钟周期。

最后一种情况是读大于写,这肯定是商店转发停止的情况。11个周期的报价可能适用于所有涉及的字节都在L1中的情况-但是某些字节根本没有缓存(在您的情况下)的情况当然可以采取DRAM未命中的顺序,这可以是数百个周期。

最后,请注意,上述所有内容都与写入整个缓存行无关-如果先写入1个字节然后读取相同的字节,而保持缓存行中的其他63个字节不变,它的工作原理也一样。

还有就是类似于你提什么以饱满的高速缓存行的效果,但它所处理的写结合写,这些都可以或者通过标记内存为写结合(而不是通常的回写)或使用非临时存储指令。NT指令的主要目标是写入不会很快被后续读取的内存,从而跳过了RFO开销,并且可能不会转发给后续加载。


推荐阅读
  • Glide—缓存基础原文:CachingBasics作者:NormanPeitek翻译:Dexter0218我们学习完了加载、显示和处理图片,我们将会向前推进学习优化处理。一个成功 ... [详细]
  • NFS是一种跨操作系统的协议,Linux客户端可以挂载Windows服务器中的文件系统,Mic客户端也可以挂载Solaris服务器中的文件系统。Linux中,NFS客户端和NFS服务器 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • Chrome浏览器非常强大,使用Chrome浏览器对页面性能进行检测,根据测试的结果进行优化。当然这个结果只是参考,在实际的项目中肯定有特殊情况存在,并不能为了满足某项测试结果而忽略特定情况的存在。1 ... [详细]
  • 看ECSHOP,缓存机制看到这样一个目录函数:01.foreach($para[template]AS$val)02.{03.$statstat($va ... [详细]
  • Yii数据库缓存实例分析【PHP】
    后端开发|php教程Yii,数据库,缓存后端开发-php教程源码zhijia,vscodec必备工具,ubuntu设置fat,tomcat链接被关闭,海淀爬虫,php5.6安装扩展 ... [详细]
  • 【UnityApwork框架】AOP编程拦截,用于缓存和异常处理(Unity框架的拦截注入Interception)...
    第一步:定义拦截行为:CachingBehavior和ExceptionLoggingBehavior他们都继承接口:IIntercept ... [详细]
  • 几周前,我参加了ThoughtWorks技术雷达研讨会。我在ThoughtWorks工作了多年,想想是否有人知道这些人在软件开发方面的发展趋势。在技​​ ... [详细]
  • 在我们的3G版网站的项目中使用了html5applicationcache,将大部分图片资源、js、css等静态资源放在manifest文件中。没想到上线第一天就遇到了严重问题:a ... [详细]
  • 如何解决《英特尔x86_64处理器不仅是流水线架构,还是超标量?》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《所有64位intel架构是否都支持SSSE3/SSE4.1/SSE4.2指令?》经验,为你挑选了1个好方法。 ... [详细]
author-avatar
in冷霜天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有