使用 C 和 MPI 的分块分解数组
Blockwise decomposition array using C and MPI
大家好,我需要了解如何分解数组以将子块分配给固定数量的处理器。元素数%进程中的余数 == 0 的情况很简单,我想知道一种执行方法,以防余数不同于 0。也许如果可以有一个代码示例(在C 使用 MPI) 来更好地理解这些等待。此外,我想问你:
- 分块分解
- 循环分解
- 分块循环分解
效率更高(假设发送和接收数据有一定的成本),如果还有更快的东西可以达到这个目的。谢谢大家
最简单的解决方案是给每个进程 N/P
分,向下舍入,最后一个进程超出部分。这也是一个糟糕的解决方案:这意味着在负载不平衡的情况下,所有进程都将等待最后一个进程。
下一个最佳:每个进程获得 (N+P-1)/P
分,将分数四舍五入。现在最后一个过程得到的点数较少。这好多了:现在一个进程将有一些空闲时间。
我知道的最佳解决方案是为每个进程分配如下定义的范围:
for (int p=0; p<=nprocs; p++)
beginend[p] = p*npoints/nprocs;
编码并尝试;你会看到最大和最小数量的 points-per-process 之间最多只有一个点差,而且多余的点也很好地分散开来。示例输出:
1/5: 0 0 0 0 1
2/5: 0 0 1 0 1
3/5: 0 1 0 1 1
4/5: 0 1 1 1 1
5/5: 1 1 1 1 1
6/5: 1 1 1 1 2
7/5: 1 1 2 1 2
8/5: 1 2 1 2 2
9/5: 1 2 2 2 2
10/5: 2 2 2 2 2
这就是分块解决方案。循环执行它也是可能的,但从缓存使用的角度来看,这通常不是很好。例如,此分布用于 LU 分解,第一个 so-many rows/columns 逐渐变得不活跃。
块循环比较复杂,但是很好的结合了块和循环的优点。
大家好,我需要了解如何分解数组以将子块分配给固定数量的处理器。元素数%进程中的余数 == 0 的情况很简单,我想知道一种执行方法,以防余数不同于 0。也许如果可以有一个代码示例(在C 使用 MPI) 来更好地理解这些等待。此外,我想问你:
- 分块分解
- 循环分解
- 分块循环分解
效率更高(假设发送和接收数据有一定的成本),如果还有更快的东西可以达到这个目的。谢谢大家
最简单的解决方案是给每个进程 N/P
分,向下舍入,最后一个进程超出部分。这也是一个糟糕的解决方案:这意味着在负载不平衡的情况下,所有进程都将等待最后一个进程。
下一个最佳:每个进程获得 (N+P-1)/P
分,将分数四舍五入。现在最后一个过程得到的点数较少。这好多了:现在一个进程将有一些空闲时间。
我知道的最佳解决方案是为每个进程分配如下定义的范围:
for (int p=0; p<=nprocs; p++)
beginend[p] = p*npoints/nprocs;
编码并尝试;你会看到最大和最小数量的 points-per-process 之间最多只有一个点差,而且多余的点也很好地分散开来。示例输出:
1/5: 0 0 0 0 1
2/5: 0 0 1 0 1
3/5: 0 1 0 1 1
4/5: 0 1 1 1 1
5/5: 1 1 1 1 1
6/5: 1 1 1 1 2
7/5: 1 1 2 1 2
8/5: 1 2 1 2 2
9/5: 1 2 2 2 2
10/5: 2 2 2 2 2
这就是分块解决方案。循环执行它也是可能的,但从缓存使用的角度来看,这通常不是很好。例如,此分布用于 LU 分解,第一个 so-many rows/columns 逐渐变得不活跃。
块循环比较复杂,但是很好的结合了块和循环的优点。