【发布时间】:2016-01-17 22:50:50
【问题描述】:
我正在尝试通过反转和在 C 上使用 MPI 编码来对大型数组进行排序。
基本上,我的程序将数组拆分为工作人员的部分,每个工作人员找到自己的增加和减少条带并将条带发送回根。 Root 通过查找和使用这些条带的最大和最小元素来进行一些反转。程序在没有剩余断点时结束,表示数组已排序。
这是一个很长的代码,所以我简化了我的问题:
int *ARRAY;
int main(int argc, char *argv[])
{
int p_id, n_procs, flag = 1;
MPI_Init(&argc, &argv);
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD, &p_id);
MPI_Comm_size(MPI_COMM_WORLD, &n_procs);
if(p_id == 0) {
ARRAY = createRandomArray(N_DATA);
// PRINT UNSORTED ARRAY
while(hasBreakPoints(ARRAY, N_DATA)) {
for(i=1;i<n_procs; i++)
// SEND PORTIONS TO WORKERS
for(i=1;i<n_procs; i++)
// RECEIVE EACH STRIP FROM WORKERS
// FIND MAX AND MIN OF STRIPS
// MAKE REVERSALS ON "ARRAY"
}
flag = 0;
// PRINT SORTED ARRAY
}
else {
while(flag == 1) {
// RECEIVE PORTION FROM ROOT
// FIND MY OWN STRIPS
// SEND MY OWN STRIPS TO ROOT
}
}
MPI_Finalize();
return 0;
}
如您所见,我需要使用while 循环来运行程序,直到没有剩余断点。我知道MPI_Send 命令的数量必须等于MPI_Receive 命令的数量。所以,我只是创建了一个标志来运行 ROOT 和 WORKERS 相等的时间。
通过使用这种惰性方法,程序可以正常运行但永无止境,也不会进入MPI_Finalize。这种或更有效的使用方式是否有任何修复?感谢您的帮助。
【问题讨论】:
-
我发现worker比root多运行一次。因此,它在
MPI_Recv声明处无限等待。我该如何解决? -
您的
flag变量未在 MPI 进程之间共享...您如何期望进程 #0 更改其flag变量的值这一事实被传输到其他进程?跨度> -
@Gilles 哦,你是对的。我错过了这一点。对不起,我是并行编程的新手。我怎么解决这个问题?谢谢。
标签: c++ c parallel-processing mpi