大家好,我有一个长度为 N 的数组,我想在“大小”处理器之间尽可能地划分它。N/size 有余数,例如 1000 个数组元素除以 7 个进程,或 14 个进程除以 3 个进程。
我知道 MPI 中至少有两种工作共享方式,例如:
for (i=rank; i<N;i+=size){ a[i] = DO_SOME_WORK }
但是,这不会将数组分成连续的块,我想这样做,因为我认为出于 IO 原因更快。
我知道的另一个是:
int count = N / size;
int start = rank * count;
int stop = start + count;
// now perform the loop
int nloops = 0;
for (int i=start; i<stop; ++i)
{
a[i] = DO_SOME_WORK;
}
但是,使用这种方法,对于我的第一个示例,我们得到 1000/7 = 142 = count。所以最后一个等级从 852 开始,到 994 结束。最后 6 行被忽略。
将这样的内容附加到以前的代码中是最好的解决方案吗?
int remainder = N%size;
int start = N-remainder;
if (rank == 0){
for (i=start;i<N;i++){
a[i] = DO_SOME_WORK;
}
这看起来很混乱,如果它是最好的解决方案,我很惊讶我在其他地方没有看到它。
谢谢你的帮助!