gpt4 book ai didi

x86 - vextracti128 和 vextractf128 有什么区别?

转载 作者:行者123 更新时间:2023-12-02 03:32:47 28 4
gpt4 key购买 nike

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

最佳答案

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

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

指令集只是处理器的接口(interface)。 Haswell 是此接口(interface)的唯一实现,其中包含这两个指令(目前)。我们可以忽略这些指令的实现(很可能)相同的事实。并按预期使用这些说明 - vextracti128用于整数数据和 vextractf128对于 FP 数据。 (如果我们只需要重新排序数据而不执行任何 int/FP 操作,明显的选择是 vextractf128,因为它被几个旧处理器支持)。经验还表明,英特尔有时会降低下一代 CPU 中某些指令的性能,因此最好观察这些指令的亲和性,以避免将来出现任何可能的速度下降。

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

洗牌说明

SSE 整数和随机指令之间的任何转换都没有额外的延迟。并且 SSE FP 和 shuffle 指令之间的任何转换都没有额外的延迟。 (虽然我没有测试每条指令)。例如,您可以插入这样的“明显整数”指令,如 pshufb两个 FP 指令之间没有额外的延迟。插入 shufpd在整数代码中间也没有额外的延迟。

vextracti128vextractf128由 shuffle 单元执行,它们也具有“无延迟”属性。

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

FP 逻辑指令
andps和其他 FP 逻辑指令也具有忽略 FP/int 域的特性。

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

注册访问

英特尔优化手册描述了生产者和消费者微操作之间的绕过延迟。但它没有说明微操作如何与寄存器交互。

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

    vxorps ymm7, ymm7, ymm7
_benchloop:
vaddps ymm0, ymm0, ymm7
jmp _benchloop

但是这个每次迭代需要 2 个时钟(比 vpaddd 需要的多 1 个):
    vpxor ymm7, ymm7, ymm7
_benchloop:
vpaddd ymm0, ymm0, ymm7
jmp _benchloop

这里唯一的区别是整数域而不是 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 不是“读取”,而是在微操作之间传递)。

关于x86 - vextracti128 和 vextractf128 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996827/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com