Обработка больших матриц в Fortran между несколькими подпрограммами

#matrix #fortran #fortran90

#матрица #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 — это небольшое число (по сравнению с другими). Но это изменится на довольно большое число, поэтому размер матриц увеличится. Матрицы имеют (и должны быть) двойную точность, поэтому 8 ТБ для одной матрицы — это область возможностей.

Матрицы не являются разреженными, и все они строго антисимметричны.

Что я могу придумать, так это либо генерировать необходимые матричные части непосредственно в подпрограммах, либо загромождать жесткие диски огромными файлами. И то, и другое потребовало бы много времени (вычисление или чтение / запись).

Кто-нибудь может придумать третий способ? Или способ оптимизировать это?

Комментарии:

1. Разве вы не можете объявить матрицы в модуле, а затем use матрицу из модуля в подпрограммах, где вы хотите изменить / получить к ней доступ? Не могли бы вы пояснить, почему вы не хотите передавать матрицы непосредственно в подпрограммы? Fortran передается по ссылке, поэтому на самом деле не имеет значения, насколько велик аргумент (если это вас беспокоит).

2. правильно, прохождение через подпрограммы не является проблемой, но, очевидно, при 8 ТБ вы не можете сохранить все это в памяти. Помимо структурирования ваших вычислений для минимизации ввода-вывода как можно лучше, я не вижу, как вы получите общий ответ на этот вопрос.

3. Проблема с передачей — это память, как сказал @agentp. Ну, я думаю, тогда мне придется иметь дело с большими файлами. Ввод-вывод максимально сведен к минимуму, я подумал, что, возможно, есть метод, о котором я просто не знал, который обрабатывает подобные вещи лучше, чем то, что я сейчас делаю

4. Ах да, я пропустил инструкцию 8TB. В зависимости от того, что вам нужно для обработки данных и к каким машинам у вас есть доступ, это может быть где-то, где mpi может помочь — вы можете распределить матрицу по многим машинам, что позволит вам хранить локальный раздел в памяти.

5. Я рекомендую вам изучить более сложный dataio, созданный для этого типа работы. hdf5 мне приходит в голову( support.hdfgroup.org/HDF5 )