MPI并行化有助于多次读取大量数据

时间:2016-02-08 20:56:08

标签: c parallel-processing mpi

我被要求并行化现有的c程序以减少其运行时间。 我只有一些(非常有限的)使用基本MPI的经验(我所有的编程知识都是自学的,所以它有点不稳定)。我目前正在尝试找出最佳的并行化方法。

目前,在主循环的每次迭代期间(M =迭代次数),程序顺序访问一组输入文件(N =文件数) - 每个都有不同的长度。读取所有输入文件后,程序将对数据进行排序并更新一组输出文件。 N和M在开始时都是已知的,并且N总是大于M.事实上,N太大而无法将所有输入数据读入内存,因此每次读取文件时,只有与该主循环相关的信息保持迭代。

我相信我可以使每个主循环迭代独立,但每次迭代仍然需要访问所有N个文件。什么是使用OpenMPI(技术上运行在Rocks-即RedHat Linux上的OpenRTE 1.6.2)来并行化该程序的最佳方式?

我的第一个想法是简单地将输入文件的读入分成多个线程 - 每个线程处理一个文件子集,然后在最后对输入进行排序。

我的第二个想法是在线程上拆分主M循环,这样可以更好地利用MPI。但是这个方法是否需要复制每个线程中的所有输入文件(以避免读取冲突)?如果是这样,我担心复制文件可能会抵消并行化主循环所获得的任何时间。此外,除了为每种方法构建测试程序之外,还有更简单的方法来确定哪种方法更快吗?

编辑:文件系统是NFS。

阅读完评论后,我回过头来对代码进行了一些测试。该程序将93%的运行时读数用于数据。从内容来看,似乎并行化可能不是最好的解决方案。此时,似乎有必要真正研究程序的计算并尝试最小化读入要求。

非常感谢您的回复。

2 个答案:

答案 0 :(得分:0)

根据评论回复,文件系统是NFS,你的意思是你正在通过网络阅读你的文件?如果您对 N 文件数进行并行化,则可能会出现问题。如果N太大,则一次超过最大打开文件指针数的风险,通常在 /etc/security/limits.conf 中定义。 我知道如果shell类型是csh或tcsh,那么如果在提示符下键入limit,它将显示所有这些值。对不起,我忘记了在bash shell中显示它的命令。 然后你还冒着超载NFS的风险,以及lan或wan带宽的问题。如果您的网络速度为100 mbps,则每秒最多只有12 MB数据。如果你不检查它,你怎么知道它实际上不是每秒千字节的价值呢?

如果程序运行时间的最大原因是读取数据,那么你可以做的很少。除了NFS问题,我建议考虑如何命令硬盘驱动器(无论它位于何处)读取每个数据块/文件。我认为通常最好只有一个文件指针尽可能按顺序读取磁盘驱动器中的数据,这样就可以了解如何缓冲要在程序中使用的数据。如果你有足够的RAM,你需要做数学和计算。如果不是那么那将是你需要增加的,否则你被迫依赖磁盘i / o这是一个杀手。

答案 1 :(得分:0)

NFS的并行I / O是一个愚蠢的差事。 MPI实现将尽力而为,但NFS - 除了串行 - 提供了可怕的一致性语义。客户端写入在某个未定义的时间显示给其他进程。您可以关闭每个操作的缓存和fcntl-lock,但仍然无法获得预期的一致性。

MPI实现提供NFS支持,因为NFS无处不在,但是如果不需要花费太多精力就可以部署PVFS / OrangeFS,那么分析应该确定I / O实际上是一个重要的瓶颈。