我有一个派生类型t_data
,它由三个数组组成:速度,位置和加速度
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关键字时,它可以编译并运行,但是由于所有线程都按顺序并一个接一个地执行写操作,因此我根本无法提高速度。
是否有办法使用三个线程并使它们并行地将每个数组的内容写入文件中的正确位置?