代码之家  ›  专栏  ›  技术社区  ›  Brett

OpenMP num\u threads(1)执行速度比no OpenMP快

  •  10
  • Brett  · 技术社区  · 14 年前

    没有OpenMP“#pragma”语句,总运行时间=507秒

    使用OpenMP“#pragma”语句指定2核,总运行时间=150秒

    使用OpenMP“#pragma”语句指定3核,总运行时间=157秒

    使用OpenMP“#pragma”语句指定4核,总运行时间=144秒

    我想我不明白为什么注释我的openmp行会让程序在一个没有openmp的线程和一个有openmp的线程之间慢很多。

    //#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1) schedule(guided)
    
    and...
    
    #pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1,2,3,4) schedule(guided)
    

    不管怎样,如果有人知道为什么会这样,请告诉我!

    谢谢你的帮助,

    布雷特

    编辑:我将在这里发表一些评论

    经过进一步调查,我的结果与代码中是否包含“schedule(guided)”行不一致。

    -当我使用schedule(guided)行时,我会生成最快的解决方案,而不考虑线程的数量。 -随着时间的推移(引导),增加线程并不能获得改进 -如果没有时间表(引导),我将通过添加线程获得改进

    对于我的~900迭代循环,当我使用schedule(guided)时,我只处理~200个迭代,而没有schedule(guided)时,我处理所有900个迭代。有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  8
  •   Carl Staelin    13 年前

    OpenMP有大量的同步开销。我发现除非你有 大循环需要做大量的工作,并且没有内部循环同步,那么使用OpenMP通常是不值得的。

    我认为,当您将线程数设置为一(1)时,OpenMP只需对实现循环的OpenMP过程进行过程调用,因此开销最小,性能基本上与非OpenMP情况相同。

    否则,我认为OpenMP会设置一些信号量,等待“工作者”线程醒来,同步它们对数据结构的访问,告诉它们要设置什么循环参数,然后调用执行该工作的例程,当它们完成工作块时,它们会再次向主线程发送信号。这种同步必须针对线程所做的每一个工作块进行,而且同步开销是不小的。

    使用静态调度选项有助于减少调度/同步开销,特别是在循环迭代次数相对于核心数较大的情况下。