gpt4 book ai didi

intrinsics - 在 AVX 内在函数中使用 xmm 参数

转载 作者:行者123 更新时间:2023-12-05 03:15:09 25 4
gpt4 key购买 nike

是否可以将 xmm 寄存器参数与 AVX 内在函数一起使用 (_mm256_**_**)?

我的代码需要使用矢量整数运算(用于加载和存储数据)以及矢量浮点运算。整型代码用SSE2 intrinsics写,兼容老CPU, float 用AVX写,提高速度(也有SSE代码分支,不建议这样做)。

目前,除了使用编译器标志自动将所有 SSE 指令转换为 VEX 编码版本外,是否有任何方法使用内部函数(即无内联/外部汇编)强制在 XMM 寄存器上使用 VEX 编码指令?

注意:我尝试了 _mm256_castsi128_si256(),这会生成带有 ymm 操作数的指令。

最佳答案

您有一个带有 AVX 的处理器。它没有 XMM 寄存器,只有 YMM 寄存器。如果您使用 AVX 支持编译所有代码(例如,使用 GCC 中的 -mavx 或 MSVC 中的/arch:AVX),那么您所有的 SSE2 代码都在 YMM 寄存器的低 128 位上运行。没有什么可担心的。

但是,假设您有两个不同的模块,一个是在支持 SSE2 的情况下编译的(例如,在 GCC 中使用 -msse2 或在 MSVC 中使用/arch:SSE2),另一个在支持 AVX 的情况下使用,并且您使用了两者的函数,那么您确实有一些东西当你在它们之间切换时担心。在这种情况下,当您从 AVX 代码切换到 SSE2 代码时,您应该调用 _mm256_zeroupper() 或 _mm256_zeroall(),除非您想降低性能。 Using AVX CPU instructions: Poor performance without "/arch:AVX"

简单的解决方案是只编译所有支持 AVX 的代码。我能想到的编译具有不同指令集支持的不同模块的唯一原因是,如果您想制作一个 CPU 调度程序,以便您的代码可以在不同的处理器上运行。实现起来有点痛苦。但是你不做状态改变所以我能想到你唯一需要担心状态改变的时候是当你从一个共享库调用函数时,它是用另一个指令集编译的(例如,用 SSE2 编译的 DLL)。在这种情况下,您可能需要在从 AVX 代码调用库函数时调用 _mm256_zeroupper() 或 _mm256_zeroall()

关于intrinsics - 在 AVX 内在函数中使用 xmm 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449379/

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