【问题标题】:openMP histogram comparisonopenMP 直方图比较
【发布时间】: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


【解决方案1】:

OpenMp 需要一些时间来设置并行区域。此开销意味着您需要注意开销不大于通过设置并行区域获得的性能。在您的情况下,这意味着只有当 N 达到某个数字时,openMP 才会加快计算速度。

您应该考虑减少 openMP 调用总数的方法,例如是否可以在此函数之外设置一个并行区域,以便您并行比较不同的直方图?

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 2015-05-01
    • 2015-07-27
    • 2017-01-24
    • 2013-01-14
    • 1970-01-01
    • 2021-10-29
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多