24小时热门版块排行榜    

查看: 1944  |  回复: 19
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

sinsia

新虫 (小有名气)

[求助] intel fortran局部变量自动更新

在win7下面用visual studio 2008 和intel fortran 11调试程序,在程序中使用了局部变量(实型数组),每次使用没有赋初值,默认初值为零。在迭代过程中发现数值在没有进入到计算时就自动更新。在linux下就没有这个问题。
另外在必须使用大量数组做为变量在主程序和子程序间传递的时候,开始会出现stack overflow的情况(win7下),在linux中会迭代上万步后出现segmentation fault。在win7下通过增加栈值,可以解决。但有没有什么方法避免这种问题呢?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)


dubo(金币+1): 欢迎讨论 2011-08-31 10:50:23
我在写一个流体的三维程序,由于需要用到多重网格,所以在数据结构上将原来的全局变量改成了局部变量调用。这种变化导致本来收敛的程序现在没法计算了,发散掉。
Segmentation fault是程序里调用的数组太多,按intel的说明如下:
, the stack reserve size can be specified through the Visual Studio IDE which adds the Microsoft Linker option /STACK: to the linker command line.  To set this, go to Property Pages>Configuration Properties>Linker>System>Stack Reserve Size. There you can specify the stack size in bytes in either decimal or C-language notation. If not specified, the default stack size is 1MB.
我增加后win7下可以计算,但变量会自动改变,所以我不确定这种变量调用会不会导致内存管理混乱,迭代计算出错
4楼2011-08-31 10:30:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)

实际使用中的数组没有越界

谢谢dubo
5楼2011-08-31 10:33:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)

引用回帖:
7楼: Originally posted by snoopyzhao at 2011-08-31 10:58:27:
我不是很明白,为什么要将全局变量改为局部变量?迭代过程中,有些变量必须保留上一次的结果,这种情况下,如果局部变量自动赋零值是肯定不行的,可以考虑使用 save……

因为要用多重网格计算的自动循环,所以子程序里面的网格和相关变量的值需要调用,所以不能再用全局变量
8楼2011-08-31 11:33:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)

引用回帖:
10楼: Originally posted by snoopyzhao at 2011-08-31 15:10:27:
这不是不能用全局变量的理由,呵呵……
你说两个系统下不一致,你的编译器是一样的吗?用的参数是一样的吗?

至于后面的那个问题,要么是内存越界,要么就是你的内存请求太大……

你用动态内存,还是静态 ...

编译器都是一样的,intel fortran 11,参数也完全一样,只是系统环境不同

我的应该是内存请求太大
变量设置的时候没有指明内存动态,所以我觉得应该是静态的吧

多重网格下求解子程序中的网格信息完全不同的,还有就是各层计算得到的余量需要存储调用
所以我没有想到很好的方法去用全局变量
11楼2011-08-31 20:50:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)

谢谢snoopyzhao
我现在已经把局部变量的内存改为动态的了,之前的程序我是用module就没有这些问题,现在改数据结构主要是因为想写多重网格的原因。

现在还是查不出来是哪儿的问题,头痛ing
13楼2011-08-31 23:06:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)

引用回帖:
14楼: Originally posted by snoopyzhao at 2011-09-01 22:14:41:
我看不懂上面所引的这句话,什么叫“在迭代过程中发现数值在没有进入到计算时就自动更新。”?

就是进入调用的子程序,但还没有开始执行循环迭代,在没有用到局部变量的时候,局部变量自动更新
15楼2011-09-02 10:07:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)

引用回帖:
16楼: Originally posted by snoopyzhao at 2011-09-02 10:45:26:
你如何监测到的呢?你看到的局部变量值是什么样的?有没有可能是随机取值……

我是在程序的不同位置打印输出看到的结果。这个应该是没有赋初值的局部变量随机取值,但在linux下是没有这个问题的
17楼2011-09-02 12:08:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sinsia

新虫 (小有名气)

引用回帖:
18楼: Originally posted by snoopyzhao at 2011-09-02 13:52:07:
如果我没有记错,你前面说过,你用了相同的编译器,用了相同的编译器开关(选项),那么不应该出现不同的结果……

一般迭代运算中,需要继承上一步的中间变量取值,所以,对这类需要继承的变量,加 save 属性 ...

谢谢
这些中间变量我下次不需要用的,我现在把这些变量全部赋初值。

现在程序发散的问题找到了,边界设置里的一个变量用错了

谢谢所有参与讨论的朋友
19楼2011-09-04 22:52:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sinsia 的主题更新
信息提示
请填处理意见