声明与 SIMD 类型的联合是否有害?
Is it harmful to declare union with SIMD types?
我写了一个 SIMD 包装器。为了方便不同类型的使用,我把它做成了一个联合:
#include <emmintrin.h>
union SIMDType16
{
__m128 simd_by_float;
__m128i simd_by_int;
__m128d simd_by_double;
}
但是,我从某个地方听说Intel SIMD intrisics 中的类型信息与硬件使用有关。那么,我对并集的定义会导致潜在的效果损失吗?
这绝对没问题,当然除了有很多原因导致联合会给您带来麻烦之外,完全独立于 SIMD 类型。例如,如果您分配给 sims_by_float 然后读取 simd_by_double,您将调用未定义的行为并且您的程序可能会崩溃。参见 C++ Undefined behaviour with unions
由于存在可在各种向量类型之间进行转换(并且不生成代码)的内在函数,除非有非常非常非常好的理由,否则我不会使用这种联合。
我写了一个 SIMD 包装器。为了方便不同类型的使用,我把它做成了一个联合:
#include <emmintrin.h>
union SIMDType16
{
__m128 simd_by_float;
__m128i simd_by_int;
__m128d simd_by_double;
}
但是,我从某个地方听说Intel SIMD intrisics 中的类型信息与硬件使用有关。那么,我对并集的定义会导致潜在的效果损失吗?
这绝对没问题,当然除了有很多原因导致联合会给您带来麻烦之外,完全独立于 SIMD 类型。例如,如果您分配给 sims_by_float 然后读取 simd_by_double,您将调用未定义的行为并且您的程序可能会崩溃。参见 C++ Undefined behaviour with unions
由于存在可在各种向量类型之间进行转换(并且不生成代码)的内在函数,除非有非常非常非常好的理由,否则我不会使用这种联合。