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