美文网首页
关于单线程程序改为MPI主从程序的思路

关于单线程程序改为MPI主从程序的思路

作者: 西山十月 | 来源:发表于2016-12-04 22:10 被阅读18次

对于较大的计算域,考虑对物理流域进行分块,并以0作为根进程进行输入输出等操作。

对于一个LBM的单线程程序,需要作以下修改

1、原来所有变量都可以继承为当前线程变量,但需要增加收集所有计算域的数组变量;

2、数据操作更新过程仅发生节点本地的子程序不需要进行数据传输,只有在收集所有流域数据时才需要数据分享;

3、认真查找哪些子程序需要进行数据传输。对于最简单的LBM程序仅Propagation步需要,但当程序需要计算变量梯度时、或者需要进行格式差分时,同样需要数据传输;(在LBM中,这样的传输是有方向的,有必要使用next子函数来简化程序形式,标明非本地操作)。

4、对于LBM中的Propagation过程来讲,由于分块断裂而需要进行的数据传输,传输的接收可以直接存放到目标方向上来代替原来的值(传输前本来就没有值);但是对于需要相邻点的数据计算梯度变量时或者需要计算格式差分时,就必须在外层增加一套虚拟网格进行数据传输。

例如在分块断裂的边界上有点A,其右上左下的相邻点分别为A1,A2,A3,A4,A1在另一个线程块。若计算A点的物理量rho需要临近的四个点的值,那么A4的值在另一线程块中,传输过来的值,不能直接存储在A中,一是A的值要用来计算A3的值,而是A的更新需要计算后再存储。因此最好考虑增加一层虚拟边界,对于边界点不受影响,因为要对边界做单独处理,但是对于分块断裂的点是有影响的。

5、单线程程序中,对边界上物理量进行的分类操作的都需要重写,因为分块后,这些边界被打断,不同线程描述边界的方法不再适用。 可以考虑用walls函数来实现统一。

6、基于全局考虑的一些判断条件或变换,需要进行调整。

另:

1. MPI_BCAST, MPI_GATHER等组操作语句不能只在单线程中运行;

2. 用串行程序对并行程序进行单步调试非常有效;

3. 写小程序对分析非常有效,如对串行并行计算结果进行比较,如数据传输/合并模型测试。

相关文章

  • 关于单线程程序改为MPI主从程序的思路

    对于较大的计算域,考虑对物理流域进行分块,并以0作为根进程进行输入输出等操作。 对于一个LBM的单线程程序,需要作...

  • 找bug血泪史--记录

    今天是第二次找恶心着急地找bug,上一次是将程序改为MPI程序。关于MPI程序调试的经验可以见上次的文章 今天的目...

  • 运行MPI程序

    MPI程序是需要多个进程执行才能看到效果的,VS中只会拉起一个进程,则看不到运行效果。因此,我们只得使用命令行运行...

  • 12|如何用面向对象思想写好并发程序

    在工作中,我发现很多同学在设计之初都是直接按照单线程的思路来写程序的。 而忽略了本应该重视的并发问题。 关于这个问...

  • 使用 f2py 包装 Fortran MPI 程序

    在上一篇中我们介绍了用 Boost.Python 包装 C++ 语言 MPI 程序以供 mpi4py 调用的方法,...

  • 使用 boost.Python 包装 C++ MPI 程序

    在上一篇中我们介绍了用 SWIG 包装 C 语言 MPI 程序以供 mpi4py 调用的方法,用 SWIG 包装 ...

  • Java多线程

    一、线程的基本概念 1.1 单线程 简单的说,单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照...

  • 在 C 语言中嵌入 mpi4py 程序

    在上一篇中我们介绍了用 f2py 包装 Fortran 语言 MPI 程序以供 mpi4py 调用的方法,可以看到...

  • Java 多线程基础(一)

    简介 在接触多线程之前,在我们程序中在任意时刻都只能执行一个步骤,称之为单线程。在单线程开发的程序中所有的程序路径...

  • js单线程与异步编程

    1.js的单线程 从开始接触js我们就知道js是单线程的。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前...

网友评论

      本文标题:关于单线程程序改为MPI主从程序的思路

      本文链接:https://www.haomeiwen.com/subject/lddhmttx.html