2010-06-13 45 views
1

我的MPI应用程序有一些过程可以产生一些大的数据。假设我们有N + 1个进程(一个用于主控,另一个用于工作),每个工作进程都会生成大量数据,现在只需写入普通文件file1,file2,...,fileN。每个文件的大小可能会大不相同。现在我需要发送所有的fileM来排序M进程来完成下一个任务,所以就像所有的数据传输一样。MPI大数据全部传输

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

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

+0

您目前正在将N个文件写入每个进程本地的磁盘,还是他们都住在同一个地方?我认为你将数据写入磁盘,因为它不适合内存? – 2010-06-13 09:01:29

+0

我想在集群上运行这个应用程序,所以我需要在不同的机器上传输这些数据,并且数据大小可能不适合内存。 – csslayer 2010-06-13 09:37:31

+2

什么构成“大量”数据? MPI_Send/Recv由MPI_Count参数限制消息大小,该参数是一个32位值。 “大量”数据中有多少32位(4GB)块? 每个等级有多少内存可供使用?这些数据在计算过程中是否存储在内存中? 节点之间的互连是什么?什么是文件系统的互连?很可能,互连结构将比文件系统更快。 – 2010-06-14 13:36:41

回答

3

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

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