私は画像処理プログラムをまとめており、比較的小さな画像 (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;
}