C,OpenMP:如何更好地实现三重循环的平行化?

时间:2011-07-22 16:16:52

标签: c parallel-processing openmp nested-loops

我正在尝试使用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函数并行吗?

感谢。

修改

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

1 个答案:

答案 0 :(得分:2)

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