OpenMP不会在不同的线程中运行此for循环,我该如何解决它

时间:2013-09-03 16:38:27

标签: c++ multithreading opencv optimization openmp

我有这段代码:

#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对象。

1 个答案:

答案 0 :(得分:0)

在评论中建议,Mat :: at可能会进行某种锁定。我检查了OpenCV源代码,但事实并非如此。 Mat :: at的一个版本转载如下:

template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
{
    CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] &&
        (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels(⇉
        CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
    return ((_Tp*)(data + step.p[0]*i0))[i1];
}

在我看来,正如评论中所建议的那样,CPU使用率低的原因很可能是你的代码没有太多关于CPU的事情。由于代码只是简单的内存分配,因此您的代码可能是内存,而不是CPU限制。我的建议是你不要复制数据(OpenCV Mat格式非常灵活,只需创建一个新的标题即可指向两个矩阵的相同数据)。如果InputPixel和OutputPixel值不相关或具有compex相关性,您可能需要重新考虑随机访问内存(即大量缓存未命中)需要一些时间。