#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 )