【发布时间】:2013-06-15 02:30:34
【问题描述】:
(问题是并行的尴尬)
考虑一个包含 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 实现这样的动态评估算法?
谢谢!!!!!!
更新
我用了一个很简单的方法,如何把整个job分成块,用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)并且在它完成它之后作业并将其部分写入文件,将继续下一个单元格而不是放松。
谢谢!
【问题讨论】:
-
在 Windows API 中,有一个函数
TryEnterCriticalSection()可用于创建您描述的行为。我没有使用 MPI 的经验,但它可能有类似的功能。 -
@quinxorin,我使用 GNU 并在 linux HPC 集群上工作,所以我无法使用它。不过谢谢你的建议!