2015-01-03 13 views
-1

或使用SIMD指令?如何使用valarray 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-like src,也包含隨機值。

的用於循環應該優化

+0

不是應該 'PX.R + = SRC [i]於.R * ker的[I] .R;'' + PX.G = SRC [i]於.G * ker [i] .g;' 'px.b + = src [i] .b * ker [i] .b;' ? – justanothercoder

+0

「blablabla只是一個文本」 - 如果你不喜歡這個網站的規則,你不會被迫參與。如果你想參加,請堅持他們,他們在這裏有一個很好的理由。 – BartoszKP

+0

@BartoszKP,抱歉,但我不知道我應該寫在那裏 –

回答

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; 
} 

我這裏假設你爲了rgb rgb rgb rgbsrcker顏色值。

鏈接到文檔http://en.cppreference.com/w/cpp/numeric/valarray

+0

thnx,但是命令是bgr bgr bgr,作爲windows中的顏色通道順序bmp standart –

+0

還有一個問題 - 如果像素結構中的r,g和b將具有char類型,那麼您的解決方案將工作嗎? –

+0

你可以用這種方式重寫它,這個命令就是'bgr'。如果'r,g,b'是'char'類型,它就會工作。 – justanothercoder