回 帖 发 新 帖 刷新版面

主题:请教mtlx:64位系统下 如何开辟大于2G内存

IMPLICIT REAL*8 (A-H,O-Z)
      PARAMETER(MEMSIZE=240000000)
      COMMON A(MEMSIZE)

平台:vs2008 + intel fortran 11

在32位下,上述开内存无问题,如果MEMSIZE=250000000,即超出系统内存大小
在64位下,如果MEMSIZE=250000000,也超出系统内存大小。
请教下mtlx老师,如何才能开辟更大的内存空间,采用64位系统

回复列表 (共23个回复)

沙发

是问我吗?俺叫mltx。这里高手很多,别专门问一个人。

如果你的系统内存为2G,则你不能在内存中开辟大于2G的数组。

帮助中说的很清楚:

Array elements per dimension 
 9,223,372,036,854,775,807 = 
2**31-1 on IA-32 systems;
2**63-1 on Intel® EM64T and Itanium®-based systems;
plus limited by current memory configuration
 
所以,limited by current memory configuration说的就是受到你内存大小的限制。
加大内存吧。

板凳

HOHO,mltx 兄,人家是你的 fans。兄台大名远扬,非吾等可比。

我在 IVF11.1 Compiler 帮助文档中查到了 mltx 贴出的那段话,见 Index -> Compiler Limits。不过,

2, 2147483647 --> 2 *** 31 - 1
9,223,372,036,854,775,807 --> 2 ** 63 - 1

也许 IVF1.1 Compiler 的帮助文档该略作修改了。

3 楼

jackiemouse问的是怎么开辟大于2G内存的数组,而且用的是64位系统,肯定机子配置内存大于2G了。

可以通过动态数组的方式如下:

PARAMETER(MEMSIZE=240000000)
ALLOCATABLE::A

然后,分配内存

ALLOCATE( A(MEMSIZE) )

最后初始化
A=0.0

当然了,如果要成功运行,就还得配合使用64位编译器

4 楼

asymptotic兄,别拿俺开心,都是兄弟,能帮就帮。
俺查的是IVF9.1的帮助文档,对于IVF11.1,应以你的为准。


laoyin:
======================
jackiemouse问的是怎么开辟大于2G内存的数组,而且用的是64位系统,肯定机子配置内存大于2G了。
========================
俺从LZ的帖子看不出来内存大于2G。

LZ的原话在这:
在32位下,上述开内存无问题,如果MEMSIZE=250000000,即超出系统内存大小
在64位下,如果MEMSIZE=250000000,也超出系统内存大小。

两次提到“超出系统内存大小”,只能理解为系统内存是2G。到底如何,只能由LZ作答。
按照IVF的帮助文档信息,只要系统内存超过2G,在内存中开辟超过2G的空间应该不成问题。

5 楼

多些各位,问题已经解决了~
采用动态数组可以在32位或者64位上 通过intel fortran 11x64 编译通过了内存为20G的大数组
有个缺点就是 程序不能运行,但是有exe文件,也可以了。以前150万以上的单元计算不了,现在300万的也没有问题了

6 楼

在32位机下,MEMSIZE=10亿,也可以通过x64位编译.。电脑内存为2G
[quote]jackiemouse问的是怎么开辟大于2G内存的数组,而且用的是64位系统,肯定机子配置内存大于2G了。

可以通过动态数组的方式如下:

PARAMETER(MEMSIZE=240000000)
ALLOCATABLE::A

然后,分配内存

ALLOCATE( A(MEMSIZE) )

最后初始化
A=0.0

当然了,如果要成功运行,就还得配合使用64位编译器[/quote]

7 楼

应该是common语句的问题
同样的32位机器2G内存,编译器是11版本 64位的,allocate 语句就可以开辟大于实际物理内存的大数组。
common开辟静态,allocate是动态。
区别很大啊
[quote]asymptotic兄,别拿俺开心,都是兄弟,能帮就帮。
俺查的是IVF9.1的帮助文档,对于IVF11.1,应以你的为准。


laoyin:
======================
jackiemouse问的是怎么开辟大于2G内存的数组,而且用的是64位系统,肯定机子配置内存大于2G了。
========================
俺从LZ的帖子看不出来内存大于2G。

LZ的原话在这:
在32位下,上述开内存无问题,如果MEMSIZE=250000000,即超出系统内存大小
在64位下,如果MEMSIZE=250000000,也超出系统内存大小。

两次提到“超出系统内存大小”,只能理解为系统内存是2G。到底如何,只能由LZ作答。
按照IVF的帮助文档信息,只要系统内存超过2G,在内存中开辟超过2G的空间应该不成问题。[/quote]

8 楼

话说到这,就可以进一步说了。

1)看来楼主的内存确实是2G,这一点俺没估计错。

2)因为楼主问在内存中开辟大于2G的数组,因此俺就没提动态数组。

3)楼主理解没错,静态数组要受内存限制,而动态数组则可以突破内存限制。

4)动态数组(allocatable arrays)是可以开辟超过内存大小的数组,此时实际上是用了硬盘上的虚拟内存,在计算大数组情况下,应该可以感觉到频繁的内外存交换。

5)内存数组运行效率高,内外存大数组运行效率低,这是用时间换取空间的策略。对于有经验的程序员,宁愿自己编写内外存交换代码,使其交换次数少,批量大,而不是全部交给编译器去处理(比如有限元中的波前法)。当然,全部交给编译器自动处理也是简便之选择,代价是代码效率不够高。

9 楼

目前我在64位6G内存的系统: vs2008 + intel 11 x64 
开辟动态数组达6G,再多的话就需要增加系统的虚拟内存,但会降低速度。
所以目前我就真正编译exe时,不采用超过系统内存的数组。如有必要增加内存条~

还有个问题就是 为何在程序不能直接运行,而是只能编译仅得到exe(也可以用了)

[quote]话说到这,就可以进一步说了。

1)看来楼主的内存确实是2G,这一点俺没估计错。

2)因为楼主问在内存中开辟大于2G的数组,因此俺就没提动态数组。

3)楼主理解没错,静态数组要受内存限制,而动态数组则可以突破内存限制。

4)动态数组(allocatable arrays)是可以开辟超过内存大小的数组,此时实际上是用了硬盘上的虚拟内存,在计算大数组情况下,应该可以感觉到频繁的内外存交换。

5)内存数组运行效率高,内外存大数组运行效率低,这是用时间换取空间的策略。对于有经验的程序员,宁愿自己编写内外存交换代码,使其交换次数少,批量大,而不是全部交给编译器去处理(比如有限元中的波前法)。当然,全部交给编译器自动处理也是简便之选择,代价是代码效率不够高。[/quote]

10 楼

[quote]目前我在64位6G内存的系统: vs2008 + intel 11 x64 
开辟动态数组达6G,再多的话就需要增加系统的虚拟内存,但会降低速度。
所以目前我就真正编译exe时,不采用超过系统内存的数组。如有必要增加内存条~
[/quote]
这就对了!!!

[quote]
还有个问题就是 为何在程序不能直接运行,而是只能编译仅得到exe(也可以用了)
[/quote]
这句话没太明白,编译出来EXE后,就可以直接运行EXE了啊。复制到其他相同系统的电脑上都可以直接运行!最好是Release模式的EXE。

我来回复

您尚未登录,请登录后再回复。点此登录或注册