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()下面加调试信息的时候就出现了上述问题。
请各位分析一下是什么原因?我已疯~~~~,谢谢!
-
附图
-
-
首先感谢@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函数一句都没执行过
但是单核运行,都没问题
-
@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).
不知道这个是什么
-
此回复已被删除!