使用GCC进行SIMD(SSE/AVX)广播

Z b*_*son 6 gcc sse simd avx

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

__m256 areg0 = _mm256_broadcast_ss(&a[i]);
Run Code Online (Sandbox Code Playgroud)

我想要做

__m256 argeg0 = a[i];
Run Code Online (Sandbox Code Playgroud)

如果你通过使用SSE常数看到我在Mutiplying向量的答案,我设法让广播与另一个SIMD寄存器一起工作.以下作品:

__m256 x,y;
y = x + 3.14159f; // broadcast x + 3.14159
y = 3.14159f*x;  // broadcast 3.14159*x
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

 __m256 x;
 x = 3.14159f;  //should broadcast 3.14159 but does not work
Run Code Online (Sandbox Code Playgroud)

我怎样才能用GCC做到这一点?

Mar*_*sse 5

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

__m256 zero={};
__m256 x=zero+3.14159f;
Run Code Online (Sandbox Code Playgroud)

如果我们能够就良好的语法达成一致,将来可能会发生变化,请参阅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的偏执).