使用 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 样式转换。
有两种使用 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 样式转换。