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 存储为浮点数的最佳方法