跳过主要导航

MPI共享内存窗口的要点

分配的共享内存在进程等级之间是连续的,即等级i的第一个字节在等级i-1的最后一个字节之后开始。
©HLRS

以下列表显示了MPI共享内存窗口的要点:

    • 分配的共享内存是跨进程等级连续的,
      即,等级I的第一个字节在等级I-1的最后一个字节之后就开始。
    • 流程只能通过本地信息来计算远程地址的偏移。
    • 远程访问通过加载/存储操作,
      即,没有MPI RMA操作(mpi_get/put,…)

    • 尽管COMM_SM中的每个过程都访问相同的物理内存,但是
      整个数组的虚拟开始地址在所有过程中可能有所不同! - >链接列表只有在共享数组中有偏移,但不带有二进制指针地址!

创建了连续的数组,这意味着等级I的第一个字节直接出现在等级I-1的最后一个字节之后。这意味着给定的过程通常可以计算所有地址,其相邻过程的元素直接通过本地地址计算,假设所有过程都具有相同数量的元素。因此,每个过程都可以访问来自所有其他过程的所有数据。结果,没有必要执行任何RMA呼叫mpi_get, 或者mpi_put:您只需使用编程语言中的非常正常的负载和存储操作即可。

但是,此MPI共享内存在一个点上与OpenMP共享内存截然不同:MPI共享内存和OpenMP共享内存都是物理共享内存,但是在OpenMP中,此共享内存的开始位于同一位置。如果您转到所有共享内存的开始地址,并从OpenMP中所有线程的角度来看,则可以进行启动。虚拟地址70.000。但是,使用MPI,我们没有操作系统线程,而是过程,每个过程都有自己从虚拟地址转换为物理地址的转换。这意味着,对于给定的MPI进程,共享内存的起点可能位于位置70.000,但是对于另一个MPI进程,这是在虚拟地址30.000处。

考虑到您想在此共享内存中创建链接列表并向其写入指针的情况,例如让进程0使用C中的Ampersand运算符创建一个指针地址,然后将开始地址设置为70.000。如果您指出第二个元素,这意味着要获得地址70.008,现在您在另一个过程中读取此地址,该过程中虚拟地址从30.000开始,则地址70.008将完全在内存范围之外数组,因此这可能会导致分割故障。

那么如何解决这个问题?在这种情况下,解决方案相对简单:您可以像40年前的Fortran程序员一样做。例如,如果您有一些结构,则可以简单地将链接列表定义为这些结构的数组,并使用此数组中的索引参考它们。结果,如果您现在想参考地址70.008的结构,则不使用地址值70.008,而是阵列位置3或数组位置1,具体取决于相应的过程。由于数组中的索引当然完全独立于其虚拟地址,因此一切正常。

  • 窗口尺寸==零 - >没有返回基本指针!

如果一个过程确实不是定义一个正窗口大小,然后此过程将无法获得基本指针,因此也无法访问其他过程的窗口部分。

©HLRS
本文来自免费的在线免费

单面通信和MPI共享内存界面

由...制作
FutureLearn-终身学习

我们的目的是改变接受教育的机会。

我们提供来自世界各地的大学和文化机构的各种课程。这些一次是一次交付的一步,并且可以在移动,平板电脑和台式机上访问,因此您可以适合自己的生活。

我们认为,学习应该是一种愉快的社交经验,因此我们的课程为您提供了与他人一起讨论的机会,帮助您做出新的发现并形成新的想法。
您可以通过订阅我们无限制的包裹来解锁新的机会,以无限制地访问数百种在线短课程。电竞博彩app有什么通过顶尖的大学和组织建立知识。dota2竞猜吧

了解有关FutureLearn如何转化接受教育的更多信息