Ускорьте процедуру записи файлов в Fortran с помощью OpenMP - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть производный тип 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, оно компилируется и запускается, но у меня нет ускорения вообще, поскольку все потоки выполняют операцию записи по порядку и по одному.

Есть ли способ, напримериспользовать три потока и заставить их записывать содержимое каждого массива в нужном месте файла параллельно?

...