【问题标题】:best method for loop parallelisation in c using MPI or openMP使用 MPI 或 openMP 在 c 中进行循环并行化的最佳方法
【发布时间】:2014-02-01 15:43:33
【问题描述】:

这几天我正在学习使用 MPI 或 Open MP 进行并行编程。我想知道并行化这种循环的最佳方法是什么?为什么?

sum = 0;
for (y = 1; y <= Ny; y++) {
    for (x = 1; x <= Nx; x++) {
        d = v1[y][x] - v2[y][x];
        sum += d * d;
    }
}

return sqrt(sum);

【问题讨论】:

    标签: c mpi openmp


    【解决方案1】:

    如果没有对您感兴趣的特定用例进行大量测试和考虑,很难知道最佳方法

    方法是这样的:

    sum=0;
    #pragma omp parallel for collapse(2) reduction(+:sum) private(d)
    for (y = 1; y <= Ny; y++) {
      for (x = 1; x <= Nx; x++) {
        d = v1[y][x] - v2[y][x];
        sum += d * d;
      }
    }
    

    collapse 语句告诉 OpenMP 的并行 for 构造在两个 for 循环中并行化。 reduction 语句告诉 OpenMP 在完成后将所有线程的私有 sum 变量添加到一起。

    使用 MPI 比这复杂得多,但在某些情况下它会是最佳选择。如果您正在寻找一种简单的方法来并行化相对简单的操作,那么这种方法可能是您的最佳选择。

    如果您正在寻找 OpenMP 和 MPI 之间的比较,请不要。它们有点像苹果和橘子。事实上,您甚至可以同时使用它们。 MPI 可以将一个操作并行化到多个计算节点,而 OpenMP 可以将一个操作并行化到一个节点内。

    【讨论】:

    • 你能给我一些关于如何使用 MPI 并行化它的提示吗?
    • 是的。 @DmitriChubarov。
    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 2021-09-20
    • 1970-01-01
    • 2013-12-08
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多