您的位置:首页 > 编程语言

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

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

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

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

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