我已经将我的大部分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进行此操作?
答案 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的编译器偏执)。