免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 44698 | 回复: 48
打印 上一主题 下一主题

请教关于CPU直接读写内存的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-16 14:09 |只看该作者 |倒序浏览
在看文档的时候看到CPU可以通过指令直接读写内存,而不是像通常的先到cache取值,然后再读取内存这种情况。

文档中提供了下面的函数调用

  1. #include <emmintrin.h>
  2. void _mm_stream_si32(int *p, int a);
  3. void _mm_stream_si128(int *p, __m128i a);
  4. void _mm_stream_pd(double *p, __m128d a);
  5. #include <xmmintrin.h>
  6. void _mm_stream_pi(__m64 *p, __m64 a);
  7. void _mm_stream_ps(float *p, __m128 a);
  8. #include <ammintrin.h>
  9. void _mm_stream_sd(double *p, __m128d a);
  10. void _mm_stream_ss(float *p, __m128 a);
复制代码


不知道哪位用过没?能否讲解一下。谢谢!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-07-16 14:12 |只看该作者
暂时关闭cache功能,再访问内存

论坛徽章:
0
3 [报告]
发表于 2008-07-16 14:28 |只看该作者
原帖由 cjaizss 于 2008-7-16 14:12 发表
暂时关闭cache功能,再访问内存


先谢谢了!
我编译的时候说是找不到动态库, 不知道是链接哪一个库啊? 谢谢! google了没有找到.  

论坛徽章:
0
4 [报告]
发表于 2008-07-16 14:46 |只看该作者
原帖由 scutan 于 2008-7-16 14:09 发表
在看文档的时候看到CPU可以通过指令直接读写内存,而不是像通常的先到cache取值,然后再读取内存这种情况。

文档中提供了下面的函数调用

#include
void _mm_stream_si32(int *p, int a);
void _mm_str ...


根据文档我是这样理解的,如果有两组数据,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中进行读取。

不知道这样是不是真的能够有效呢?
谢谢!

论坛徽章:
0
5 [报告]
发表于 2008-07-16 17:27 |只看该作者
原帖由 scutan 于 2008-7-16 14:09 发表
在看文档的时候看到CPU可以通过指令直接读写内存,而不是像通常的先到cache取值,然后再读取内存这种情况。

文档中提供了下面的函数调用

#include
void _mm_stream_si32(int *p, int a);
void _mm_str ...

我非常怀疑什么指令可以绕过cache,想不出来。
通过设置使某段内存不被cache可以,但不记得有指令可以绕过

[ 本帖最后由 zx_wing 于 2008-7-17 00:08 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-07-16 19:16 |只看该作者

回复 #1 scutan 的帖子,回复 #5 zx_wing 的帖子

不通过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 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-07-16 19:21 |只看该作者

回复 #6 system888net 的帖子

在网格任务中有时用这些指令也很有效.
当然很多地方也会适得其反,
"在合适的时间和合适的条件下用合适的指令"

论坛徽章:
0
8 [报告]
发表于 2008-07-16 19:29 |只看该作者
原帖由 zx_wing 于 2008-7-16 17:27 发表

我非常怀疑什么指令可以绕过cache,想不出来。
通过设置关掉cache是可以,但不记得有指令可以绕过


MOVNTI 以及相似的指令可以

Opcode Instruction Description
0F C3 /r
MOVNTI m32, r32
Move doubleword from r32 to m32, minimizing pollution in the cache hierarchy.


Description
Moves the doubleword integer in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to minimize cache pollution during the write to memory. The source operand is a general-purpose register. The destination operand is a 32-bit memory location.

The non-temporal hint is implemented by using a write combining (WC) memory type protocol when writing the data to memory. Using this protocol, the processor does not write the data into the cache hierarchy, nor does it fetch the corresponding cache line from memory into the cache hierarchy. The memory type of the region being written to can override the non-temporal hint, if the memory address specified for the non-temporal store is in an uncacheable (UC) or write protected (WP) memory region.

Because the WC protocol uses a weakly-ordered memory consistency model, a fencing operation such as SFENCE should be used in conjunction with MOVNTI instructions if multiple processors might use different memory types to read/write the memory location.

论坛徽章:
0
9 [报告]
发表于 2008-07-16 19:34 |只看该作者
原帖由 system888net 于 2008-7-16 19:16 发表
不通过CPU cache 直接访问内存我一直接用汇编.

比如:  movnti %eax,0xxxxx(%edx) 就是不通过CPU cache 直接访问内存,属于SSE2指令集.
在针对局部数据写多而读少时用这样的指令,这样用的好处是减少cache不必 ...


嗯,是的,我在1楼给出的函数汇编之后就是您说的这些指令。
那您对于这样使用之后的性能有没有研究过呢?
谢谢

论坛徽章:
0
10 [报告]
发表于 2008-07-16 22:17 |只看该作者
原帖由 system888net 于 2008-7-16 19:16 发表
不通过CPU cache 直接访问内存我一直接用汇编.

比如:  movnti %eax,0xxxxx(%edx) 就是不通过CPU cache 直接访问内存,属于SSE2指令集.
在针对局部数据写多而读少时用这样的指令,这样用的好处是减少cache不必 ...

学习了,我还一直不知道SSE2有这样的功效。
不过从suctan发的内容来看,我认为这些指令还是没有绕过cache。WC在x86架构下是个比较特殊的东西,它是独立于通常的L1、L2、L3 cache之外,不过它本身还是一个cache。
WC之所以可能提高效率,我想是因为它不通过硬件保证指令执行的顺序性(x86的读写都是order的),所以才会有LFENCE、MFENCE这样的指令。也就是说把读写顺序性的保障转嫁在程序员身上,以提高硬件执行的效率。
我还是认为没有指令可以绕过cache直接write through到内存,除非通过页表的PCD机制或MTTR寄存器设置内存的属性,才能绕过cache。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP