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

时间:2013-12-08 03:02:08

标签: intrinsics avx

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

我的代码需要使用向量整数运算(用于加载和存储数据)以及向量浮点运算。整数代码用SSE2内在函数编写,与旧CPU兼容,而浮点用AVX写入以提高速度(还有SSE代码分支,所以不建议这样做。)

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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