Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 什么';Vextract128和vextractf128的区别是什么?_X86_Simd_Avx_Avx2 - Fatal编程技术网

X86 什么';Vextract128和vextractf128的区别是什么?

X86 什么';Vextract128和vextractf128的区别是什么?,x86,simd,avx,avx2,X86,Simd,Avx,Avx2,vextract128和vextractf128具有相同的功能、参数和返回值。另外一个是AVX指令集,另一个是AVX2。有什么区别 好问题-看起来AVX指令vextractf128适用于任何向量类型(int、float、double),而AVX2指令vextract128仅适用于int向量。我建议在使用AVX2和整数向量时使用后者,以防它在某些情况下提供更好的性能,否则使用前者。vextract128和vextractf128不仅具有相同的功能、参数和返回值。它们具有相同的指令长度。而且它们具有

vextract128
vextractf128
具有相同的功能、参数和返回值。另外一个是AVX指令集,另一个是AVX2。有什么区别

好问题-看起来AVX指令
vextractf128
适用于任何向量类型(int、float、double),而AVX2指令
vextract128
仅适用于int向量。我建议在使用AVX2和整数向量时使用后者,以防它在某些情况下提供更好的性能,否则使用前者。

vextract128
vextractf128
不仅具有相同的功能、参数和返回值。它们具有相同的指令长度。而且它们具有相同的吞吐量(根据Agner Fog的优化手册)

不完全清楚的是它们的延迟值(依赖链紧循环中的性能)。指令本身的延迟为3个周期。但在阅读了《英特尔优化手册》第2.1.3节(“执行引擎”)后,我们可能会怀疑,使用浮点数据时,
vextract128
应额外获得1个时钟延迟,而使用整数数据时,
vextractf128
应额外获得1个时钟延迟。测量结果表明,这是不正确的,延迟总是正好保持3个周期(至少对于Haswell处理器)。据我所知,优化手册中没有记录这一点

静态指令集只是处理器的接口。Haswell是这个接口的唯一实现,包含这两个指令(目前)。我们可以忽略这样一个事实,即这些指令的实现(很可能)是相同的。并按预期使用这些说明-
vextract128
用于整数数据,而
vextractf128
用于FP数据。(如果我们只需要在不执行任何int/FP操作的情况下对数据进行重新排序,那么显而易见的选择是
vextractf128
,因为它受多个旧处理器的支持)。经验还表明,英特尔有时会降低下一代CPU中某些指令的性能,因此,明智的做法是观察这些指令的相关性,以避免将来可能出现的速度下降

由于《英特尔优化手册》并未详细描述SIMD指令的int/FP域之间的关系,因此我(在Haswell上)进行了更多的测量,并得到了一些有趣的结果:


洗牌指令 SSE integer指令和shuffle指令之间的任何转换都没有额外延迟。SSE FP指令和随机指令之间的任何转换都没有额外的延迟。(虽然我没有测试每一条指令)。例如,您可以在两条FP指令之间插入“显然是整数”指令,如
pshufb
,而无需额外延迟。在整数代码的中间插入<代码> SUFPDP<代码>也没有额外的延迟。

由于
vextract128
vextractf128
是由随机播放单元执行的,因此它们也具有此“无延迟”属性

这对于优化混合int+FP代码可能很有用。如果需要将FP数据重新解释为整数,同时洗牌寄存器,只需确保所有FP指令位于洗牌之前,所有整数指令位于洗牌之后


FP逻辑指令
和ps
以及其他FP逻辑指令也具有忽略FP/int域的属性

如果将整数逻辑指令(如
pand
)添加到FP代码中,将获得额外的2个周期延迟(一个用于到达int域,另一个用于返回FP)。因此,SIMD FP代码的明显选择是
和ps
。相同的<>代码> ANDS可以在整数代码的中间使用,没有任何延迟。更好的方法是在int和FP指令之间使用这样的指令。有趣的是,FP逻辑指令与所有随机指令使用相同的端口号5


注册访问 《英特尔优化手册》介绍了生产者和消费者微操作之间的旁路延迟。但它没有说明微操作如何与寄存器交互

这段代码每次迭代只需要3个时钟(正如
vaddps
所要求的那样):

但这一次迭代需要2个时钟(比
vpaddd
多需要1个时钟):

这里唯一的区别是在整数域而不是FP域中进行计算。要获得1个时钟/迭代,我们需要添加一条指令:

    vpxor ymm7, ymm7, ymm7
_benchloop:
    vpand ymm6, ymm7, ymm7
    vpaddd ymm0, ymm0, ymm6
    jmp _benchloop

这提示(1)存储在SIMD寄存器中的所有值都属于FP域,(2)从SIMD寄存器读取会将整数操作的延迟增加1。(此处{ymm0,ymm6}和ymm7之间的区别在于,ymm7存储在一些暂存存储器中,作为实“寄存器”工作,而ymm0和ymm6是临时的,由内部CPU的互连状态表示,而不是一些永久存储器,因此ymm0和ymm6不是“读取”,而是在微操作之间传递).

谢谢你的回答。我没有找到Vextract128延迟和吞吐量数据。现在,我假设它们的功能是一致的,所以我使用了vextractf128,因为它与旧的CPU兼容。Vextract128仅在cpu haswell和更高版本上可用。在最新的intel(2013年7月)64-ia-32-architectures-optimization-manual.pdf中,没有关于Vextract128的延迟和吞吐量数据。一旦Vextract128整数数据处理具有额外的性能优势,我将使用它,但现在不使用。谢谢。VS2012 C++有一个bug,编译时偶尔会有错误的反转两个寄存器。编译vextractf128指令是正确的。VS2013 C++似乎是对的。Sandybridge的登记文件重新设计删除了ROB读端口档。在转发网络中保留值的建议现在已经过时了。循环每2次只能运行1次迭代
    vpxor ymm7, ymm7, ymm7
_benchloop:
    vpaddd ymm0, ymm0, ymm7
    jmp _benchloop
    vpxor ymm7, ymm7, ymm7
_benchloop:
    vpand ymm6, ymm7, ymm7
    vpaddd ymm0, ymm0, ymm6
    jmp _benchloop