我最近以内在函数的形式使用了x86 SIMD指令(SSE1234)。我发现令人沮丧的是,SSE ISA有几个简单的指令,只能用于浮点数或仅用于整数,但理论上它们应该同样适用于两者。例如,float和double向量都有指令从地址( movhps , movhpd )加载更高的64位128位向量,但是没有这样的整数指令向量。
我的问题:
在整数向量上使用浮点指令时,是否有任何理由期望性能受到影响,例如:使用 movhps 将数据加载到整数向量?
我写了几个测试来检查,但我认为他们的结果不可信。很难编写一个正确的测试来探索这些事情的所有极端情况,特别是在这里最可能涉及指令调度时。
相关问题:
其他类似的事情也有几个基本相同的指令。例如,我可以使用 por , orps 或 orpd 进行按位OR运算。任何人都可以解释这些附加说明的目的是什么?我想这可能与应用于每条指令的不同调度算法有关。
答案 0 :(得分:25)
来自专家(显然不是我:P):http://www.agner.org/optimize/optimizing_assembly.pdf [13.2将矢量指令与其他类型的数据一起使用(第118-119页)]:
在某些处理器上使用错误类型的指令会受到惩罚。这是 因为处理器可能具有不同的数据总线或不同的整数执行单元 和浮点数据。在整数和浮点单位之间移动数据可以采用 一个或多个时钟周期,具体取决于处理器,如表13.2所示。
Processor Bypass delay, clock cycles Intel Core 2 and earlier 1 Intel Nehalem 2 Intel Sandy Bridge and later 0-1 Intel Atom 0 AMD 2 VIA Nano 2-3 Table 13.2. Data bypass delays between integer and floating point execution units