【问题标题】:MPI combine vector from all processorsMPI 组合来自所有处理器的向量
【发布时间】:2017-08-28 08:54:42
【问题描述】:

我正在编写一个 MPI fortran 程序,并且在三个等级中有三个不同长度的向量。我想以“连接”的方式将它们组合在一起,例如:

Rank 0: a0 = [1 2 3 4 5]
Rank 1: a1 = [3 5 7 9]
Rank 2: a2 = [2 4 6 8 10 12]

将它们组合成:

Rank 0: a = [1 2 3 4 5 3 5 7 9 2 4 6 8 10 12]

你能告诉我怎么做吗?

【问题讨论】:

  • 感谢@alfC 的回答。我还找到了 mpi_gatherv 并阅读了发送链接中给出的示例;但我仍然不确定在我的情况下如何正确地做到这一点。看来我应该事先发送向量的长度,以便以后可以使用 mpi_gatherv。对吗?
  • 你真的试过了吗?你在挣扎什么?我们不会为您编写整个代码。此外,链接页面包含详细示例。
  • @ctnguyen,是的,没有魔法,如果只有每个单独的进程知道大小,那么在调用 gatherv 之前必须传递该信息(例如在大小上使用 gather) .您可以从一个集中点了解这些信息。我鼓励您在问题中添加一些代码,以提高获得帮助的机会。
  • @alfC 谢谢你的回答。我现在完全清楚了,这个例子我很成功。我感谢您的支持。 PS:这是我使用 MPI 的第一天,所以我的问题似乎很愚蠢,对此感到抱歉,再次感谢您的帮助。

标签: vector fortran concatenation mpi


【解决方案1】:

由于向量根据等级有不同的大小,您可以使用MPI_Gatherv()以达到预期的结果

【讨论】:

  • 感谢@Gilles 的回答。我还找到了 mpi_gatherv 并阅读了发送链接中给出的示例;但我仍然不确定在我的情况下如何正确地做到这一点。看来我应该事先发送向量的长度,以便以后可以使用 mpi_gatherv。对吗?
  • 如果根任务(在您的示例中排名 0)不知道所有向量长度,那么是的,您需要先收集此信息(MPI_Gather() 非常适合)。然后你可以MPI_Gatherv()数据。
  • 感谢您的澄清。我按照你的建议做了。顺便说一句,这个链接为我的问题提供了一个很好的例子。 stackoverflow.com/questions/31890523/…
猜你喜欢
  • 2013-07-06
  • 2021-08-23
  • 2023-03-03
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2015-10-15
相关资源
最近更新 更多