【问题标题】:SSE: convert __m128 to floatSSE:将 __m128 转换为浮点数
【发布时间】: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 个浮点数,我想我可以轻松地将其转换回浮点数*。我究竟做错了什么? (这是一个测试代码,所以不要怀疑)。我基本上尝试了我能想到的所有可能的转换。谢谢你的帮助。

【问题讨论】:

    标签: c++ c sse


    【解决方案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);
    

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果您想避免不必要的复制,这确实是一种方法。许多 C++ 编码人员也应该学习使用 C++ 强制转换。虽然写起来很麻烦(嗯,不是真的有一个好的编辑器和补全),但它提高了可读性。
    猜你喜欢
    • 2012-02-28
    • 2011-05-24
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多