与GCC广播的隐式SIMD(SSE / AVX)

时间:2014-02-12 11:58:46

标签: gcc sse simd avx

我已经将我的大部分SIMD代码转换为GCC的矢量扩展。但是,我没有找到一个很好的解决方案,如下所示做广播

__m256 areg0 = _mm256_broadcast_ss(&a[i]);

我想做

__m256 argeg0 = a[i];

如果你在Mutiplying vector by constant using SSE看到我的答案,我设法让广播与其他SIMD注册一起工作。以下作品:

__m256 x,y;
y = x + 3.14159f; // broadcast x + 3.14159
y = 3.14159f*x;  // broadcast 3.14159*x

但这不起作用:

 __m256 x;
 x = 3.14159f;  //should broadcast 3.14159 but does not work

如何使用GCC进行此操作?

1 个答案:

答案 0 :(得分:5)

我认为目前没有直接的方法,你必须使用你已经注意到的语法解决它:

__m256 zero={};
__m256 x=zero+3.14159f;

如果我们能够就良好的语法达成一致,将来可能会发生变化,请参阅PR 55726

请注意,如果要创建具有非常量{ s, s, ... s }的向量float s,则上述技术仅适用于整数,或者使用浮点数和-fno-signed-zeros。您可以将其调整为__m256 x=s-zero;,除非您使用-frounding-math,否则它将有效。 Z boson建议的最后一个版本是__m256 x=(zero+1.f)*s;,它应该适用于大多数情况(除了可能有关于sNaN的编译器偏执)。