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

How can I optimize this code using valarray SIMD support?

或者使用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 循环

你可以这样做:

#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

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