相关疑难解决方法(0)

将常量浮点载入SSE寄存器

我试图找出一种有效的方法将编译时常量浮点数加载到SSE(2/3)寄存器中.我试过做这样简单的代码,

const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f }; 
Run Code Online (Sandbox Code Playgroud)

但是这会从内存中生成4个movss指令!

movss       xmm0,dword ptr [__real@3f800000 (14048E534h)] 
movss       xmm1,dword ptr [__real@40000000 (14048E530h)] 
movaps      xmm6,xmm12 
shufps      xmm6,xmm12,0C6h 
movss       dword ptr [rsp],xmm0 
movss       xmm0,dword ptr [__real@40400000 (14048E52Ch)] 
movss       dword ptr [rsp+4],xmm1 
movss       xmm1,dword ptr [__real@40a00000 (14048E528h)] 
Run Code Online (Sandbox Code Playgroud)

它将标量加载到内存中......(?!?!)

这样做虽然..

float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope
Run Code Online (Sandbox Code Playgroud)

产生.

movaps      xmm5,xmmword ptr [::myarray4 (140512050h)]
Run Code Online (Sandbox Code Playgroud)

理想情况下,如果我有常量它们将是一种不甚至触摸内存的方式并且只是使用直接样式指令(例如编译到指令本身的常量).

谢谢

assembly sse

11
推荐指数
1
解决办法
9669
查看次数

使用GCC进行SIMD(SSE/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做到这一点?

gcc sse simd avx

6
推荐指数
1
解决办法
975
查看次数

标签 统计

sse ×2

assembly ×1

avx ×1

gcc ×1

simd ×1