使用OpenMP实现并行的IplImage转换

3

我希望能够使用OpenMP对IplImage进行一些转换操作。这是一个简单的转换,将图像颠倒过来。使用OpenMP的代码与不使用的代码运行的结果相同,所以这并不重要。

void UpsideDownFilter::filter(IplImage* dstImage) {
uchar temp;
int j;
int i;
#pragma omp parallel shared(dstImage) private(j, i, temp)
{
    //        std::cout << omp_get_thread_num() << std::endl;
#pragma omp for schedule(static, 30) nowait
    for(j = 0; j < dstImage->height / 2; ++j) {

        for(i = 0; i < dstImage->widthStep; ++i) {
            temp = dstImage->imageData[i + j * dstImage->widthStep];

            dstImage->imageData[i + j * dstImage->widthStep] =
                dstImage->imageData[i + (dstImage->height - 1 - j) * 
                                    dstImage->widthStep];

            dstImage->imageData[i + (dstImage->height - 1 - j) * 
                                dstImage->widthStep] = temp;
        }
    }
}
}

我已经将 #pragma omp for 放到了内部循环中。当我不知道出了什么问题时,我通常会做一些其他的魔法操作(删除这个,添加那个)。这是我从代码中调用该方法的方式:

for (vector<filter_ptr>::iterator it = filters.begin();
     it != filters.end(); ++it) {

    (*it)->filter(dstImage);
}

有人可以告诉我我做错了什么吗?

(此内容涉及IT技术问题)

你是否正在使用 -openmp 进行编译?为什么要使用 nowait? - Tudor
你可以拥有多个CPU核心,但仍然只有一个内存总线。这里的限制是,你只是在移动字节。 - Hans Passant
@Tudor 是的,我正在传递 -fopenmp 标志。 - Łukasz Klich
@Tudor 不用管你的第二个问题了。nowait 是这些“神奇”东西的一部分。我已经尝试了很多组合来解决它。 - Łukasz Klich
是的,我知道,我已经点赞了。你应该接受他的答案,他实际上做了验证结果的工作。它是准确的。 - Hans Passant
显示剩余3条评论
1个回答

3

由于我无法编译您的代码,所以我写了自己的代码,我认为它与您的代码非常相似。您已经将2D矩阵压平,但我并不认为这会影响我认为您的问题出在哪里。

#include <vector>

typedef std::vector<std::vector<double> > matrix_t;

void flip(matrix_t& A, int const m, int n)
{
    int m_2 = m / 2;
    #pragma omp parallel for
    for (int i = 0; i < m_2; ++i) {
        for (int j = 0; j < n; ++j) {
            std::swap(A[i][j], A[m - (i + 1)][j]);
        }
    }
}

int
main()
{
    int n = 20000;
    matrix_t A (n, std::vector<double>(n, 1.0));
    flip(A, n, n);
    return 0;
}

在四核机器上,我也没有获得加速的效果。

> g++ -O2 s18.cc && /usr/bin/time ./a.out && g++ -fopenmp -O2 s18.cc && /usr/bin/time ./a.out 
2.61user 2.18system 0:04.79elapsed 99%CPU (0avgtext+0avgdata 12805936maxresident)k
0inputs+0outputs (0major+800428minor)pagefaults 0swaps
7.67user 2.23system 0:04.71elapsed 210%CPU (0avgtext+0avgdata 12806512maxresident)k
0inputs+0outputs (0major+800481minor)pagefaults 0swaps

我认为没有加速的原因是程序受到内存限制,也就是说程序的速度受到从内存发送和接收数据的速度控制。因此,无论你有多少核心,都不能更快,因为它们不是限制因素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接