【发布时间】:2015-03-31 01:59:32
【问题描述】:
我正在使用适用于小型数组的 Fortran90 代码。不幸的是,如果数组太大,程序在分配数组时会返回错误:severe (41): Insufficient virtual memory。
我拥有的是:
real*8, allocatable :: M(:,:), C(:,:), K(:,:)
real*8, allocatable :: t(:)
real*8, allocatable :: X(:,:), DX(:,:), D2X(:,:)
real*8, allocatable :: R(:,:)
integer*4 :: nx, nt
integer :: io_stat
...
nx = 15
nt = 6000001
...
allocate(M(nx,nx), C(nx,nx), K(nx,nx),stat=io_stat)
if(io_stat) stop
allocate(t(nt),stat=io_stat)
if(io_stat) stop
allocate(X(nx,nt),DX(nx,nt),D2X(nx,nt),R(nx,nt),stat=io_stat)
if(io_stat) stop
...
nt 参数是根据我想在计算上使用的时间增量来计算的,而且这个时间增量必须非常小(1e-9 或更小)才能使结果收敛。如果nt=600001,程序运行正常,但结果不准确。问题是:我无法增加数组的大小,因为程序无法分配我正在使用的所有数组(尝试分配 DX 数组时,程序已经停止)。这些不是代码中唯一的数组,只是重要的(大)数组。
我正在使用 Intel(R) Visual Fortran Compiler Professional Edition 11.1 和 Microsoft Visual Studio 2008 版本 9.0.21022.8 RTM。 我在 Windows 8、64 位、16 GB RAM 内存中运行代码。 但是,Build -> Configuration Manager 设置为 Win32 Platform,因为我使用了必须在该平台上运行的库(我无法将其更改为 x64 平台)。
我想知道如何增加虚拟内存,以便我可以以适当的离散化运行我的代码,即我需要更多内存来分配我的所有数组。怎么做?
附:我在 Matlab 上运行了类似的代码,它生成了近 2GB 的数据(X、DX 和 D2X 数组,这是我想要的结果)。但是我有 16GB 的内存,所以我认为计算机的内存不是问题,而是编译器/代码的问题。我说的对吗?
【问题讨论】:
-
您实际生成了多少数据?你的交换空间有多大? (检查计算机高级属性以查看大小)。请注意,如果您使用 32 位配置,则无法寻址所有内存(最多 4GB),因此您的有效内存将被限制为 4GB。
-
还有一些矩阵和变量,它们占用的空间不超过 1 MB。问题是数组 t、X、DX、D2X 和 R。它们占用(如果我错了,请纠正我): t: 6000001*8 bytes X, DX, D2X, R: 4*6000001*15*8bytes 总计:2,93 GB 因为我在计算后不需要 R,所以我需要保存的唯一数组是 t、X、DX 和 D2X(要保存 2,21 GB 的数据)。我不知道 4 GB 的限制,但我不需要 4 GB 内存(只是,让我们四舍五入,3 GB)。我无法在我的计算机上检查的交换空间(它不是我的个人计算机,因此我需要管理员权限才能检查和更改它)。
-
顺便问一下,交换空间是如何影响程序的?程序不是在ram内存上运行的吗?
-
2GB 是 32 位 Windows 的实际限制。见software.intel.com/en-us/articles/…
-
有什么替代方案?将数组分成一半并运行代码两次?这行得通吗?
标签: fortran virtual-memory intel-fortran