0

私は画像処理プログラムをまとめており、比較的小さな画像 (640x480) を扱っています。シリアルで実行すると、画像を処理するのに 0.1 秒未満しかかかりませんが、後でビデオ ストリームを取り込むため、もっと高速にする必要があります。

高速化しようとしているネストされた for ループが 2 つまたは 3 つあり、#pragma omp parallel for を使用しようとしています。

for ループの 1 つは、次のように構成されています。

//xLen = 640, yLen = 480
#pragma omp parallel for
for(int y=0;y<yLen;y++) {
    double yR = y/((double)yLen);

    double y1 = dyl*yR+yt_1;
    double y2 = dyr*yR+yt_2;

    double x1 = (y1-yt_1)/ml+xt_1;
    double x2 = (y2-yt_2)/mr+xt_2;


    for(int x=0;x<xLen;x++) {
        double xR = x/((double)xLen);

        double X = ((x2-x1)*xR+x1);
        double Y = ((y2-y1)*xR+y1);

        // Final estimation
        lookup(x,y)[0] = X;
        lookup(x,y)[1] = Y;
    }

}

dyl、dyr、yt_1、yt_2、xt_1、xt_2、ml、および mr はすべて上記のコードで定義されており、for ループによって変更されません。

このような小さなループ サイズに対して、OpenMP に期待しすぎているのでしょうか?

編集:私は単一のループに変換しましたが、まだ高速化できません。

#pragma omp parallel for
for(int p=0;p<xLen*yLen;p++) {
    int y = p/xLen;
    int x = p%xLen;

    double xR = x/((double)xLen);
    double yR = y/((double)yLen);

    double y1 = dyl*yR+yt_1;
    double y2 = dyr*yR+yt_2;

    double x1 = (y1-yt_1)/ml+xt_1;
    double x2 = (y2-yt_2)/mr+xt_2;

    double X = ((x2-x1)*xR+x1);
    double Y = ((y2-y1)*xR+y1);

    lookup[p] = X;
    lookup[p+xLen*yLen] = Y;            

}
4

0 に答える 0