我听说 GCC 提供的 128 位整数数据类型,如 __int128_t
是模拟的,因此速度很慢。但是,据我所知,各种 SSE 指令集(SSE、SSE2、...、AVX)至少引入了一些用于 128 位寄存器的指令。我不太了解 SSE 或汇编/机器代码,所以我想知道是否有人可以向我解释是否使用现代版本的 GCC 模拟了 __int128_t
的算术。
我问这个问题的原因是因为我想知道在不同版本的 GCC 之间期望 __int128_t
性能有很大差异是否有意义,这取决于利用了哪些 SSE 指令。
那么,__int128_t
算术的哪些部分是 GCC 模拟的,哪些部分是用 SSE 指令(如果有的话)实现的?
最佳答案
我在问题中混淆了两个不同的东西。
首先,正如 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 指令。
关于c - __int128_t 算术是否被 GCC 模拟,即使使用 SSE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566437/