2016-04-12 21 views
2

MPI标准,3.0表示约mpi_scatterv:MPI,蟒,Scatterv,和重叠的数据

计数,类型和位移的说明书不应根造成任何位置被读取多于一旦“

然而,在代码蟒蛇我mpi4py的测试下方并不表明存在与从根读取数据的问题不止一次。

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。

回答

2

你不能依赖这个。

这个假设直接来自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这样的工具来检查程序的正确性。

+0

感谢您的洞察力。 –