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

时间:2016-10-12 07:31:57

标签: 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) * 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是可能的范围。

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

我能想到的是直接在例程中生成所需的矩阵部分,或者用大文件混乱硬盘。 两者都会耗费大量时间(计算或读/写)。

有人能想到第三种方式吗?还是一种优化方法?

0 个答案:

没有答案