0

我有这个代码:

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

4

1 回答 1

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 值不相关或具有复杂相关性,您可能需要接受随机访问内存(即大量缓存未命中)将需要一些时间的事实。

于 2013-09-12T18:34:19.750 回答