溢出问题和并行速度提高不明显
大家帮帮忙,帮我分析解释一下,先谢谢了。
//问题函数体
int Observe(int N,IplImage *s_hue, int W, int H, CvHistogram * s_model_hist)//IplImage为图像结构体
{
CvHistogram * n_hist = NULL; //CvHistogram 为OPENCV中直方图结构体
double n_bha = 0.0;
CvRect n_selection = {0,0,0,0}; //CvRect为矩形结构体
//#pragma omp parallel for
#pragma omp parallel for private(n_hist)
for(int i = 0; i < N;i++)
{
...
n_hist = cvCreateHist(1,&hdims,CV_HIST_ARRAY,&hranges,1); //创建直方图
cvSetImageROI(s_hue,n_selection); //选择图像s_hue中的n_selection区域
cvCalcHist(&s_hue,n_hist,0,0); //计算s_hue区域的直方图,赋给n_hist
cvResetImageROI(s_hue); //释放s_hue
n_bha = cvCompareHist( n_hist, s_model_hist, CV_COMP_BHATTACHARYYA); //计算n_bha
cvReleaseHist ( &n_hist ); //释放n_hist
}
return 0;
}
//大程序
计时开始
for(;;)
{
...
Observe();
...
}
计时结束
(串并行时间是在同等条件下测试的,双核,线程数为2)
问题:
1.选择使用#pragma omp parallel for 时,程序能够执行,但是n_bha的值会溢出,得不到正确结果,并行时间比
串行时间提高近60%。
2.选择使用#pragma omp parallel for private(n_hist)时,程序正常,能得出正确结果,但是并行时间与串行时间基
本相等。现在的困惑是,情况1为什么n_bha会溢出?情况2为什么并行效果不明显,如何提高并行执行速度?
小弟最终的想法是提高情况2的并行速度。大家帮忙分析一下,谢谢。