请教关于CPU直接读写内存的问题
在看文档的时候看到CPU可以通过指令直接读写内存,而不是像通常的先到cache取值,然后再读取内存这种情况。
文档中提供了下面的函数调用
- #include <emmintrin.h>
- void _mm_stream_si32(int *p, int a);
- void _mm_stream_si128(int *p, __m128i a);
- void _mm_stream_pd(double *p, __m128d a);
- #include <xmmintrin.h>
- void _mm_stream_pi(__m64 *p, __m64 a);
- void _mm_stream_ps(float *p, __m128 a);
- #include <ammintrin.h>
- void _mm_stream_sd(double *p, __m128d a);
- void _mm_stream_ss(float *p, __m128 a);
复制代码
不知道哪位用过没?能否讲解一下。谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
暂时关闭cache功能,再访问内存
先谢谢了!
我编译的时候说是找不到动态库, 不知道是链接哪一个库啊? 谢谢! google了没有找到.
根据文档我是这样理解的,如果有两组数据,A[N], B[N],A是经常被用到,而B中的元素则是偶尔被用到,即使用到也只用一次。
那么如果在对A中数据进行操作的时候,需要B[j],则将B[j]读取进来,但是这样的话会让之前保存A的cache line失效。当对B[j]的一次操作完成之后,就会将它放到内存中去,此时再读取之前的A,这个时候就需要再一次地将cache line给重新替换一遍,因此会造成一定的性能开销。
如果在访问B的时候能够不通过cache,而直接从内存中去读,那么就不会破坏cache line,在下次使用到A的时候还是直接从cache line中进行读取。
不知道这样是不是真的能够有效呢?
谢谢!
我非常怀疑什么指令可以绕过cache,想不出来。
通过设置使某段内存不被cache可以,但不记得有指令可以绕过
[ 本帖最后由 zx_wing 于 2008-7-17 00:08 编辑 ]
不通过CPU cache 直接访问内存我一直接用汇编.
比如: movnti %eax,0xxxxx(%edx) 就是不通过CPU cache 直接访问内存,属于SSE2指令集.
在针对局部数据写多而读少时用这样的指令,这样用的好处是减少cache不必要缓冲, 使cache用在该用的时候.
你说的直接访问内存的文件
<emmintrin.h>
<xmmintrin.h>
我认为用的实际上也不过是如下指令:
CLFLUSH
LFENCE
MFENCE
PAUSE
MASKMOVDQU
MOVNTPD
MOVNTDQ
MOVNTI
...
MOVNTSD(SSE4)
MOVNTSS(SSE4)
[ 本帖最后由 system888net 于 2008-7-16 19:23 编辑 ]
在网格任务中有时用这些指令也很有效.
当然很多地方也会适得其反,
"在合适的时间和合适的条件下用合适的指令"
MOVNTI 以及相似的指令可以
嗯,是的,我在1楼给出的函数汇编之后就是您说的这些指令。
那您对于这样使用之后的性能有没有研究过呢?
谢谢
学习了,我还一直不知道SSE2有这样的功效。
不过从suctan发的内容来看,我认为这些指令还是没有绕过cache。WC在x86架构下是个比较特殊的东西,它是独立于通常的L1、L2、L3 cache之外,不过它本身还是一个cache。
WC之所以可能提高效率,我想是因为它不通过硬件保证指令执行的顺序性(x86的读写都是order的),所以才会有LFENCE、MFENCE这样的指令。也就是说把读写顺序性的保障转嫁在程序员身上,以提高硬件执行的效率。
我还是认为没有指令可以绕过cache直接write through到内存,除非通过页表的PCD机制或MTTR寄存器设置内存的属性,才能绕过cache。