17

我最近经常以内部函数的形式使用 x86 SIMD 指令 (SSE1234)。我发现令人沮丧的是,SSE ISA 有几个简单的指令,它们仅适用于浮点数或整数,但理论上两者的性能应该相同。例如,浮点向量和双精度向量都有从地址(movhpsmovhpd)加载 128 位向量的高 64 位的指令,但对于整数向量没有这样的指令。

我的问题:

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

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

相关问题:

其他琐碎相似的事情也有几条基本相同的指令。例如,我可以对pororpsorpd进行按位或运算。谁能解释这些附加说明的目的是什么?我猜这可能与应用于每条指令的不同调度算法有关。

4

1 回答 1

28

来自专家(显然不是我: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 
于 2011-02-14T22:32:50.947 回答