【发布时间】:2011-07-31 14:08:12
【问题描述】:
我正在编写比较图像直方图的代码,购买计算相关性、交集、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 一旦看到外部 for 循环就会进行一些优化。但在真正的解决方案中,我将在直方图比较之间添加一些代码,我不确定它是否会以相同的方式运行。
【问题讨论】:
-
与串行实现相比,您获得了什么加速? (您拥有/使用多少个内核?)
-
用指针代替data[i]怎么样?
-
@kenny,这在并行程序中是不可能的,尽管考虑到优化器的力量,这是一个奇怪的建议
标签: c++ optimization pthreads parallel-processing openmp