混合SSE整数/浮点SIMD指令时,是否会降低性能?

17 c assembly sse simd intrinsics

我最近以内在函数的形式使用了x86 SIMD指令(SSE1234).我发现令人沮丧的是,SSE ISA有几个简单的指令,只能用于浮点数或仅用于整数,但理论上它们应该同样适用于两者.例如,float和double向量都有指令从地址(movhps,movhpd)加载更高的64位128位向量,但是没有这样的整数向量指令.

我的问题:

在整数向量上使用浮点指令时是否有任何理由期望性能受到影响,例如使用movhps将数据加载到整数向量?

我写了几个测试来检查,但我认为他们的结果不可信.编写一个正确的测试来探索这些事情的所有极端情况真的很难,特别是在这里可能涉及指令调度时.

相关问题:

其他平凡相似的东西也有几个基本相同的指令.例如,我可以使用por,orpsorpd按位OR .任何人都可以解释这些附加说明的目的是什么?我想这可能与应用于每条指令的不同调度算法有关.

Loc*_*bly 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 
Run Code Online (Sandbox Code Playgroud)

  • 我在http://stackoverflow.com/a/31233017/224132上写了一个关于"por` vs.` orps`的选择问题的详细答案.看看延迟不是唯一的考虑因素.(例如`por`可以运行在比'orps`更多的端口上.) (2认同)
  • 另请注意,在Core2/Penryn(pre-Nehalem)上,`por`,`orps`和`orpd`都是vector-int域操作.对于当前的AMD CPU也是如此. (2认同)