X86 将一个_m128变量提取为浮点 float myfunction(p1、b2、int维度) { __m128 v_b1、v_b2、v_b3; int j=0; 对于(int i=0;i

X86 将一个_m128变量提取为浮点 float myfunction(p1、b2、int维度) { __m128 v_b1、v_b2、v_b3; int j=0; 对于(int i=0;i,x86,sse,simd,X86,Sse,Simd,我假设您希望对所有差异求和,然后将其作为函数结果返回: for (int i=0; i<dimention; i++ ) { result += b1.c[i] - b2.c[i]; } #包括//SSE3 浮点myfunction(b1、b2、整数维) { __m128 v_b1、v_b2、v_b3、v_b4; 浮动f; v_b4=_mm_setzero_ps();//将差值之和初始化为零 对于(int j=0;j

我假设您希望对所有差异求和,然后将其作为函数结果返回:

for (int i=0; i<dimention; i++ ) {
    result += b1.c[i] - b2.c[i];
}
#包括//SSE3
浮点myfunction(b1、b2、整数维)
{       
__m128 v_b1、v_b2、v_b3、v_b4;
浮动f;
v_b4=_mm_setzero_ps();//将差值之和初始化为零
对于(int j=0;j

如果这不是你想要做的,那么请用更多的细节更新你的问题,我会相应地更新代码。

我编辑了我的问题…顺便说一下,我得到的这个错误“_mm_hadd_ps”没有在这个范围内声明好的-我想我的解决方案对你有效-注意
_mm_hadd_ps
是SSE3,所以你需要
#include
。非常感谢,我认为它可以工作!当我返回f时,我得到一个分段错误。还有其他建议吗?我能看到的上述代码seg错误的唯一可能原因是b1.c或b2.c未正确对齐(它们都需要16字节对齐).如果这不是问题所在,那么您需要进一步调查,也许还需要发布一个新问题。
for (int i=0; i<dimention; i++ ) {
    result += b1.c[i] - b2.c[i];
}
#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
}