如何检测和避免代码中的存储转发冲突 - Duofeng的专栏 - CSDN博客

来源:百度文库 编辑:神马文学网 时间:2024/04/28 20:30:07

如何检测和避免代码中的存储转发冲突收藏

      存储转发是Intel Pentinum 4 和 pentinum6系列提供的一种加速读写指令执行的技术。当处理器执行一条存储指令时,存储缓冲区被分配。一旦存储指令被执行,存储缓冲区含有存储指令写入内存的数值和内存地址。对于存储之后发生的载入,在它们被执行前经常不必等候存储指令的完成。如果载入来源于非重叠的内存区,载入指令可以不受存储指令的影响而开始执行。如果载入与存储区域完全重叠,来自存储的数值有时能够直接传给载入,不必等候完成写数据到缓存的存储。当存储转发的条件不满足时,内存的加载操作就会被延迟。当一个载入与存储有部分重叠或全部重叠但没有转发时,载入必须等候存储完成并且在载入执行前完成写存储数据到缓存。有时,载入或存储地址的生成延迟能够引起处理器认为载入与存储间有重叠。这些存储转发问题能够引起严重的性能问题,因而应当避免。

      举个例子,在图像应用中,一段处理32位RGBA颜色值的代码可能遇到这样的问题:产生一个新的红色值,并把这个8位的值存到一个内存地址,然后读回整个32位值。当存一个字节数较少的数值,然后取回一个包含这个数值的字节数更多的操作数时,处理器的存储-转发操作将会被中断。这是因为被加载的部分数据可能位于内存系统(Cache,DRAM)的其他地方。

       为了避免上述的情况导致的内存延迟,可以32位整形为单位处理所有4个颜色值,然后把这32位整形一起写道内存中。为了利用处理器的存储转发功能,一个读操作加载的数据的尺寸必须等于或小于先前写操作的数据,并且保证读写操作的起始地址是相同的。

      改进应用的内存访问模式,避免对存储转发的限制,可以获得显著的性能改进,使用Intel编译器(5.0以后的版本)或微软VisualC编译器(7.0以后的版本)可以消除很多存储-转发冲突的情况。但是编译器经常不会知道存储转发问题是否存在。在Pentium4处理器上使用MOB Loads Replays Retired事件,在Pentium M处理器上使用Resource RelatedStalls事件,使用这些VTune事件可以更容易地发现存储转发的问题。需要注意的是:在PentiumM处理器上,VTune分析器的计数器Resource RelatedStalls不只对存储转发事件进行计数。如果你看到这个事件经常发生,在附近的指令中查找存储转发的问题。如果没有发现这个问题,该事件也能由其它资源相关的问题引起,如用尽载入和存储缓冲区,或者简单地执行机器一次能够处理的最大数目的微操作。

如何检测和避免代码中的存储转发冲突 - Duofeng的专栏 - CSDN博客 如何在编程中降低分支预测错误的几率 - Duofeng的专栏 - CSDN博客 五种应该避免的代码注释 - 陈皓专栏 【空谷幽兰,心如皓月】 - CSDN博客 Exchange 2007 的存储理解 - hotxin的专栏 - CSDN博客 在Visual C++中检测和隔离内存泄漏 - WuOu的专栏 - CSDN博客 C++中的位拷贝和值拷贝 - liam1122(小亮)的专栏 - CSDN博客 Oracle存储过程实现多线程对表数据的抽取 - 狮子尾巴的专栏 - CSDN博客 浮点数在计算机中存储方式 - virus026的专栏 - CSDN博客 存储技术趋势预测与分析 - 刘爱贵的专栏 - CSDN博客 MFC中的消息映射宏 - magicyang87的专栏 - CSDN博客 windows中的CreatThread - cnctloveyu的专栏 - CSDN博客 baozhengw的专栏 - CSDN博客 WMA文件信息格式分析及代码 - benny5609的专栏 - CSDN博客 JM8.5中的7种宏块模式问题 - zhoujunming的专栏 - CSDN博客 Windows XP中的新型向量化异常处理 - 冒险岛的专栏 - CSDN博客 漫谈.NET开发中的字符串编码 - bitfan(数字世界一凡人)的专栏 - CSDN博客 AGPS简介 - kv110的专栏 - CSDN博客 OpenMAX简介 - shenbin1430的专栏 - CSDN博客 Android flinger - simmer_ken的专栏 - CSDN博客 windows 命令 - orangeman1982112的专栏 - CSDN博客 JNDI概述 - tanghongru1983的专栏 - CSDN博客 指针 - syhhl007的专栏 - CSDN博客 变量命名 - yszwn的专栏 - CSDN博客 什么是PLL - JasonCao的专栏 - CSDN博客