【发布时间】:2012-01-17 18:12:07
【问题描述】:
我想使用 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);
}
谁能告诉我我做错了什么?
【问题讨论】:
-
您是否使用-openmp 进行编译?为什么要使用 nowait?
-
您可以拥有多个 CPU 内核,但您仍然只有一个内存总线。这是这里的限制,你只是在移动字节。
-
如果您不相信,请添加有关您正在运行的进程数量的检查,请参阅
int omp_get_num_threads() -
@Tudor 是的,我正在传递 -fopenmp 标志。
-
@HansPassant 鲍伊也是这么说的
标签: c++ multithreading opencv openmp