【问题标题】:Is it harmful to declare union with SIMD types?声明与 SIMD 类型的联合是否有害?
【发布时间】:2015-07-31 08:10:09
【问题描述】:

我写了一个 SIMD 包装器。为了方便不同类型的使用,我把它做成了一个联合:

#include <emmintrin.h>

union SIMDType16
{
    __m128 simd_by_float;
    __m128i simd_by_int;
    __m128d simd_by_double;
}

但是,我从某个地方听说英特尔 SIMD intrisics 中的类型信息与硬件使用情况有关。那么,我对联合的定义是否会导致潜在的效果损失?

【问题讨论】:

  • 我会说不,您的方法似乎是包装不同类型的标准方法,我已经看到它在其他地方使用。我还听说人们在 __m128 已被定义为联合时遇到了编译问题,但我预计这可能是程序员错误 - 因为它通常是 typedef'ed

标签: c simd intrinsics


【解决方案1】:

这绝对没问题,当然,除了完全独立于 SIMD 类型之外,工会可能会给您带来麻烦的原因有很多。例如,如果您分配给 sims_by_float 然后读取 simd_by_double,您会调用未定义的行为并且您的程序可能会崩溃。见C++ Undefined behaviour with unions

由于有内在函数可以在各种向量类型之间进行转换(并且不生成代码),除非有非常、非常、非常好的理由,否则我不会使用这种联合。

【讨论】:

  • 问题被标记为C,我相信,从C99开始,这种通过联合的双关语是允许的。
猜你喜欢
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
相关资源
最近更新 更多