C++ 基于OpenMP的并行IplImage转换

C++ 基于OpenMP的并行IplImage转换,c++,multithreading,opencv,openmp,C++,Multithreading,Opencv,Openmp,我想使用OpenMP对IplImage进行一些转换。这是一个简单的转换,把图像颠倒过来。使用OpenMP的代码与不使用OpenMP的代码运行相同。这并不重要 void UpsideDownFilter::filter(IplImage* dstImage) { uchar temp; int j; int i; #pragma omp parallel shared(dstImage) private(j, i, temp) { // std::cout <<

我想使用OpenMP对IplImage进行一些转换。这是一个简单的转换,把图像颠倒过来。使用OpenMP的代码与不使用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;
        }
    }
}
}
void UpsideDownFilter::filter(IplImage*dstImage){
乌查尔温度;
int j;
int i;
#pragma omp并行共享(dstImage)专用(j、i、temp)
{
//标准::cout widthStep;++i){
temp=dstImage->imageData[i+j*dstImage->widthStep];
dstImage->imageData[i+j*dstImage->widthStep]=
dstImage->imageData[i+(dstImage->高度-1-j)*
DSTMImage->widthStep];
dstImage->imageData[i+(dstImage->高度-1-j)*
dstImage->widthStep]=温度;
}
}
}
}
我已经将#pragma omp for推到了内部循环。当我不知道怎么回事的时候,我已经做了所有其他我通常做的神奇的事情(删除这个,添加那个)。下面是我如何从代码中调用该方法:

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

    (*it)->filter(dstImage);
}
for(vector::iterator it=filters.begin();
it!=过滤器.end();++it){
(*it)->过滤器(DST图像);
}

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

因为我不能编译你的代码,所以我自己写了我认为很相似的代码。你已经把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;
}

我认为没有加速的原因是程序内存有限。也就是说,程序的速度由向存储器发送数据和从存储器发送数据的速度控制。因此,无论您拥有多少内核,您都无法加快速度,因为它们不是限制因素。

您是使用-openmp编译的吗?你为什么要使用nowait?你可以有多个CPU核,但你仍然只有一条内存总线。这就是这里的限制,您只是在移动字节。如果您不相信,请添加有关您正在运行的进程数的检查,请参阅
int-omp\u-get\u-num\u-threads()
@Tudor是的,我正在传递-fopenmp标志。@HansPassant这也是Bowie所说的
> 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