【问题标题】:Increase virtual memory in Fortran在 Fortran 中增加虚拟内存
【发布时间】: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


【解决方案1】:

通常您需要确保:

  1. 您的系统支持您需要的虚拟内存量。
  2. 您有足够的页面文件空间。
  3. 您的进程具有足够大的虚拟内存和工作集配额。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2021-11-07
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多