【发布时间】:2013-09-03 16:38:27
【问题描述】:
我有这个代码:
#pragma omp parallel for
for( i=0;i<(int)table.size();i++)
{
Vec3b bgrPixel;
TableElement element=table[i];
bgrPixel = inputImage.at<Vec3b>(element.InputPixel.y,element.InputPixel.x);
outputImage.at<Vec4b>(element.OutputPixel.y,element.OutputPixel.x)[0] = bgrPixel[0];
outputImage.at<Vec4b>(element.OutputPixel.y,element.OutputPixel.x)[1] = bgrPixel[1];
outputImage.at<Vec4b>(element.OutputPixel.y,element.OutputPixel.x)[2] = bgrPixel[2];
outputImage.at<Vec4b>(element.OutputPixel.y,element.OutputPixel.x)[3] = 255;
}
当我运行它时,我可以看到只使用了 25% 的处理器功率。我相信它不是并行运行的。为什么它不是并行运行的,我该如何提高它的性能?
图像是 OpenCV mat 对象。
【问题讨论】:
-
桌子的尺寸是多少?另外, OMP_NUM_THREADS 的值是多少?
-
表比较大(大约 100K 条目),我的系统最多可以有 4 个线程。我在同一个应用程序中有另一个并行运行的循环,并且在该循环期间我的 CPU 使用率为 100%。
-
循环内部的逻辑看起来很简单(我不熟悉你的代码,所以如果我错了请纠正我)。因此,每个执行一些简单分配的 4 个线程可能不会消耗。所以也许低使用率是预期的。尝试增加线程数,看看会发生什么。
-
@GabiTurliu 好的,我会这样做,但在我的 i7 笔记本电脑上,整个循环工具大约需要 5 秒。我需要一种方法来减少这个时间。我的 CPU 可以并行运行 4 个线程,所以我认为使用 4 个线程是最佳的。
-
一个愚蠢的问题 - 您在编译代码时是否启用了 OpenMP 支持?现在几乎没有编译器默认启用此支持,并且必须明确启用它:
-fopenmpfor GCC,-openmpfor Intel,-mpfor PGI,/openmp(或项目中的相应选项设置)用于 MSVC++。
标签: c++ multithreading opencv optimization openmp