s***e 发帖数: 911 | 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 | a*******x 发帖数: 47 | 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错误,
| s***e 发帖数: 911 | 3 Problem solved!
Thanks.
【在 a*******x 的大作中提到】 : : 象是堆栈溢出,试试(bash下) : # ulimit -a : 看看stacksize 的上限是多少,如果不是unlimited的话 : # ulimit -s unlimited
| s***e 发帖数: 911 | 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
| a*******x 发帖数: 47 | 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
| r**********e 发帖数: 28 | 6 Use pointer and target will save memory
确不
而
的?: : 的写法不推荐,我不觉得它会使程序速度改善多少。 |
|