这是我的问题:
给定初始间隔[a,b]并行化&假设流程比其他流程更快,我想做一个流程,我会去帮助"另一个(j)当它完成它的块(工作)时,在这种情况下帮助意味着将它和它之间的过程j(它仍在工作的那个)的块大致相等。处理我(那个将要帮助的人)。我已经了解了这个算法,但我不知道如何使用MPI通信功能(如Broadcast,Allgather,send,recv)来实现它:我想使用数组&#34 ; ARR"由所有流程共享&大小等于所有进程的数量。 arr [i] = 1表示进程i已完成工作,否则它等于-1。当排名"排名"完成它的工作,它确实arr [rank] = 1&一直在等待工作过程注意到它&发送一个新的块。这是"伪代码"我希望实现的目标:
MPI_Init ( &argc, &argv );
MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
MPI_Comm_size ( MPI_COMM_WORLD, &nb_proc );
int i;
int a = 0, b = max; //initial interval [a,b] to parallelize
int j; arr[nb_proc];
for(j = 0; j < 10; j++)
{
arr[j] = -1; //initially, all processes are working
}
do
{
i = a + rank;
do
{
if(there's a free process) // checking the array "arr" & finding at least one element that equals 1
{
//Let that process be process of rank "r":
arr[r] = -1;
int mid = (b+i)/2; //dividing the rest of the work
a = mid + rank - r;
MPI_Send(a to process r);
MPI_Send(b to process r);
b = a-1;
}
/*does i-th iteration*/
i = i + p;
}
while(i <= b);
arr[rank] = 1; //finished working and about to start waiting for new work
}
while(there's at least one process that's still working & if it's the case get the new work (starting a & finishing b) from it);
MPI_Finalize ( );
return 0;
我的主要问题涉及访问阵列的方式以及如何确保它更新到所有进程以及所有进程在瞬间t都具有相同的数组。我非常感谢你的帮助。提前谢谢。