我现在正在使用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);
答案 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可以并行化节点内的操作。