(问题是尴尬的并行)
考虑一个包含 12 个单元的数组:
|__|__|__|__|__|__|__|__|__|__|__|__|
和四 (4) 个 CPU。
天真地,我会运行 4 个并行作业并为每个 CPU 提供 3 个单元。
|__|__|__|__|__|__|__|__|__|__|__|__|
=========|========|========|========|
1 CPU 2 CPU 3 CPU 4 CPU
但是,似乎每个单元格都有不同的评估时间,有些单元格的评估速度非常快,有些则不然。
因此,我认为与其浪费“松弛的 CPU”,不如将每个单元及时馈送到每个 CPU 并继续,直到整个工作完成。
即:
一开始:
|____|____|____|____|____|____|____|____|____|____|____|____|
1cpu 2cpu 3cpu 4cpu
如果,2cpu 在单元格“2”完成了他的工作,它可以跳转到第一个空单元格“5”并继续工作:
|____|done|____|____|____|____|____|____|____|____|____|____|
1cpu 3cpu 4cpu 2cpu
|-------------->
如果 1cpu 完成,它可以占用第六个单元:
|done|done|____|____|____|____|____|____|____|____|____|____|
3cpu 4cpu 2cpu 1cpu
|------------------------>
依此类推,直到完成整个数组。
问题:
我不知道哪个单元是“快的”,哪个单元是“慢的”,所以我不能根据负载分配 cpu(更多的 cpu 慢,少的快)。如何使用 MPI 实现这种动态评估算法?
谢谢!!!!!
更新
我使用了一种非常简单的方法,如何使用 IO-MPI 将整个作业分成块:
给定:array[NNN] 和nprocs - 可用工作单元的数量:
for (int i=0;i<NNN/nprocs;++i)
{
do_what_I_need(start+i);
}
MPI_File_write(...);
其中“开始”对应于特定的等级编号。简而言之,我根据可用 CPU 的数量将整个 NNN 数组划分为固定大小的块,每个 CPU 执行其块,将结果写入(公共)输出并放松。
是否有可能以这样的方式更改代码(不完全重写主/从范式),使得每个 CPU 将只获得一次迭代(而不是 NNN/nprocs)并且在它完成其工作并写入之后它对文件的一部分,将继续下一个单元格而不是放松。
谢谢!