繁体   English   中英

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

[英]best method for loop parallelisation in c using MPI or openMP

我现在正在学习使用MPI或开放式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);

最好的方法是在没有大量测试和考虑您感兴趣的特定用例的情况下很难知道。

一种方式是这样的:

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可以并行化节点内的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM