我正在研究比较图像直方图,购买计算相关性,交集,ChiSquare和其他一些方法的代码。这些功能的一般外观彼此非常相似。
通常我使用pthreads,但这次我决定使用openMP构建小型原型(由于它简单),看看我会得到什么样的结果。
这是通过相关性进行比较的示例,除了单行openMP循环之外,代码与串行实现相同。
double comp(CHistogram* h1, CHistogram* h2){
double Sa = 0;
double Sb = 0;
double Saa = 0;
double Sbb = 0;
double Sab = 0;
double a, b;
int N = h1->length;
#pragma omp parallel for reduction(+:Sa,Sb,Saa,Sbb,Sab) private(a ,b)
for (int i = 0; i<N;i++){
a =h1->data[i];
b =h2->data[i];
Sa+=a;
Sb+=b;
Saa+=a*a;
Sbb+=b*b;
Sab+=a*b;
}
double sUp = Sab - Sa*Sb / N;
double sDown = (Saa-Sa*Sa / N)*(Sbb-Sb*Sb / N);
return sUp / sqrt(sDown);
}
有更多方法可以使用openMP加速此功能吗?
谢谢!
PS:我知道最简单的方法就是比较不同线程的不同直方图对,但这不适用于我的情况,因为一次只有2个直方图可用。
在四核机器上测试
我有一点不确定性,在较长时间运行openmp似乎比串行表现更好。但是如果我只是将它与单个直方图进行比较并在使用时间内测量时间,那么串行速度大约是20倍。
我想openmp在看到外部循环后会进行一些优化。但在一个真正的解决方案中,我将在直方图比较之间有一些代码,我不确定它是否会以相同的方式运行。
答案 0 :(得分:2)
OpenMp需要一些时间来设置并行区域。这种开销意味着您需要注意开销不大于通过设置并行区域获得的性能。在你的情况下,这意味着只有当N达到一定数量时才会打开MP加速计算。
您应该考虑减少openMP调用总数的方法,例如,是否可以在此函数外部设置并行区域,以便并行比较不同的直方图?