MPI:MPI\u无法工作
下面的代码在进程0(主进程)中创建了一个窗口,其他进程在其中放入了一些值,我每次都试图从其他进程获取主进程的窗口来打印它,但我得到的结果完全令人困惑。代码如下:MPI:MPI\u无法工作,mpi,mpi-rma,Mpi,Mpi Rma,下面的代码在进程0(主进程)中创建了一个窗口,其他进程在其中放入了一些值,我每次都试图从其他进程获取主进程的窗口来打印它,但我得到的结果完全令人困惑。代码如下: int main ( int argc, char *argv[] ) { int id; MPI_Init ( &argc, &argv ); MPI_Comm_rank ( MPI_COMM_WORLD, &id ); MPI_Win win; if (id ==
int main ( int argc, char *argv[] )
{
int id;
MPI_Init ( &argc, &argv );
MPI_Comm_rank ( MPI_COMM_WORLD, &id );
MPI_Win win;
if (id == 0)
{
int *arr;
int in = 0;
MPI_Alloc_mem(10 * sizeof(int), MPI_INFO_NULL, &arr);
for(in = 1; in < 10; in++)
{
arr[in] = -1;
}
arr[0] = 0;
MPI_Win_create(arr, 10 * sizeof(int), sizeof(int), MPI_INFO_NULL,MPI_COMM_WORLD, &win);
int ready = 0;
while (!ready)
{
MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win);
ready = fini(arr);
MPI_Win_unlock(0, win);
}
printf("All workers checked in using RMA\n");
MPI_Win_free(&win);
MPI_Free_mem(arr);
printf("Master done\n");
}
else
{
int one = id;
int *local;
int i = 0;
MPI_Alloc_mem(sizeof(int)*10, MPI_INFO_NULL, &local);
MPI_Win_create(NULL, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
for(i = 0; i < 10; i++)
{
MPI_Get(&local[i], 1, MPI_INT, 0, i,1, MPI_INT, win);
}
printf("Worker before %d: ", id);
pt(local); //Printing array "local"
MPI_Put(&one, 1, MPI_INT, 0, id, 1, MPI_INT, win);
for(i = 0; i < 10; i++)
{
MPI_Get(&local[i], 1, MPI_INT, 0, i,1, MPI_INT, win);
}
printf("Worker %d done: ", id);
pt(local);
MPI_Win_unlock(0, win);
MPI_Win_free(&win);
}
MPI_Finalize ( );
return 0;
}
int fini ( int table[] )
{
int i = 0;
while(i < 10)
{
if(table[i] == -1) return 0;
i++;
}
return 1;
}
void pt(int t[])
{
int i = 0;
while(i < 10)
{
printf("%d ",t[i]);
i++;
}
printf("\n");
}
你能帮我找出我的代码出了什么问题吗?谢谢
编辑:显然问题在于MPI\u Get没有填充“本地”缓冲区…问题在于
MPI\u Get
是非阻塞的,并且不能保证在调用pt()
时开始读取发起者的值之前传输会完成。当人们刚开始使用MPI RMA语义时,它们可能会非常混乱。让这里的一些军事革命大师,比如@Jeff,向你解释应该如何正确地完成它。@HristoIliev嗨,谢谢你的回答,我希望这位大师能帮我弄清楚!)我快要发疯了…添加MPI\u Win\u flush(0,Win)在第一次调用pt()
之前,将第二次调用移动到pt()
在MPI\u Win\u unlock()
调用之后,您将获得所需的行为。我不确定是否允许MPI\u Put()
后跟重叠的MPI\u Get()
,而无需在单个访问周期内进行中间同步(尽管它与我桌面上的Open MPI一起工作),因此不会写答案。另外,使用MPI_-Get(local,10,MPI_-INT,0,0,10,MPI_-INT,win)代码>而不是10次单独调用MPI\u Get()
@hristoliev嘿!我试过这个,确实对我有用!!所以每次我执行MPI_Get时都要这样做?非常感谢。我对MPI RMA的理解很差。如前所述,还有其他人可以提供更有教育意义的答案。
Worker before 4: 1152288776 32731 1152288776 32731 4 0 0 0 48 0
Worker 4 done: 1152288776 32731 1152288776 32731 4 0 0 0 48 0
Worker before 1: 1525372936 32743 1525372936 32743 4 0 0 0 48 0
Worker 1 done: 1525372936 32743 1525372936 32743 4 0 0 0 48 0
Worker before 3: 1422645256 32661 1422645256 32661 4 0 0 0 48 0
Worker 3 done: 1422645256 32661 1422645256 32661 4 0 0 0 48 0
Worker before 6: 1553508328 32675 34348016 0 0 0 33 0 1553508280 32675
Worker 6 done: 1553508328 32675 34348016 0 0 0 33 0 1553508280 32675
Worker before 5: -1745405976 32676 33995760 0 0 0 33 0 -1745406024 32676
Worker 5 done: -1745405976 32676 33995760 0 0 0 33 0 -1745406024 32676
Worker before 9: -990742552 32568 20737008 0 0 0 33 0 -990742600 32568
Worker 9 done: -990742552 32568 20737008 0 0 0 33 0 -990742600 32568
Worker before 2: 1455122440 32635 1455122440 32635 4 0 0 0 48 0
Worker 2 done: 1455122440 32635 1455122440 32635 4 0 0 0 48 0
Worker before 7: -1086933016 32650 18463728 0 0 0 33 0 -1086933064 32650
Worker 7 done: -1086933016 32650 18463728 0 0 0 33 0 -1086933064 32650
Worker before 8: 1328670696 32548 24464368 0 0 0 33 0 1328670648 32548
Worker 8 done: 1328670696 32548 24464368 0 0 0 33 0 1328670648 32548