【问题标题】:Ordered 'for' loop efficiency in OpenMPOpenMP 中的有序“for”循环效率
【发布时间】:2012-01-25 06:47:23
【问题描述】:

我正在尝试并行化单个 MCMC 链,该链本质上是顺序的,因此,我需要保留执行迭代的顺序。为此,我正在考虑通过 OpenMP 使用“ordered for”循环。我想知道在 OpenMP 中执行有序 for 循环是如何工作的,它真的在代码并行化方面提供了任何加速吗?

谢谢!

【问题讨论】:

    标签: openmp mcmc


    【解决方案1】:

    如果您的循环仅包含一个具有有序结构的块,则执行将是串行的,您不会从并行执行中获得任何加速。 在下面的示例中,一个块可以并行执行,一个块将被序列化:

    void example(int b, int e, float* data) 
    {
        #pragma omp for schedule(static) ordered
        for (int i = b; i < e; ++i) {
            // This block can be executed in parallel
            data[i] = SomeThing(data[i]);
            if (data[i] == 0.0f) 
            {
                // This block will be serialized 
                #pragma omp ordered
                printf("Element %d resulted in zero\n", i);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      只要你只有一个马尔可夫链,最简单的并行化方法是使用“令人尴尬”的并行性:运行一堆独立的链并在它们全部完成后收集结果 [或收集偶尔会有结果。]

      这样您就不会产生任何通信开销。

      这里的主要警告是,您需要确保不同的链获得不同的随机数生成器种子。

      UPD:收集结果的实用性。

      简而言之,您只需将所有链生成的结果混合在一起。为简单起见,假设您有三个独立的链:

      x1, x2, x3,...
      y1, y2, y3,...
      z1, z2, z3,...
      

      从这些中,你创建了一个链 x1,y1,z1,x2,y2,z2,x3,y3,z3,... 这是一个完全有效的 MC 链,它对正确的分布进行采样。

      写出所有的链历史几乎总是不切实际的。通常,每个链都会保存分箱统计信息,然后您将其混合在一起并由单独的程序进行分析。对于分箱分析,请参见,例如[boulder.research.yale.edu/Boulder-2010/ReadingMaterial-2010/Troyer/Article.pdf][1]

      【讨论】:

      • 我只是对如何从不同的链中收集结果有点困惑。你能帮我解决这个问题吗?如,如何将独立的小链的结果组合起来得到最终结果?
      • @user1105630 我已经更新了答案。我通常做的是,我有 shell 脚本来运行链,以及一个单独的程序,它读取所有链的分箱统计数据并生成最终结果。
      • 非常感谢您的帮助。如果我使用 x1,x2,x3,..,y1,y2,y3...,z1,z2,z3.. 而不是 x1,y1,z1,x2,y2.. 会怎样?还是应该在每一步都进行合并?
      • @user1105630 我认为它在原则上仍然有效。在实践中,尽管您需要确保您的 MC 过程在您开始分析它们时已达到平衡。我建议不要在每一步都合并,因为这样会浪费时间进行交流。
      • 你的沟通时间正是我所关心的。我现在已经切换到分布式内存,我正在尝试生成多个小线程,然后将结果组合起来。让我们希望结果很好。感谢您的帮助!
      【解决方案3】:

      openMP 有序指令只能在动态透视图中列出。
      规范表明,在编写 for 时,我们必须提及ordered 关键字。但是,您可以选择循环中的有序块。

      我的猜测是,即使我们在 for 中提到了排序关键字,每个线程也会并行开始工作。任何遇到有序关键字的线程只有在完成所有先前的迭代后才必须进入此块。请关注关键字所有之前的迭代必须完成。

      上述推理的直觉是,“ordered for” if 串行执行根本没有任何意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-26
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 2012-07-31
        • 1970-01-01
        相关资源
        最近更新 更多