OF并行计算这个语句,与单核运行时有什么不同?



  • 已经被搞疯~

    我的主程序.C的int main()中,调用了更新边界的语句,即:

    int main(int argc, char *argv[])
    {
    // 一些必要的#include "... .H"
    ..........
    ..........
    while(runTime,run())
    {
    ......
    ......
    U.correctBoundaryConditions();
    // Info << "breakPoint" << endl;
    // getchar(); 不会出现内存错误
    T.correctBoundaryConditions();
    // Info << "breakPoint" << endl;
    // getchar(); 出现内存错误
    p.correctBoundaryConditions();
    ......
    ......
    .......
    }
    }
    通过设置Info,发现在执行完第一个U.correctBoundaryConditions(),不会报错,如果执行T.correctBoundaryConditions()时,就会有一大堆的内存错误信息,其中包括
    Invalid free() / delete /delete[] /realloc() 这种空间申请/释放问题;
    N bytes in M blocks are still reachable in loss record X of Y,这里N M X Y都是整数。

    PS: 我是用mpirunDebug下的Xterm+valgrind模式下调试的,找错的时候也是在代码中设置info,其他地方都没问题,就是在T.correctBoundaryConditions()下面加调试信息的时候就出现了上述问题。

    请各位分析一下是什么原因?我已疯~~~~,谢谢!



  • 附图
    0_1461292386958_11.png



  • @Aeronastro

    链接文本

    如果能参考这个帖子贴出一个测试代码最好了。另外,可以用pout来代替info测试并行。并且提供linux系统和openfoam版本?


  • OpenFOAM教授

    同意楼上,a minimal working example would be helpful :tongue_out:



  • 首先感谢@cfd-china 和@wwzhao 的回复,我把我的问题描述重新说一下

    int main(int argc, char *argv[])
    {
         // 一些必要的#include "... .H"
          ..........
          .........
    
    
          while(runTime.run())
          {
               ......
               ......
    
    
               U.correctBoundaryConditions();
               Info << "breakPoint" << endl;
               getchar();     // 不会出现内存错误
               T.correctBoundaryConditions();
              // Info << "breakPoint" << endl;
              // getchar();      出现内存错误
               p.correctBoundaryConditions();
    
    
    
             ......
             ......
            .......
          }
    }
    

    用这个格式会直观一些,我的入口边界条件是自定义的,是通过计算得到的速度场,温度场等,将他们的value逐个赋给入口的faces,在每次循环求解之前,我要手动更新边界,让新算出来的速度场、温度场等赋值到新的时间步的边界上,上面的代码我执行U.correctBoundaryConditions(),没有问题,可以在屏幕上出现“breakPoint”的信息,如果写成

              U.correctBoundaryConditions();
              // Info << "breakPoint" << endl;
               //getchar();     // 不会出现内存错误
              T.correctBoundaryConditions();
              Info << "breakPoint" << endl;
              getchar();     // 出现内存错误
              p.correctBoundaryConditions();
    

    就会出现我之前遇到的问题,不知道这个在并行的时候为什么会这样。
    PS:关于并行,之前@wwzhao 说过关于分布式内存,我想是不是问题出现在这儿。
    我的入口边界条件中经过计算得到的速度场,温度场没有使用new,而是直接用的全局变量(就是写在了主函数体外),即:在求解器的C文件中:

    #include "fvCFD.H"
    #include "....H"    // 一些必要的头文件
    .....
    
    #include "incl3d.H"    //一些定义的量,包括那个要计算的速度场,温度场等,我为了方便写成了.H文件
    
    int main()
    {
         ......
    }
    

    不知道这样有什么问题?看之前的错误信息的附图(可能不是很清晰),里面有new, delete, delete[]的错误。



  • 在每次循环求解之前,我要手动更新边界,让新算出来的速度场、温度场等赋值到新的时间步的边界上,

    每个时间步都需要这么做?:big_mouth: :big_mouth: :big_mouth:

    在程序里面添加getchat()是为什么?

    也就是说你的程序是这样的:?

               U.correctBoundaryConditions();
               getchar();     
               T.correctBoundaryConditions();
               getchar();      //出错?
               p.correctBoundaryConditions();
    


  • @cfd-china 我今天发现,在执行完U.correctBoundaryConditions()之后,执行T.correctBoundaryConditions()里面的boundaryField_.evaluate()就会出错,而且我定位到evaluate函数源码,好像都没有执行这个函数就报错了,也就是说evaluate函数一句都没执行过

    但是单核运行,都没问题



  • 刚才误删了原贴。

    你试过执行U.correct()两遍么?而不是第一遍U第二遍T


  • OpenFOAM教授

    @Aeronastro 场量的声明一般放在 createFields.H 文件当中,而这个文件会在main函数中用 #include 语句包含进来。



  • @cfd-china 这个没有试过。可以具体一些么?我还不太清楚你的意思:confused:



  • @cfd-china

    我在并行的时候,出现这样的信息,一直没管:

    warning: the debug information found in "/usr/lib/debug//lib/x86_64-linux-gnu/libm-2.19.so" does not match "/lib/x86_64-linux-gnu/libm.so.6" (CRC mismatch).
    
    warning: the debug information found in "/usr/lib/debug/lib/x86_64-linux-gnu/libm-2.19.so" does not match "/lib/x86_64-linux-gnu/libm.so.6" (CRC mismatch).
    
    warning: the debug information found in "/usr/lib/debug//lib/x86_64-linux-gnu/libc-2.19.so" does not match "/lib/x86_64-linux-gnu/libc.so.6" (CRC mismatch).
    
    warning: the debug information found in "/usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so" does not match "/lib/x86_64-linux-gnu/libc.so.6" (CRC mismatch).
    
    warning: the debug information found in "/usr/lib/debug//lib/x86_64-linux-gnu/libpthread-2.19.so" does not match "/lib/x86_64-linux-gnu/libpthread.so.0" (CRC mismatch).
    
    warning: the debug information found in "/usr/lib/debug/lib/x86_64-linux-gnu/libpthread-2.19.so" does not match "/lib/x86_64-linux-gnu/libpthread.so.0" (CRC mismatch).
    

    不知道这个是什么



  • @wwzhao 嗯嗯是的,我因为要在主函数中调用一个函数,而这个函数里要用到一些量,所以我把这些要用到的量定义成了全局变量,这样的话在执行完这个函数的时候,那些变量还在,供主函数继续操作。而别的量我已经在createField.H中定义了。



  • This post is deleted!

Log in to reply