0

我正在整理一个图像处理程序,并且正在处理相对较小的图像(640x480)。串行运行,处理一张图像只需要不到 0.1 秒,但我需要它更快,因为它稍后会接收视频流。

我有两个或三个嵌套的 for 循环,我正在尝试加速,并且正在尝试使用 #pragma omp parallel for。

其中一个 for 循环的结构如下:

//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