Matrix Fortran中多个例程之间的大型矩阵处理

Matrix Fortran中多个例程之间的大型矩阵处理,matrix,fortran,fortran90,Matrix,Fortran,Fortran90,我有两个矩阵,它们在子程序中生成,并在程序的不同部分中使用和更改。由于矩阵是6维的,并且非常大(100^6没有什么不寻常的),因此生成和传递例程不是一个选项。 我使用form=unformatted,access='direct' 我现在正在做的是这样存储它们: do i=1,noct do j=1,noct read_in_some_vector() do k=1,ngem**2 do l=1,nvir**2 mat(l) = mat(l) *

我有两个矩阵,它们在子程序中生成,并在程序的不同部分中使用和更改。由于矩阵是6维的,并且非常大(100^6没有什么不寻常的),因此生成和传递例程不是一个选项。 我使用
form=unformatted,access='direct'

我现在正在做的是这样存储它们:

do i=1,noct
  do j=1,noct
    read_in_some_vector()
    do k=1,ngem**2
      do l=1,nvir**2
        mat(l) = mat(l) * some_vector(k) * some_mat(l,k)
      end do
    end do
    ij=j+(i-1)*noct
    write(unit=iunV,rec=ij) (mat(l),l=1,nvir**2)
  end do
end do
为了使用矩阵,我从文件中以记录方式读取它:

    iunC=open_mat_file(mat)

    do i = 1,noct
      do j = 1,noct
        ij=j+(i-1)*noct
          read(unit=iunC,rec=ij) (mat(l),l=1,nvir**2)

          ij = min(i,j) + intsum( max(i,j)-1)

          read_some_vector(vec,rec=ij)

          do_sth = do_sth + ddot(nvir**2,mat,1,vec,1)
      end do
    end do
目前,noct是一个小数字(与其他数字相比)。但是它会变成一个相当大的数字,所以矩阵的大小会爆炸。矩阵是(并且必须是)双精度的,因此一个矩阵的8Tb是可能的

矩阵不是稀疏的,它们都是严格反对称的

我能想到的是,要么直接在例程中生成所需的矩阵部件,要么用巨大的文件将硬盘弄得乱七八糟。 两者都会占用大量时间(计算或读/写)


有人能想出第三条路吗?还是一种优化的方法

您不能在模块中声明矩阵,然后在要修改/访问矩阵的子例程中使用模块中的矩阵吗?你能解释一下为什么你不想把矩阵直接传给例程吗?Fortran是通过引用传递的,所以参数有多大并不重要(如果这是您关心的问题)。正确的,通过例程传递不是问题,但显然在8TB时,您无法将整个内容存储在内存中。除了将计算结构化以尽可能减少i/o之外,我看不出您将如何得到这个问题的一般答案。正如@agentp所说,传递的问题是内存。那么,我想我得处理那些大文件了。I/O被尽可能地最小化,我想也许有一种方法我不知道,它比我现在做的更好地处理像这样的事情。啊,是的,我错过了8TB的声明。根据您需要做什么以及您可以访问哪些机器,这可能是mpi可以提供帮助的地方--您可以将矩阵分布在许多机器上,使您能够将本地部分保存在内存中。我建议您研究为此类工作构建的更复杂的dataio
hdf5
让我想起()您不能在模块中声明矩阵,然后在您想要修改/访问它的子例程中使用模块中的矩阵吗?你能解释一下为什么你不想把矩阵直接传给例程吗?Fortran是通过引用传递的,所以参数有多大并不重要(如果这是您关心的问题)。正确的,通过例程传递不是问题,但显然在8TB时,您无法将整个内容存储在内存中。除了将计算结构化以尽可能减少i/o之外,我看不出您将如何得到这个问题的一般答案。正如@agentp所说,传递的问题是内存。那么,我想我得处理那些大文件了。I/O被尽可能地最小化,我想也许有一种方法我不知道,它比我现在做的更好地处理像这样的事情。啊,是的,我错过了8TB的声明。根据您需要做什么以及您可以访问哪些机器,这可能是mpi可以提供帮助的地方--您可以将矩阵分布在许多机器上,使您能够将本地部分保存在内存中。我建议您研究为此类工作构建的更复杂的dataio<代码>hdf5在我脑海中浮现()