【问题标题】:C, OpenMP: How can I make this parallisation of a triple loop better?C,OpenMP:我怎样才能使三重循环的这种并行化更好?
【发布时间】:2011-07-22 16:16:52
【问题描述】:

我正在尝试使用 OpenMP 并行化 Floyd-Warshall 算法(基本上就地编辑 2D 数组),但我怀疑我是否以最好的方式处理它,这就是我所拥有的远:

    #pragma omp parallel for private(i, j, k) shared(g)
    for ( i = 0; i < n; i++ ) {
        for ( j = 0; j < n; j++ ) {
            for ( k = 0; k < n; k++ ) {
                g->A[j][k] = imin( g->A[j][k], g->A[j][i] + g->A[i][k] );
            }
        }
    }

有什么想法可以让我更好地利用 OpenMP?目前这只是运行时间的一半,这肯定可以改进。

另外,如果有人对用于并行化的其他技术有任何建议,我会全力以赴。我考虑过 MPI,但我必须让我的整个 main 函数并行,对吗?

谢谢。

编辑

上面的代码不起作用,下面的答案说明了原因。

【问题讨论】:

    标签: c parallel-processing openmp nested-loops


    【解决方案1】:

    并行化算法并不简单。请参阅此处的注释 http://www.mcs.anl.gov/~itf/dbpp/text/node35.html 有关并行运行它的信息。如果您有少量处理器(双核、四核、八核机器),那么 Parallel Floyd 1 可能适合您。如果您有大量处理器(非常棒的 GPU、网状计算机),那么 Parallel Floyd 2 可能会更好。

    【讨论】:

    • 感谢您提供的信息,Charles,您能帮我更好地解析一下吗?据我了解,您将行拆分为 R/N 块,其中 R 是一个或多个行,N 是线程/处理器的数量,然后将“边缘”行广播到其他进程。我是否正确理解这一点,这甚至可以通过 OpenMP 实现吗?谢谢。
    • 应该是可以的,是的。请参阅stackoverflow.com/q/6030658/341362 了解似乎使用您需要的技术的 OpenMP 代码(解决不同的问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2023-03-18
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多