使用MPI或openMP在c中进行循环并行化的最佳方法

时间:2014-02-01 15:43:34

标签: c mpi openmp

我现在正在使用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);

1 个答案:

答案 0 :(得分:2)

最佳方式是一项难以理解的事情,无需经过大量测试和考虑您感兴趣的特定用例。

方法是:

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循环中并行化。 reduction语句告诉OpenMP在完成后将所有线程的私有sum变量添加到一起。

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

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