我正在编写比较图像直方图的代码,购买计算相关性、交集、卡方和其他一些方法。这些功能的总体外观非常相似。
通常我使用 pthreads,但这次我决定用 openMP 构建小型原型(prototype)(因为它很简单),看看我会得到什么样的结果。
这是通过关联进行比较的示例,除了单行 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 的性能似乎优于串行。但是,如果我只比较单个直方图并以 useconds 为单位测量时间,那么串行速度大约快 20 倍。
我猜 openmp 会在看到 for 循环外部时进行一些优化。但在实际解决方案中,我会在直方图比较之间使用一些代码,但我不确定它的行为是否相同。
最佳答案
OpenMp 需要一些时间来设置并行区域。此开销意味着您需要注意开销不会大于通过设置并行区域获得的性能。在您的情况下,这意味着只有当 N 达到某个数字时,openMP 才会加快计算速度。
您应该考虑减少 openMP 调用总数的方法,例如是否可以在该函数之外设置一个并行区域,以便并行比较不同的直方图?
关于c++ - openMP直方图比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6889913/