【问题标题】:extract a _m128 variable to float提取一个 _m128 变量以浮动
【发布时间】:2013-04-22 22:17:35
【问题描述】:
float myfunction ( P b1, P b2, int dimention )
{       
    __m128 v_b1,v_b2,v_b3;
    int j=0;

    for (int i=0; i<dimention/4; i++) {
        v_b1=_mm_load_ps(b1.c +j);
        v_b2=_mm_load_ps(b2.c +j);
        v_b3=_mm_sub_ps(v_b1,v_b2);
        j+=4;   
    }
}   

我真正想做的是:

for (int i=0; i<dimention; i++ ) {
    result += b1.c[i] - b2.c[i];
}

我想返回result。你能帮帮我吗?

【问题讨论】:

    标签: x86 sse simd


    【解决方案1】:

    我假设您想将所有差异相加,然后将其作为函数结果返回:

    #include <pmmintrin.h>                   // SSE3
    
    float myfunction ( P b1, P b2, int dimention )
    {       
        __m128 v_b1, v_b2, v_b3, v_b4;
        float f;
    
        v_b4 = _mm_setzero_ps();             // initialise sum of differences to zero
        for (int j = 0; j < dimention; j += 4)
        {
            v_b1 = _mm_load_ps(b1.c + j);    // load 4 floats from b1[j]
            v_b2 = _mm_load_ps(b2.c + j);    // load 4 floats form b2[j]
            v_b3 = _mm_sub_ps(v_b1, v_b2);   // calc 4 differences
            v_b4 = _mm_add_ps(v_b4, v_b3);   // accumulate 4 differences
        }
        v_b4 = _mm_hadd_ps(v_b4, v_b4);      // sum horizontally
        v_b4 = _mm_hadd_ps(v_b4, v_b4);      // (NB: need to do this twice to sum all 4 elements)
        _mm_store_ss(&f, v_b4);              // extract sum
        return f;                            // return sum
    }
    

    如果这不是您想要做的,请更新您的问题并提供更多详细信息,我会相应地更新代码。

    【讨论】:

    • 我编辑了我的问题...顺便说一句,我得到了这个错误“_mm_hadd_ps”没有在这个范围内声明
    • 好的 - 我认为我的解决方案适合你 - 请注意 _mm_hadd_ps 是 SSE3,所以你需要 #include &lt;pmmintrin.h&gt;
    • 非常感谢,我认为它有效!当我返回 f;我得到一个分段错误。还有其他建议吗?
    • 我可以看到上述代码出现段错误的唯一可能原因是 b1.c 或 b2.c 未正确对齐(它们都需要 16 字节对齐)。如果这不是问题,那么您将需要进一步调查并可能发布一个新问题。
    猜你喜欢
    • 2019-11-07
    • 2013-05-21
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多