我有一个使用mpi的C ++代码,并以顺序并行顺序模式执行。在时间循环中重复上述模式。
在使用串行代码验证代码时,我可以缩短并行部分的时间,事实上,与没有处理器的情况相比,减少几乎是线性的。
我面临的问题是,当使用更高的no处理器时,顺序部分所需的时间也会大大增加。
与整个程序的总顺序时间相比,并行部分执行的时间更短。
因此,尽管当使用较高的no处理器时并行部分的时间减少,但是由于执行顺序部分时的时间增加,节省了大量时间。顺序部分还包括在每个时间步骤的大量计算以及在某个指定时间将数据写入输出文件。
所有处理器在顺序部分的执行期间运行,并且在并行计算之后将数据收集到根处理器,并且仅允许根处理器写入文件。
因此,任何人都可以建议什么是计算并行代码的串行部分(大型操作+写入文件)的有效方法?如果需要,我还想澄清任何一点。
提前致谢。
答案 0 :(得分:0)
首先,从单独的线程(或MPI术语中的进程)进行文件写入,因此其他线程可以使用您的内核进行计算。
然后,检查为什么你的并行版本比顺序慢得多。通常这意味着您创建的任务太小,因此线程之间的通信(同步)会影响您的性能。考虑是否可以将任务组合成块并且并行处理完整的块。
当然,使用任何适合多线程环境的分析器。
[编辑]
顺序部分=您的逻辑的一部分不能(并且不是)并行,您的意思是相同的吗?多核上的顺序部分可以工作有点更慢,可能是因为操作系统调度程序或类似的东西。你看到明显的差异是很奇怪的。
磁盘本质上是顺序的,因此从许多线程写入磁盘不会带来任何好处,但是当许多线程试图同时执行此操作并等待彼此而不是做有用的事情时,可能会导致这种情况。 / p> BTW,你使用什么MPI实现?
您的问题描述太高级,提供一些伪代码或类似的东西,这可以帮助我们帮助您。