我有几个在子程序中生成的矩阵,在程序的不同部分使用和更改。由于矩阵是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是可能的范围。
矩阵并不稀疏,它们都是严格反对称的。
我能想到的是直接在例程中生成所需的矩阵部分,或者用大文件混乱硬盘。 两者都会耗费大量时间(计算或读/写)。
有人能想到第三种方式吗?还是一种优化方法?