1

我的 MPI 应用程序有一些生成一些大数据的过程。假设我们有 N+1 个进程(一个用于主控,其他是工作进程),每个工作进程都会生成大数据,现在只是写入普通文件,命名为 file1,file2,...,fileN。每个文件的大小可能完全不同。现在我需要将所有文件 M 发送到排名 M 进程以完成下一项工作,所以这就像所有数据传输一样。

我的问题是我应该如何使用 MPI API 有效地发送这些文件?我以前使用Windows共享文件夹来传输这些,但我认为这不是一个好主意。

我考虑过 MPI_file 和 MPI_All_to_all,但这些函数似乎不太适合我的情况。简单的 MPI_Send 和 MPI_Recv 似乎很难使用,因为每个进程都需要传输大数据,我暂时不想使用分布式文件系统。

4

1 回答 1

3

如果没有更多数据,即只有您现在拥有的数据,就不可能准确地回答您的问题。所以这里有一些一般性,你必须考虑它们,看看是否以及如何在你的情况下应用它们。

  • 如果您的流程正在生成大型数据集,则它们不太可能立即生成。与其考虑等到创建整个数据集,不如考虑逐块传输它。
  • 我不认为 MPI_Send 和 _Recv(或它们的变体)很难用于大量数据。但是您需要考虑在进程之间的每次通信中找到合适的传输量。使用 MPI,它不是一个简单的情况,即存在消息启动时间加上适用于所有发送消息的消息传输率。例如,一些 IBM 实现在他们的一些硬件上对大小消息具有不同的延迟和带宽。但是,您必须自己弄清楚带宽和延迟之间的权衡对于您的平台而言是什么。我在这里给出的唯一一般建议是参数化消息大小并进行实验,直到最大化计算与通信的比率。
  • 顺便说一句,您应该已经完成​​的一项测试是测量平台上各种大小和通信模式的消息传输率。当您开始在新系统上工作时,这是一种基本的测试。如果您没有更合适的东西,STREAMS 基准测试将帮助您入门。
  • 我认为,在通常使用 MPI 的程序类型中,大量数据的全面传输是一种不寻常的情况。您可能需要认真考虑重新设计应用程序以避免此类转移。当然,只有您知道这是否可行或值得。从您提供的少量信息来看,您似乎正在实施某种管道;在这种情况下,通常的通信模式是从进程 0 到进程 1、进程 1 到进程 2、2 到 3,等等。
  • 最后,如果您碰巧在使用共享内存的计算机(例如多核 PC)上工作,您可能会考虑使用共享内存方法(例如 OpenMP)来避免传递大量数据。
于 2010-06-13T09:33:26.840 回答