C - OpenMP、MPI、串行程序

计算科学 C mpi
2021-12-23 20:06:47

我是计算科学课程的一部分,并且来自非编程背景,所以请原谅我的无知。我正在编写一组 C 代码,以数值求解计算流体动力学课程的 Navier Stokes 方程。无论如何,作为我们任务的一部分,我必须编写在单个处理器(串行)上运行的代码,并提供使用 OpenMP 和/或 MPI 并行化相同代码的选择(以利用多个处理器,具体取决于用户输入在运行时间开始时。

我希望社区对此提供建议,但我有几个问题:

  1. 我应该为我的程序考虑 if/else 结构吗?(程序需要转向串行代码,或启用 MPI 的代码,或 OpenMP 代码,或 MPI+OpenMP 的混合,这意味着大部分代码将被复制)。
  2. 我是否应该将要复制的操作构造为单独的函数,并在需要它们的运行时调用这些函数?(但据我了解,函数调用通常会增加我的代码的开销,无论选择什么选择)
  3. 有没有办法隐藏预处理器指令或与 MPI 相关的函数(例如 MPI_Init()),以便它们根据用户在开始或运行时所做的选择方便地出现或消失?
  4. 最后,此任务的目的是衡量使用串行代码、与 OpenMP、与 MPI、与 MPI+OpenMP 相比的性能优势。我试图避免代码重复是否有意义,因为组合代码(以提高可读性)会不必要地增加我的串行代码的开销?例如与 MPI 相关的函数调用,可能有许多 if/else 条件,这会扭曲我的串行代码的性能测量,而程序开头的 if/else 结构将其引导到完全独立的路径(如第一季度) )。

我希望我已经问了一个明确的问题并遵守了社区的标准。非常感谢你。

1个回答

我想知道您为什么要将所有方法(串行、MPI、OpenMP)组合到一个 C 程序中。我认为更好的方法是将它们分成 3 个程序,并通过脚本(如 shell)调用它们。无论如何,考虑到代码和编译,它们是不同的。

对于您的第一个问题,如果您坚持使用一个 C 程序,当然您必须想办法将它们组合在一起。也许 if/else 是不够的,据我所知,MPI 程序是由“mpirun”命令调用的。在 C 中使用它似乎有点困难。

对于你的第二个问题,我建议你先把你的串口程序转换成 OPenMP 和 MPI,然后再考虑避免重复。串行程序和并行程序之间有很大的区别。

对于你的第三个问题,MPI_init 是 MPI 程序的一部分,据我所知,这是必要的,因为它们会做一些预处理工作。

对于您的最后一个问题,将它们组合在一起不可避免地会带来一些副作用,因为您可以使用“mpicc”来编译串行和 OpenMP 程序。我认为它可以被忽略,因为它是整个程序的一小部分。

不过,我建议您将它们分开并使用脚本。