C、OpenMP : How can I make this parallisation of a triple loop better?

标签 c parallel-processing openmp nested-loops

我正在尝试并行化 Floyd-Warshall使用 OpenMP 的算法(基本上就地编辑 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 函数并行,对吗?

谢谢。

编辑

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

最佳答案

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

关于C、OpenMP : How can I make this parallisation of a triple loop better?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792920/

相关文章:

c - 编译后需要头文件吗?

c - (CUDA C) 为什么它不打印从设备内存复制的值?

c - MPI 三角拓扑

c - 每个打印语句会执行多少次?

在c中将十六进制数转换为八进制

c - 如何编写 sigtstp 处理程序以在 ctrl+z 之后返回到我自己实现的 shell 中的主循环?

multithreading - 有自动并行的序言实现吗?

c# - 为什么 Parallel.ForEach 比顺序循环慢两倍

gcc openmp 任务不起作用

c - OpenMP 实现还原