使用 AVX 内在函数进行转换

Casting with AVX intrinsics

有两种使用 AVX2 进行投射的方法:

__m256i b = ...set register...
auto c = (__m256d)b; // version 1
auto d = _mm256_castsi256_pd(b); // version 2

我假设这两个应该给出相同的结果。 Intel 的 official manual 表示版本 2 的运行时延迟为零。我可以使用版本 1 以及零延迟假设吗?此外,我是否可以假设从版本 1 到任何寄存器类型的转换都是零延迟。

至少在 gcc 中,'version 1' 正是 'version 2' 的实现方式:

extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm256_castsi256_pd (__m256i __A)
{
  return (__m256d) __A;
}

https://github.com/gcc-mirror/gcc/blob/gcc-8_1_0-release/gcc/config/i386/avxintrin.h#L1440

Clang 本质上是一样的: https://github.com/llvm-mirror/clang/blob/release_60/lib/Headers/avxintrin.h#L4449

我没有寻找其他编译器,但我也不认为那里会发生任何魔法。

不过,为了可移植性和可读性,我建议使用 _mm256_castsi256_pd,或者如果这样写太多,请将其封装到您自己的(内联)函数中。如果您需要重构它们,在源代码中相对很难找到 C 样式转换。