SSE:将 __m128 转换为浮点数

Posted

技术标签:

【中文标题】SSE:将 __m128 转换为浮点数【英文标题】:SSE: convert __m128 to float 【发布时间】:2013-01-16 20:49:11 【问题描述】:

我有以下一段 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 个浮点数,我想我可以轻松地将其转换回浮点数*。我究竟做错了什么? (这是一个测试代码,所以不要怀疑)。我基本上尝试了我能想到的所有可能的转换。谢谢你的帮助。

【问题讨论】:

【参考方案1】:

您需要使用_mm_store_ps 将其恢复为浮点数。代码:

// result must be 16-byte aligned
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);

【讨论】:

非常感谢。那很容易。我现在到外地了,很抱歉这个愚蠢的问题 Watch out with stack variables though, result should be 16-byte aligned.【参考方案2】:

我相信如果你施法得当,施法会奏效。我面前没有代码,但我很确定这对我有用:

float *arrq = reinterpret_cast<float*>(&pDest);

请注意,它使用 C++ 强制转换来描述您在做什么,并将其 地址 转换为指针。

【讨论】:

如果您想避免不必要的复制,这确实是一种方法。许多 C++ 编码人员也应该学习使用 C++ 强制转换。虽然写起来很麻烦(嗯,不是真的有一个好的编辑器和补全),但它提高了可读性。

以上是关于SSE:将 __m128 转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

使用内在函数将双 SSE2/AVX/AVX512 存储为浮点数的最佳方法

将常量浮点数加载到 SSE 寄存器中

如何将 4 个浮点数的 ps 向量转换为 4 个双精度数并存储到 pd 数组?

如何将单精度浮点数的 XMM 寄存器转换为整数?

将 CString 转换为浮点数

SSE 整数与浮点数练习