有关MPI-3共享内存操作的文档和示例通常包含以下语句,从recent presentation from Intel复制(我的强调):
// Start passive RMA epoch
MPI_Win_lock_all (MPI_MODE_NOCHECK, win);
// write into mem array hello_world info
mem[0] = rank;
mem[1] = numtasks;
memcpy(mem+2, name, namelen);
MPI_Win_sync (win); // memory fence - sync node exchanges
MPI_Barrier (shmcomm); //time barrier
MPI SHM更新需要被动RMA同步。性能断言MPI_MODE_NOCHECK暗示该纪元可以立即在目标处开始。 请注意,在某些平台上,MPI_Barrier之后需要再增加一个MPI_Win_sync,以确保读者端的内存一致性。
哪些平台需要额外拨打MPI_Win_sync()
?这些平台的哪些特性导致了这一要求?我是否需要在#34;标准"系统
答案 0 :(得分:0)
我在发表此演示文稿之前已经与其他帮助撰写MPI-3 RMA章节的人员一起进行了审查,因此我知道该评论的背景。
这里的问题是平台的内存模型,通常可以归结为CPU架构。 x86内存模型非常强大,总存储顺序(TSO)可确保在某些情况下不需要内存围栏,而在某些情况下,例如, DEC Alpha。我以Alpha为例,因为它具有任何广泛使用的CPU中最弱的内存模型。
无论如何,在实践中但从理论上讲(即MPI标准)却没有,对MPI_Barrier的调用将使内存同步,但是调用MPI_Win_sync至少可以确保在x86上实现此目的。在需要加载防护栏以读取写入的数据并存储由另一个线程隔离的数据的平台上,必须在隔离栏之后执行第二个实例。
如果有帮助,我可以画画。