SSE:将 __m128 转换为浮点数

新手上路,请多包涵

我有以下一段 C 代码:

 __m128 pSrc1 = _mm_set1_ps(4.0f);
__m128 pDest;
int i;
for (i=0;i<100;i++) {
       m1 = _mm_mul_ps(pSrc1, pSrc1);
       m2 = _mm_mul_ps(pSrc1, pSrc1);
       m3 = _mm_add_ps(m1, m2);
       pDest = _mm_add_ps(m3, m3);
}

float *arrq = (float*) pDest;

直到 for 循环结束之前的一切都有效。我现在要做的是将 __m128 类型转换回浮动。由于它存储了 4 个浮点数,我想我可以轻松地将其转换回浮点数*。我究竟做错了什么? (这是一个测试代码,所以不要怀疑)。我基本上尝试了我能想到的所有可能的转换。谢谢你的帮助。

原文由 user1972382 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 765
1 个回答

您可以使用 _mm_store_ps__m128 向量存储到浮点数组中。

 alignas(16) float result [4];
_mm_store_ps (result, pDest);

// If result is not 16-byte aligned, use _mm_storeu_ps
// On modern CPUs this is just as fast as _mm_store_ps if
// result is 16-byte aligned, but works in all other cases as well
_mm_storeu_ps (result, pDest);

然后,您可以访问该临时数组中的任何/所有元素,如果幸运的话,如果这样更有效,编译器会将其转换为随机播放而不是存储/重新加载。 (如果目的地不仅仅是临时的,而且您实际上希望将所有 4 个元素存储在某处,那么 _mm_storeu_psstore 正是您想要的。)

如果你只想要低元素, float _mm_cvtss_f32(__m128) 很好。

如果您想在对数组求和或进行点积的循环之后将向量元素组合成一个浮点数,请参阅 Fastest way to do Horizontal SSE vector sum (or other reduction)

原文由 Anteru 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题