我正在整理一个图像处理程序,我正在使用相对较小的图像(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;
}