有关MPI-3共享内存操作的文档和示例通常包括以下语句,这些语句是从英特尔公司的最新报告复制的(我的着重强调):
// 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 barrierMPI SHM更新需要被动的RMA同步。性能断言MPI_MODE_NOCHECK暗示,时代可以立即从目标开始。注意到,在某些平台上,需要在MPI_Barrier之后再使用一个MPI_Win_sync,以确保读取器端的内存一致性。
哪些平台需要对MPI_Win_sync()的额外调用?这些平台的哪些特性导致了这种需求?我需要这个“标准”系统的额外呼叫吗?
发布于 2020-04-06 05:18:08
在这个报告发表之前,我和另一个帮助撰写MPI-3 RMA章节的人一起回顾了这个报告,所以我知道这个评论的背景。
这里的问题是平台的内存模型,它通常归结为CPU体系结构。x86内存模型非常强大,而全存储排序(TSO)确保在某些情况下不需要内存栅栏,否则需要在例如DEC上使用它们。我使用Alpha作为示例,因为它具有任何广泛使用的CPU中最薄弱的内存模型。
无论如何,在实践中,但在理论上(即MPI标准),对MPI_Barrier的调用将同步内存,但是调用MPI_Win_sync至少可以在x86上确保这一点。屏障之后的第二个实例是需要在一个平台上进行的,在这个平台上,需要一个负载栅栏来读取所写的数据,并存储由另一个线程设置的栅栏。
如果有帮助的话,我可以画一幅画。
https://stackoverflow.com/questions/49086174
复制相似问题