我有这段代码:
#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对象。
答案 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相关性,您可能需要重新考虑随机访问内存(即大量缓存未命中)需要一些时间。