gpt4 book ai didi

c++ - 使用 OpenMP 的并行 IplImage 转换

转载 作者:太空狗 更新时间:2023-10-29 21:27:33 26 4
gpt4 key购买 nike

我想使用 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);
}

谁能告诉我我做错了什么?

最佳答案

由于我无法编译您的代码,所以我自己编写了我认为非常相似的代码。你已经展平了你的 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

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

关于c++ - 使用 OpenMP 的并行 IplImage 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8899528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com