如何使用 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;
}
我假设您在 src
和 ker
中的颜色值顺序为 rgb rgb rgb rgb
。
或者使用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;
}
我假设您在 src
和 ker
中的颜色值顺序为 rgb rgb rgb rgb
。