作者wtchen (没有存在感的人)
看板C_and_CPP
标题[问题] SSE指令跟多执行绪同时用有助於效能吗?
时间Sun Nov 13 03:15:10 2016
开发平台(Platform): (Ex: Win10, Linux, ...)
Lubuntu 16.04
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc 5.4.0
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
pthread, SSE1-4/AVX
问题(Question):
最近帮忙作code review,看到有人用SSE做计算提高效能。
可是还用多执行绪来跑SSE。
我看了一下,Intel core i7 是每个core有
- 8个 128-bit XMM暂存器(SSE用)
- 16 个 256/512-bit 的 YMM(YMM0-YMM15) 暂存器(AVX用)
不管是XMM或YMM空间都很有限。
如果我写个程式(prog)使用数个thread同时跑,
每个thread都要用满8个XMM暂存器,那麽:
1.如果两个thread占用一个core,会不会因为两个thread都抢着用XMM使得效能大幅降低?
我是说因为一个thread要用XMM就把另一个thread放在XMM里的data踢出去?
(因为XMM load/unload也是有点耗时间)
2.如果刚好某个背景程式或浏览器也在同时使用XMM,
那原本prog的效能是不是也会受影响?
3.如果同时使用XMM/YMM的process会互相影响,
有无办法可以侦测XMM/YMM是否被使用(如果在使用中我就用普通方法)?
4. 如果是ARM上面的SIMD/NEON,其效应也是如上?
感谢回答。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 90.27.42.14
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1478978113.A.432.html
1F:推 LiloHuang: context switch 会产生的状况,无论 XMM 或 GPR 都会有 11/13 09:07
2F:→ LiloHuang: SIMD + MT写得好应该是会更快,每颗核心都有独立的 XMM 11/13 09:09
3F:→ LiloHuang: 建议用 Intel VTune 做更多的性能分析 11/13 09:09
4F:→ MOONRAKER: 还满幽默的,写asm吗?不然怎麽知道用满全部暂存器。 11/13 12:49
我就是不懂暂存器是怎麽管理的,
如果我一次load 10个它会怎麽搞?
5F:→ Caesar08: 1指的不就是thread context switch? 11/13 15:37
我对pthread不熟,不知道pthread会不会对同一个process的threads
做切换(无sleep的情况下),一时不知道怎麽找关键字。
※ 编辑: wtchen (90.27.42.14), 11/13/2016 16:53:16
※ 编辑: wtchen (90.27.42.14), 11/13/2016 16:54:44
6F:推 littleshan: 你是要问 hyper-thread 是否对 xmm 指令集有效吗? 11/13 19:20
7F:→ littleshan: 如果不考虑 hyper-threading,演算法又有良好平行化 11/13 19:22
8F:→ littleshan: 那 2 core 跑 2 thread 当然会比较快 11/13 19:22
9F:→ littleshan: 1 core 跑 2 thread 因为多了 overhead 就会慢一点 11/13 19:22
那如果hyper-thread的情形下,
xmm会不会因为thread交互进行而把增加load/store的手续?
因为xmm只有8个可用....
※ 编辑: wtchen (90.27.42.14), 11/13/2016 20:29:16
10F:推 LiloHuang: 假设没有 HT 的情况,每个 core 都有自己的一组暂存器 11/13 22:14
11F:→ LiloHuang: 假设有 HT 的情况,每个 logic processor 都有自己的 11/13 22:14
12F:→ LiloHuang: architecture state,没记错里面也有各自的 GPR 跟 XMM 11/13 22:19
13F:→ LiloHuang: 你在问题多数都跟 context switch 怎样运作有关 11/13 22:21
14F:→ LiloHuang: 实务上 SIMD + MT 性能会增加,建议实际去跑量测时间 11/13 22:23
15F:→ LiloHuang: 你的所谓 SIMD 暂存器很有限,其实通用暂存器也很有限 11/13 22:26
16F:→ LiloHuang: 相同的问题,在没有把程式改成 SIMD 之前不就有了 :P 11/13 22:27
17F:→ LiloHuang: 反而是得多注意 false sharing 的问题比较实际 11/13 22:27
18F:→ Caesar08: context switch的部分会根据作业系统而定吧,例如 11/13 22:38
19F:→ Caesar08: 一个有6 core的CPU,是一次一个process,然後可以使用6 11/13 22:39
20F:→ Caesar08: thread,还是一次6个process,每个只能使用一个thread 11/13 22:40
21F:→ Caesar08: 如果在multi core的machine上面,那情况就更复杂,还要 11/13 22:40
22F:→ Caesar08: 考虑thread被移到另一个CPU的情况上 11/13 22:41
23F:推 LiloHuang: 同意 context switch 得看系统,标题是讨论 SSE + MT 11/13 22:41
25F:→ LiloHuang: 可以自己看看 SIMD + MT 有没有帮助...看数据最清楚 11/13 22:43
所以看起来如果能弄到一个Core一个thread可以有最大效能。
如果有context switch,那xmm里的变化(load/store)被变成context switch的成本。
这样了解了。
话说回来我也看了对方做的SSE效能测试的数据,变化超大,据说跟CPU散热有关。
还真的挺有趣。
※ 编辑: wtchen (90.27.42.14), 11/13/2016 23:13:00
26F:→ jaid: 可以用affinity 11/14 04:22