mpi - 执行并行代码的顺序部分(大量操作+写入文件)的有效方法?

标签 mpi parallel-processing

我有一个使用 mpi 的 C++ 代码,并以顺序-并行-顺序模式执行。上述模式在时间循环中重复。 在使用串行代码验证代码时,我可以减少并行部分的时间,事实上,减少的时间几乎与处理器数量呈线性关系。

我面临的问题是,当使用更高数量的处理器时,顺序部分所需的时间也会大大增加。

与整个程序的总顺序时间相比,并行部分的执行时间更少。
因此,尽管在使用更高数量的处理器时并行部分的时间有所减少,但由于执行顺序部分的时间增加,节省的时间会大大减少。顺序部分还包括每个时间步的大量计算,并在某个指定时间将数据写入输出文件。
在顺序部分的执行过程中让所有的处理器运行,并行计算后数据被收集到根处理器,只允许根处理器写入文件。
因此,任何人都可以建议计算并行代码的串行部分(大量操作+写入文件)的有效方法是什么?如果需要,我还想澄清任何一点。

提前致谢。

最佳答案

首先,从单独的线程(或 MPI 术语中的进程)写入文件,以便其他线程可以使用您的内核进行计算。

然后,检查为什么您的并行版本比顺序版本慢得多。通常这意味着您创建的任务太小,因此线程之间的通信(同步)会影响您的性能。考虑是否可以将任务组合成 block 并并行处理完整的 block 。

当然,使用适合多线程环境的任何分析器。

[编辑]

sequential part = 你的逻辑中不能(也不是)并行的部分,你的意思是一样的吗?多核上的顺序部分可以工作有点慢,可能是因为操作系统调度程序或类似的东西。您看到明显的差异很奇怪。

磁盘本质上是顺序的,因此从许多线程写入磁盘不会带来任何好处,但会导致许多线程尝试同时执行此操作并相互等待而不是做一些有用的事情。

顺便说一句,您使用什么 MPI 实现?

你的问题描述太高级了,提供一些伪代码之类的,这样可以帮助我们帮助你。

关于mpi - 执行并行代码的顺序部分(大量操作+写入文件)的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861338/

相关文章:

c++ - mpi MPI_Send() 适用于小数据集但不适用于大数据集

c++ - MPI 中的简单聊天程序 C++

c++ - MPI发送和接收的通信成本

c - OpenMP 输出错误答案

c# - 如何在自己的进程中执行测试类中的每个测试

c++ - STL vector 上的重复操作是否允许 "Inherent Parallelism"/改进的内存访问?

c# - .Net 4.0 中的并行功能

mpi - MPI 进程之间是否共享特殊变量?

fortran - MPI 组未分配正确的处理器等级

c# - 线程非常快地获得 100% CPU