Dou*_*ple 8 c x86 gcc sse int128
我听说__int128_tGCC提供的128位整数数据类型 是模拟的,因此很慢.不过,据我所知,各种SSE指令集(SSE,SSE2,...,AVX)推出了128位寄存器至少一些指令.我不太了解SSE或汇编/机器代码,所以我想知道是否有人可以向我解释是否__int128_t使用现代版本的GCC模拟算术运算.
我问这个的原因是因为我想知道__int128_t在不同版本的GCC之间是否期望性能差异是有意义的,这取决于SSE指令的优势.
那么,__int128_tGCC会模拟哪些算术部分,以及哪些部分是用SSE指令实现的(如果有的话)?
Dou*_*ple 12
在我的问题中,我混淆了两件不同的事情.
首先,正如PaulR在评论中所解释的那样:"在SSE或AVX中没有128位算术运算(除了按位运算)".考虑到这一点,必须在现代基于x86-64的处理器(例如AMD Family 10或Intel Core架构)上模拟128位算术.这与GCC无关.
问题的第二部分是GCC中的128位算术仿真是否受益于SSE/AVX指令或寄存器.正如PaulR的评论所暗示的那样,SSE/AVX中没有太多可以让你更容易地进行128位算术; 最有可能的x86-64指令将用于此目的.我感兴趣的代码无法编译-mno-sse,但编译得很好,-mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2性能不受影响.所以我的代码没有受益于现代SSE指令.
SSE2-AVX指令适用于8,16,32,64位整数数据类型.它们主要用于将打包数据一起处理,例如,128位寄存器可能包含四个32位整数,依此类推.
虽然SSE/AVX/AVX512 /等.没有128位模式(它们的向量元素严格为64位,操作只会溢出),正如 Paul R暗示的那样,主CPU 通过使用一对寄存器确实支持有限的128位操作.
当然CPU的ALU是64位,因此 - 正如暗示的英特尔文档 - 这些更高的额外64位是以微代码中的额外微操作为代价的.这对于已经需要处理大量微操作的部门(> 3倍以上)来说更为显着.
仍然这意味着在某些情况下(比如使用三个规则来缩放值),编译器可能会发出常规CPU指令而不关心自己做任何128位仿真.
这已经有很长一段时间了:
(至于添加和减法:感谢对携带的支持,对任何可以填充存储空间的任意长度的数量进行添加/减少是完全无足轻重的).
| 归档时间: |
|
| 查看次数: |
3710 次 |
| 最近记录: |