如何使用valarray SIMD支持优化此代码?

时间:2015-01-03 11:39:25

标签: c++ visual-studio-2010 optimization simd

或使用SIMD说明?

#include <iostream>
#include <string>

#define  sz 10000;

typedef struct pixel{
    int b,g,r;
};

int main()
{
  pixel * src = new pixel[sz];  // arrays filled
  pixel * ker = new pixel[sz];  // by random values

  pixel px;
  px.r=px.g=px.b=0;
  for (int i=0; i<sz; i++){
      px.r+=src[i].r*ker[i].r;
      px.g+=src[i].r*ker[i].g;
      px.b+=src[i].r*ker[i].b;
  }


  return 0;
}

src - 一个包含一些随机值的数组。

ker - 类似src,也包含随机值。

应该优化for循环

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

#include <valarray>

#define sz 1000

struct pixel { int r, g, b; };

int main()
{
    std::valarray<int> src(3 * sz);
    std::valarray<int> ker(3 * sz);

    std::valarray<int> t = src * ker;

    pixel px;
    px.r = t[t % 3 == 0].sum();
    px.g = t[t % 3 == 1].sum();
    px.b = t[t % 3 == 2].sum();

    return 0;
}

我假设您在srcker中的颜色值为rgb rgb rgb rgb

链接到文档http://en.cppreference.com/w/cpp/numeric/valarray