У меня есть производный тип t_data
, состоящий из трех массивов: Velocity, Position и Acceleration
type :: t_data
real(kind=REAL64), allocatable :: velocity(:)
real(kind=REAL64), allocatable :: position(:)
real(kind=REAL64), allocatable :: acceleration(:)
end type t_data
Я выделяю эти массивы и заполняю их информацией.В какой-то момент мне нужно распечатать эту информацию в формате ASCII VTK, и я делаю следующее:
open(nfil,file=trim(fname)//'.vtk')
write(nfil, '(a)') "Velocity"//" 3 "//trim(str(n_particle))//" double"
do j=1, (n_particle)
write(fileid, '(ES25.16E3, a, ES25.16E3, a, ES25.16E3, a)') (data%velocity(j+(j-1)*2)), " ", (data%velocity(j+(j-1)*2+1)), " ", (data%velocity(j+(j-1)*2+2)), " "
end do
write(nfil, '(a)') "Position"//" 3 "//trim(str(n_particle))//" double"
do j=1, (n_particle)
write(fileid, '(ES25.16E3, a, ES25.16E3, a, ES25.16E3, a)') (data%position(j+(j-1)*2)), " ", (data% position(j+(j-1)*2+1)), " ", (data% position(j+(j-1)*2+2)), " "
end do
write(nfil, '(a)') "Acceleration"//" 3 "//trim(str(n_particle))//" double"
do j=1, (n_particle)
write(fileid, '(ES25.16E3, a, ES25.16E3, a, ES25.16E3, a)') (data%acceleration(j+(j-1)*2)), " ", (data% acceleration(j+(j-1)*2+1)), " ", (data% acceleration(j+(j-1)*2+2)), " "
end do
close(nfil)
Мой вопрос: есть ли способ ускорить процедуру записи файла с помощью OpenMP?
Я пытался использовать OpenMP для ускорения циклов DO
на j
, но мне нужно упорядочить вывод.Поэтому, когда я использовал ключевое слово ORDERED
OpenMP, оно компилируется и запускается, но у меня нет ускорения вообще, поскольку все потоки выполняют операцию записи по порядку и по одному.
Есть ли способ, напримериспользовать три потока и заставить их записывать содержимое каждого массива в нужном месте файла параллельно?