Paw*_*tko 7 memory x86 caching intrinsics
我正在阅读Ulrich Drepper的"每个程序员应该了解的关于记忆的内容".在第6部分的开头,theres是一个代码片段:
#include <emmintrin.h>
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);
}
Run Code Online (Sandbox Code Playgroud)
在它下面有这样的评论:
假设指针
p
已正确对齐,则对此函数的调用将设置所寻址的高速缓存行的所有字节c
.写组合逻辑将看到四个生成的movntdq指令,并且只有在执行完最后一条指令后才发出内存的写命令.总而言之,这个代码序列不仅避免了在写入之前读取高速缓存行,还避免了使用可能不需要的数据来缓存高速缓存.
什么错误我是在它被写,它"将设置针对高速缓存行的所有字节到C",但是从我的理解流的intrisics他们绕过缓存功能评论 - 既没有高速缓存的读,也不缓存写入.这段代码如何访问任何缓存行?第二个粗体片段表示相似,即函数"避免在写入之前读取缓存行".如上所述,我没有看到如何以及何时写入缓存.此外,是否需要在缓存写入之前写入缓存?有人可以向我澄清这个问题吗?
ing*_*net -2
我手下没有参考文献来证明我所说的,但我的理解是:内存总线上传输的唯一单位是高速缓存行,无论它们进入高速缓存还是某些特殊寄存器。因此,确实,您粘贴的代码填充了一个缓存行,但它是一个特殊的缓存行,并不驻留在缓存中。一旦该缓存行的所有字节都被修改,该缓存行将直接发送到内存,而不经过缓存。