计算化学公社

标题: 在一个程序中如何“多次调用”MPI并行? [打印本页]

作者
Author:
Freeman    时间: 2022-1-8 21:16
标题: 在一个程序中如何“多次调用”MPI并行?
大家好。
我正在学习写一个MPI/C++的计算化学程序,想实现双电子积分和HF的并行计算。串行的程序已经写好了,main函数的结构是这样的:
  1. Matrix overlap=Overlap(basis_set); // 计算重叠积分,存在一个矩阵里
  2. Matrix kinetic=Kinetic(basis_set); // 计算动能积分
  3. Matrix nuclear=Nuclear(basis_set,atom_positions); // 计算核吸引积分
  4. Tensor repulsion=Repulsion(basis_set); // 计算双电子积分,存在一个四维张量里
  5. double hfenergy=HF(overlap,kinetic,nuclear,repulsion); // 计算HF能量
复制代码
要在Repulsion函数里用MPI,就要在函数定义里写:
  1. Tensor Repulsion(...){
  2. MPI_Init(...);
  3. ......
  4. MPI_Finalize();
  5. return repulsion;
  6. }
复制代码
HF函数也同理:
  1. double HF(...){
  2. MPI_Init(...);
  3. ......
  4. MPI_Finalize();
  5. return hfenergy;
  6. }
复制代码
可是问题在于在一个程序的运行周期中,MPI只能调用一次。这可怎么办?我试过查看开源程序的源码,看他们是怎么解决这个问题的,但是里面涉及到MPI的部分好复杂啊,看了几天也不明白;我还看了《Using MPI》和《Parallel computing in quantum chemistry》,但它们好像只写了在单个main函数里调用一次MPI的方法;我还想过把每个函数都分别打包成一个独立的程序,可是那样程序结构就不再简洁了。
希望有编写计算化学程序经验的大佬点拨一下,小弟不胜感激。





作者
Author:
万里云    时间: 2022-1-9 10:47
本帖最后由 万里云 于 2022-1-9 11:19 编辑

楼主需要的应该是openmp。

MPI的设计思路就是在主函数开始调用MPI_Init,然后获取rank和size。接着根据rank和size分配任务,算完后用reduce汇总数据。最后调用MPI_Finalize结束程序。在整个程序中,都需要开发者显式指定任务分配规则,显式交换数据。如果一个函数没有按规则改写,就是同一份代码重复运行了size次。

OpenMP可以实现按需开启和关闭多线程,对程序的改动小。但默认的任务分配和数据交换都是隐式的。要想取得高效率,程序改到最后其实是和MPI差不多的。

MPI_Comm_Spawn可以动态创建并行进程,但这样程序结构就不简洁了。
作者
Author:
Freeman    时间: 2022-1-9 11:02
本帖最后由 Freeman 于 2022-1-9 11:09 编辑
万里云 发表于 2022-1-9 10:47
楼主需要的应该是openmp。

MPI的设计思路就是在主函数开始调用MPI_Init,然后获取rank和size。接着根据r ...

谢谢您的解答。我确实可以试一试openmp。我没查到MPI_pawn,您说的是不是MPI_Comm_spawn?
作者
Author:
万里云    时间: 2022-1-9 11:18
Freeman 发表于 2022-1-9 11:02
谢谢您的解答。我确实可以试一试openmp。我没查到MPI_pawn,您说的是不是MPI_Comm_spawn?

手误,确实是MPI_Comm_spawn。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3