您的位置:首页 > 其它

[合集]求助关于大数组

2005-04-08 16:58 232 查看
发信人: leavy (☆星河☆), 信区: Fortran
标  题: [合集]求助关于大数组
发信站: 南京大学小百合站 (Tue Sep  7 21:38:48 2004)

vapour2004 (vapour) 于Thu Sep  2 13:04:04 2004)
提到:

在Linux86-64下,用pig5.2-2的pgf90怎样实现超过2GB的大数组呢?
在pgcc下就容易,只要include stdlib.h 并用malloc就可以来.
fortran怎么办呢?
着急中.......
先谢了

leavy (☆星河☆) 于Thu Sep  2 13:20:48 2004)
提到:

我也遇到过这样的困难,一个数组1G多就开不了,后来在程序里分割很麻烦
研究一下pgi说明书,可能会有办法

tsy (tsy) 于Thu Sep  2 16:32:29 2004)
提到:

这么大的玩意我还从来没有碰到过
估计也碰不到了hoho
为什么不用c来开,然后用fortran调用呢?

tsy (tsy) 于Thu Sep  2 16:52:01 2004)
提到:

记得曾经在那里见过这么个说法:
机器配置都是512M内存,虚拟内存1G(windows),交换区512M(linux)
其它的什么就忘记啦,好象是p4 1.7吧~~
1、windows中
用f90,数组是allocatable的,整型和real*4只能达到256M(61*1024*1024),双精度只
能
达到31*1024*1024,如果再大的话,虽然编译不出错,但是会显示和虚拟内存有关的错误
,即使你的虚拟内存再大也没有用;静态数组可以开到1.6G左右,但是编译会给警告,但
是结果是正确的,好象windows下vfp程序只能够用256m内存
2、linux中
动态数组可以开到708M再大就出错,对于静态数组只能够使用真实的内存空间,交换区的
用不上。

不过是不是就不知道了,我还没有用过那么大的所以就没有去尝试过啦

vapour2004 (vapour) 于Thu Sep  2 17:52:36 2004)
提到:

首先我使用的机器是 2 x opteron246 内存为16GB,所以不要再讨论交换空间的问题
其次我以前自己写程序总是用C, fortran掌握不好, 现在一定要用fortran,
不为别的, 就是想熟练fortran。
在c中当然好弄, 当然如果不include stdlib.h, 用动态内存malloc
编译也通过, 小数组运行时也没问题, 但就是不能大于2GB(注意单位)。
我想在fortran中会不会有类似的情况,我现在就是想用fortran的动态内存分配malloc,

我想一定有一个什么头文件或库里面能有突破2GB限制的,
只是pgi的书明书里没有清楚提到,但用pgi确实可以不用动态内存分配直接申请2GB以上的
数组,
但是这样的程序我不满意,如果fortran连这么重要而简单的问题都解决不了,我看
就干脆死掉算了。因为fortran一直就是以数值计算著称的,在量子力学计算中波函数数组

经常会很大,我最近的任务中就是有这样的计算,总内存量大约12GB,其中有一个
数组就是8GB左右,这次用了fortran我就是想用到底,谁也别劝我用什么其它的法子了。

还有我知道opteron用的是40或48的寻址,这个问题也不用讨论了。

leavy (☆星河☆) 于Thu Sep  2 18:05:43 2004)
提到:

opteron应该内存没限制吧?有没有unlimit?编译能够顺利通过吧?
我当时用的是2G内存的P4微机,
单个数组好像不能超过900M左右(可能偏差大点,具体不详)

leavy (☆星河☆) 于Thu Sep  2 18:07:08 2004)
提到:

我在Linux下单个静态数组也不能超过900M左右,总内存2G

leavy (☆星河☆) 于Thu Sep  2 18:10:08 2004)
提到:

你是用那些选项编译的?前段时间我们这有台opteron测试用的,可惜我没试试大内存
推荐再到高性能计算HPC版去问问,那儿很多大牛:P

yogicy (我踏月色而来) 于Thu Sep  2 18:19:51 2004)
提到:

64位的不应该出现2G的限制,即使是静态分配的,也应该是足够的。

leavy (☆星河☆) 于Thu Sep  2 18:35:14 2004)
提到:

我记得在sgi上要unlimit的,编译时也要加 -64

yogicy (我踏月色而来) 于Thu Sep  2 18:53:48 2004)
提到:

对,用64编译。

不过好像静态的大数组在opteron上用pgf90 64编译也通不过,不知为何。但如果用动态分配是可以的。

vapour2004 (vapour) 于Fri Sep  3 08:05:40 2004)
提到:

原来在pgi的f90中malloc或allocate不支持2GB以上数组(见官方maillist),
没办法用分割数组并行解决了了事。
谢谢大家的讨论。
关于c中的数组问题,我提一句,每次返回的指针都是40位的,40位以上的统统为nil。

所以amd64在suse9.1pro-PGI环境下,不是真正的64位机(主要指寻址),
即使官方公布技术细节也指说寻址为48位,
话又说回来了,其实世界上一直也没出现过真正的64位机。

在这里有个建议,来此提问的都是应该自己努力解决过问题的,
所以类似人云亦云的讨论不应该出现,比如编译参数等等手册说得很清楚的问题,
还有,没有实际经验,并且功底不是很扎实的,不应该说出64位应该没有2GB限制等结论,

因为程序的运行不仅与硬件有关还与操作系统编程环境是密切相关的。

关于limit的问题,每个程序员在linux环境下编程之前,都应该直接用limit命令查看的,

以便做必要的修改。

我说这些话绝对是善意的,只是希望本版更具可读性。
再次感谢各位热心的大侠。

yogicy (我踏月色而来) 于Fri Sep  3 10:33:19 2004)
提到:

anyway, 我在opteron上allocate了一个3.4G的数组

leavy (☆星河☆) 于Fri Sep  3 11:44:31 2004)
提到:

我没真正用过opteron,以前有机会的测试时候没想到测试大内存

vapour2004 (vapour) 于Sat Sep  4 06:19:16 2004)
提到:

我很想知道您是怎样申请到大数组的?
是pgi5.x么?
能否告知,哪些头文件,具体实例。
非常感谢!!!!

yogicy (我踏月色而来) 于Sat Sep  4 13:04:12 2004)
提到:

fortran中不需要什么头文件。用的是5.2,但好像只要不是太低的版本就可以了,可以去
pgi的网站上查查。

另外不知道你的操作系统是不是64位的。

以下是测试的程序:

program biggg
implicit none

parameter(n=15000)
complex*16, allocatable ::  a(:,:)
integer i,j,n

allocate(a(n,n))
do i=1,n
do j=1,n
a(i,j)=cmplx(i,j)
enddo
enddo
pause
deallocate(a)

end

vapour2004 (vapour) 于Sun Sep  5 07:02:36 2004)
提到:

真的很奇怪用allocate就可以
我一直以为malloc和allocate在对内存操作上没什么大区别,在c中就没看出什么差别。

万分感谢yogicy
如果有空能不能讲讲这两个函数在f中除了返回参数之外的区别呢?主要是对物理内存的操
作上。
再次感谢

Carrot (大萝卜1号) 于Sun Sep  5 09:43:49 2004)
提到:

你的os能访问多少内存?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: