请教关于CPU直接读写内存的问题

发布于 2022-09-19 13:41:00 字数 650 浏览 40 评论 0

在看文档的时候看到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);

复制代码

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

韬韬不绝 2022-09-26 13:41:00

暂时关闭cache功能,再访问内存

静水深流 2022-09-26 13:41:00

原帖由 cjaizss 于 2008-7-16 14:12 发表
暂时关闭cache功能,再访问内存

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

情何以堪。 2022-09-26 13:41:00

原帖由 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中进行读取。

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

捎一片雪花 2022-09-26 13:41:00

原帖由 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 编辑 ]

我只土不豪 2022-09-26 13:41:00

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

青衫负雪 2022-09-26 13:41:00

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

只是偏爱你 2022-09-26 13:41:00

原帖由 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.

妄想挽回 2022-09-26 13:41:00

原帖由 system888net 于 2008-7-16 19:16 发表
不通过CPU cache 直接访问内存我一直接用汇编.

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

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

夜空下最亮的亮点 2022-09-26 13:41:00

原帖由 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。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文