【问题标题】:MPI, python, Scatterv, and overlapping dataMPI、python、Scatterv 和重叠数据
【发布时间】:2016-08-03 14:55:57
【问题描述】:

MPI 标准 3.0 提到了 mpi_scatterv:

计数、类型和位移的规范不应导致根上的任何位置被多次读取。"

但是,我用下面的代码在python中对mpi4py的测试并不表明从root多次读取数据存在问题:

import numpy as np
from sharethewealth import sharethewealth

comm = MPI.COMM_WORLD
nprocs = comm.Get_size()
rank = comm.Get_rank()

counts = [16, 17, 16, 16, 16, 16, 15]
displs = [0, 14, 29, 43, 57, 71, 85]

if rank == 0:
    bigx = np.arange(100, dtype=np.float64)
else:
    bigx = None

my_size = counts[rank]
x = np.zeros(my_size)

comm.Scatterv([bigx, counts, displs, MPI.DOUBLE], x, root = 0)

print x

命令

> mpirun -np 7 python mycode.py

生产

[ 57.  58.  59.  60.  61.  62.  63.  64.  65.  66.  67.  68.  69.  70.  71. 72.]

[ 85.  86.  87.  88.  89.  90.  91.  92.  93.  94.  95.  96.  97.  98.  99.]

[  0.   1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  11.  12.  13.  14. 15.]

[ 29.  30.  31.  32.  33.  34.  35.  36.  37.  38.  39.  40.  41.  42.  43. 44.]

[ 43.  44.  45.  46.  47.  48.  49.  50.  51.  52.  53.  54.  55.  56.  57. 58.]

[ 71.  72.  73.  74.  75.  76.  77.  78.  79.  80.  81.  82.  83.  84.  85. 86.]

[ 14.  15.  16.  17.  18.  19.  20.  21.  22.  23.  24.  25.  26.  27.  28. 29.  30.]

输出显然是正确的,并且来自根(进程 0)的数据显然在每个边界点被多次引用。我不了解 MPI 标准吗?或者这是一种不可信赖的偶然行为?

FWIW,我在 OSX 上运行 python 2.7。

【问题讨论】:

    标签: python mpi mpi4py


    【解决方案1】:

    你不能依赖这个。

    这个假设直接源于 MPI 标准。由于 mpi4py 大写函数只是 MPI 之上的一个薄层,所以这很重要。该标准还规定:

    基本原理。 虽然不需要,但最后的限制是为了 用MPI_GATHER实现对称,这里有相应的限制 (多写限制)是必要的。 (理由结束。)

    考虑到它在标准中,MPI 实现可以利用它:

    • 忽略违规
    • 违反时发出警告
    • 违反时失败
    • 将此假设用于任何可能在违反时导致未定义行为的优化

    最后一点是最可怕的,因为它可能会引入一些细微的错误。考虑到发送缓冲区的只读性质,很难想象这样的优化,但这并不意味着它存在/不存在。就像一个想法一样考虑strict aliasing optimizations。另请注意,MPI 实现非常复杂 - 它们的行为可能会在版本、配置、数据大小或其他环境变化之间看似不稳定。

    还有一个臭名昭著的例子memcpy:该标准禁止重叠的内存输入,并且在某些时候,glibc 实现利用它进行了微小的有争议的优化。不满足要求的代码开始失败,用户开始听到 strange sound on mp3 flash websites,随后是涉及 Linus Torvalds 和 Ulrich Drepper 的 heated debate

    这个故事的精神是:遵循标准规定的要求,即使它现在有效并且要求对你没有意义。也很高兴有这么详细的标准。

    【讨论】:

      【解决方案2】:

      MPI 标准包含许多要求,这些要求通常不会被实施严格检查,主要是出于性能原因。基本原理是任何根据标准正确的程序在一组宽松的约束条件下也是正确的。依赖这种特定于实现的行为会导致代码不可移植并且违反标准。

      有许多正当理由要求不相交的发送段。立即可见的是与MPI_Gatherv 的对称性。对于后者,段必须是不相交的,否则聚集后的内存内容将取决于底层接收操作的顺序。由于在典型的 MPI 程序中,分散通常由聚集镜像,如果相同的约束适用于聚集和分散,则可以重用计算的偏移量和计数数组。一个不太明显的原因是,在某些架构上,网络设备可能不允许从重叠的内存区域同时读取。

      由于非标准 MPI 行为很容易在开发过程中潜入程序代码,因此可能需要使用我们的 MUST 之类的工具来检查程序的正确性。

      【讨论】:

      • 感谢您的洞察力。
      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 2018-03-02
      • 2016-12-30
      • 2012-05-21
      • 2018-11-22
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多