【问题标题】:Converting a function using SSE SIMD使用 SSE SIMD 转换函数
【发布时间】:2013-01-16 20:51:37
【问题描述】:

我试图在函数中使用 sse simd 指令来评估一个值。

    double integrate (double from, double to,double* counter)
{

    __m128d sum=_mm_setzero_pd();
    __m128d val=_mm_setzero_pd();
    __m128d width;
    __m128d fr=_mm_set1_pd(from);
    __m128d t=_mm_set1_pd(to);
    __m128d one=_mm_set1_pd(1.0);
    __m128d a,b,c,step;
    double result=0,i=0;

    width=_mm_set1_pd((to-from)/1000);

    while(i<1000){
    step = _mm_loadu_pd(&counter[i]);
    a    = _mm_mul_pd(step,width);
    b    = _mm_add_pd(fr,a);
        val  = _mm_div_pd(one,b);   
    c    = _mm_mul_pd(val,width);
    sum  = _mm_mul_pd(sum,c);
    i=i+2;
    }

    for(int i=0; i<1000; i++) {
        result += sum[i];
    }

    return result;
}

它需要3个参数,其中两个是双精度的,其中一个是用于将数组传递给函数的双指针。我尝试转换的代码是这样的;

double integrate (double from, double to)
{
    double sum=0,val=0,width;
    int i;
    width=(to-from)/1000;

    for(i=1;i<1000;i++){    
    val=1/(from+(i*width));
    sum=sum+(val*width);
    }

    return sum;
}

代码评估一个值,但它不是我预期的。据我所知,我真正的问题是关于这部分;

step = _mm_loadu_pd(&counter[i]);

我想要做的是将名为 counter 的数组中的数字(保存从 0 到 999 的数字)传递到步进向量 2 数字中(例如 r0:0 r1:1,r0:2,r1:3)并评估其他的东西。我做错了什么?

【问题讨论】:

  • 我可以问你为什么你要这样做,因为编译器会为此生成一个很好的 SSE 代码?
  • 因为是作业

标签: c function sse simd


【解决方案1】:

变化:

step = _mm_loadu_pd(&counter[i]);

到:

step = _mm_set1_pd(counter[i]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2013-03-21
    • 2014-01-04
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多