计算化学公社

 找回密码 Forget password
 注册 Register
Views: 3580|回复 Reply: 3
打印 Print 上一主题 Last thread 下一主题 Next thread

[算法与编程] 在一个程序中如何“多次调用”MPI并行?

[复制链接 Copy URL]

345

帖子

7

威望

3173

eV
积分
3658

Level 5 (御坂)

大家好。
我正在学习写一个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的方法;我还想过把每个函数都分别打包成一个独立的程序,可是那样程序结构就不再简洁了。
希望有编写计算化学程序经验的大佬点拨一下,小弟不胜感激。




418

帖子

4

威望

2910

eV
积分
3408

Level 5 (御坂)

2#
发表于 Post on 2022-1-9 10:47:22 | 只看该作者 Only view this author
本帖最后由 万里云 于 2022-1-9 11:19 编辑

楼主需要的应该是openmp。

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

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

MPI_Comm_Spawn可以动态创建并行进程,但这样程序结构就不简洁了。

评分 Rate

参与人数
Participants 1
eV +5 收起 理由
Reason
Freeman + 5 谢谢

查看全部评分 View all ratings

345

帖子

7

威望

3173

eV
积分
3658

Level 5 (御坂)

3#
 楼主 Author| 发表于 Post on 2022-1-9 11:02:08 | 只看该作者 Only view this author
本帖最后由 Freeman 于 2022-1-9 11:09 编辑
万里云 发表于 2022-1-9 10:47
楼主需要的应该是openmp。

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

谢谢您的解答。我确实可以试一试openmp。我没查到MPI_pawn,您说的是不是MPI_Comm_spawn?

418

帖子

4

威望

2910

eV
积分
3408

Level 5 (御坂)

4#
发表于 Post on 2022-1-9 11:18:31 | 只看该作者 Only view this author
Freeman 发表于 2022-1-9 11:02
谢谢您的解答。我确实可以试一试openmp。我没查到MPI_pawn,您说的是不是MPI_Comm_spawn?

手误,确实是MPI_Comm_spawn。

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2025-8-15 13:16 , Processed in 0.229637 second(s), 21 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list