Redian新闻
>
fortran里矩阵传递有维数限制吗?
avatar
fortran里矩阵传递有维数限制吗?# Computation - 科学计算
s*e
1
我的一个计算涉及很大维数的矩阵操作. 其中含有一个整数参数n, 维数是该参数的
平方, dim=n^2
在所有其他参数固定的情况下, n<=17, 整个计算可以顺利进行. n=18时, 出现
segment fault错误.
对矩阵赋值是通过调用一个子程序完成的:
call MAT0(dim,LMAX1,LMAX2,a,b,f,pil1,AT0)
这个调用没有问题. 返还的sparse矩阵AT0经查没有什么异常.
之后调用另外一个子程序,
call mat_product(NSITE-2,LMAX,dim,AT0,Z0L)
目的是要对AT0进行一系列操作. 现在发现调用过程出了segment fault错误,
根本没有进入这个子程序内部.
麻烦各位帮忙参考一下, 大概可能是什么样的问题所致.
机器系统是dual opteron 260, Fedora Core 2 64, gcc-g77-3.3.3.
THX
avatar
a*x
2

象是堆栈溢出,试试(bash下)
# ulimit -a
看看stacksize 的上限是多少,如果不是unlimited的话
# ulimit -s unlimited

【在 s***e 的大作中提到】
: 我的一个计算涉及很大维数的矩阵操作. 其中含有一个整数参数n, 维数是该参数的
: 平方, dim=n^2
: 在所有其他参数固定的情况下, n<=17, 整个计算可以顺利进行. n=18时, 出现
: segment fault错误.
: 对矩阵赋值是通过调用一个子程序完成的:
: call MAT0(dim,LMAX1,LMAX2,a,b,f,pil1,AT0)
: 这个调用没有问题. 返还的sparse矩阵AT0经查没有什么异常.
: 之后调用另外一个子程序,
: call mat_product(NSITE-2,LMAX,dim,AT0,Z0L)
: 目的是要对AT0进行一系列操作. 现在发现调用过程出了segment fault错误,

avatar
s*e
3
Problem solved!
Thanks.

【在 a*******x 的大作中提到】
:
: 象是堆栈溢出,试试(bash下)
: # ulimit -a
: 看看stacksize 的上限是多少,如果不是unlimited的话
: # ulimit -s unlimited

avatar
s*e
4
再向你请教一个问题:
ulimit -s unlimited 确实解决了我前面的segment fault错误. 具体计算结果正确不
正确得到明天才能知道. 我想问的是:
每次我logout再login时, stacksize都是有限制的. 有什么办法把它设置成
unlimited by default的吗?
此外, 运算一旦开始, 就算我logout, 这个后台运行的程序还是自动具有
unlimited stacksize吗?
如果我不想设置unlimited stacksize, 是否可以通过定义公告区来传递大矩阵, 而
不会出现这个segment fault? 利用公共区, 程序速度是否会有显著提升?
THX

【在 a*******x 的大作中提到】
:
: 象是堆栈溢出,试试(bash下)
: # ulimit -a
: 看看stacksize 的上限是多少,如果不是unlimited的话
: # ulimit -s unlimited

avatar
a*x
5

把上面的命令放在~/.bashrc里就可以了。
这个可能跟你后台运行的方式有关,为了保险, 你可以写一个简单的脚本:
#!/usr/bin/bash
cd MYDIR
ulimit -s unlimited
./a.out
这样之后你提交该脚本后台运行时就保证了ulimit。注意该脚本必须是可执行的:
$ chmod u+x myscript
提交任务时用
nohup ./myscript
或者
qsub myscript (如果你们的系统用qsub提交后台任务的话,你的脚本里应该规定
一些其他的参数)
应该不会出现segmentation fault.,因为堆栈主要是存放调用参数的。但是公用区
的写法不推荐,我不觉得它会使程序速度改善多少。
可以试试其它的编译器,比如free的intel的fortran95 compiler,
虽然你用的是AMD opteron,不妨试一试。

【在 s***e 的大作中提到】
: 再向你请教一个问题:
: ulimit -s unlimited 确实解决了我前面的segment fault错误. 具体计算结果正确不
: 正确得到明天才能知道. 我想问的是:
: 每次我logout再login时, stacksize都是有限制的. 有什么办法把它设置成
: unlimited by default的吗?
: 此外, 运算一旦开始, 就算我logout, 这个后台运行的程序还是自动具有
: unlimited stacksize吗?
: 如果我不想设置unlimited stacksize, 是否可以通过定义公告区来传递大矩阵, 而
: 不会出现这个segment fault? 利用公共区, 程序速度是否会有显著提升?
: THX

avatar
r*e
6
Use pointer and target will save memory

确不

的?: : 的写法不推荐,我不觉得它会使程序速度改善多少。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。