我有以下一段 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 许可协议
您可以使用
_mm_store_ps
将__m128
向量存储到浮点数组中。然后,您可以访问该临时数组中的任何/所有元素,如果幸运的话,如果这样更有效,编译器会将其转换为随机播放而不是存储/重新加载。 (如果目的地不仅仅是临时的,而且您实际上希望将所有 4 个元素存储在某处,那么
_mm_storeu_ps
或store
正是您想要的。)如果你只想要低元素,
float _mm_cvtss_f32(__m128)
很好。如果您想在对数组求和或进行点积的循环之后将向量元素组合成一个浮点数,请参阅 Fastest way to do Horizontal SSE vector sum (or other reduction)