2013-03-22 56 views
1

关于非临时写和写结合的技术,我已经将它写在写入组合:避免在写入之前读取哪条缓存行?

总结如下代码

void setbytes(char *p, int c) 
{ 
__m128i i = _mm_set_epi8(c, c, c, c, 
c, c, c, c, 
c, c, c, c, 
c, c, c, c); 
_mm_stream_si128((__m128i *)&p[0], i); 
_mm_stream_si128((__m128i *)&p[16], i); 
_mm_stream_si128((__m128i *)&p[32], i); 
_mm_stream_si128((__m128i *)&p[48], i); 
} 

here

拍摄,该代码序列不仅避免在读取高速缓存 线被写之前,它也避免了污染缓存,这可能不是可能很快就需要 数据。这在 某些情况下可以有很大的好处。

我的问题是:避免其高速缓存行写?用于存储i变量或p指针指向的缓存行的内容的缓存行(之后会被修改)?

回答

3

约:“避免在读取高速缓存行之前,它被写入”

这种说法是指“写分配”政策,用于处理命中缓存写入。所有现代的x86处理器都这样做。它是这样的:软件使用正常的mov指令写入内存。如果该地址已经被缓存,则缓存被更新并且根本没有DRAM存取。但是,如果数据不在缓存中,则处理器从DRAM中读取该缓存行。然后,来自mov指令的数据被合并到缓存中的数据中。处理器将尽可能延迟将数据写回DRAM。最终结果是违反直觉的:软件执行写入(mov)指令,并且产生单个DRAM读取(突发)。如果重复这种模式,缓存将最终变满,并且需要逐出才能为读取留出空间。在这种情况下,将会有一个不相关的缓存行地址的DRAM写入突发,然后读取软件正在写入的地址。这解释了为什么非暂时性商店给予大约2倍的填充大缓冲区的性能。与使用mov填充缓冲区相比,只有一半的DRAM访问发生。

1

流防止缓存污染的,如果目的地的地址是不是已经在缓存中,否则,它只是更新并根据需要用书面通过缓存行支持的地址的新值缓存。

在你的榜样

所以,如果你还没有从p读取(或你已经从CLFLUSH缓存中清除它),流媒体商店将防止数据被写入到其中被加载到缓存中的地址p点通过p指出,(即:无cachline的将用于写入地址来创建)。

+0

我得到的,但关于它说:“这个代码序列,不仅可避免在读取高速缓存线被写之前”的部分是什么?你向我解释了这部分“它也避免了可能不需要的数据污染缓存” – 2013-03-22 21:36:50

+0

@JohnnyPauling:'i'将被分配给一个寄存器,这意味着生成的代码中没有内存负载,因此它在使用时不会触发并缓存为其创建的行。 – Necrolis 2013-03-23 05:27:40

+0

你说得对,谢谢你向我解释:D – 2013-03-23 10:02:15