我正在重写一个使用MPI在一个方向上并行化的数值模拟代码.到目前为止,包含数据的数组由主MPI进程保存,这意味着将数据从所有MPI进程传输到一个并分配大型数组来存储整个数据.它不是非常有效也不是优雅,并且是大分辨率的问题.
因此,我尝试使用MPI-IO直接从分布式阵列中写入文件.我的一个约束是写入文件需要遵守fortran"未格式化"格式(即每个字段之前和之后的4个字节整数,表示其大小).
我写了一个简单的测试程序,当我只将一个分布式数组写入文件时,它就可以工作.但是,当我写几个数组时,文件的总大小是错误的,当与同等的fortran'unformatted'文件进行比较时,文件是不同的.
以下是示例代码:
module arrays_dim
implicit none
INTEGER, PARAMETER :: dp = kind(0.d0)
integer, parameter :: imax = 500
integer, parameter :: jmax = 50
integer, parameter :: kmax = 10
end module arrays_dim
module mpi_vars
use mpi
implicit none
integer, save :: ierr, myID, numprocs
integer, save :: i_start, i_end, i_mean, i_loc
integer, save :: subArray, fileH
integer(MPI_OFFSET_KIND), save :: offset, currPos
end module mpi_vars
program test
use mpi
use arrays_dim
use mpi_vars
real(dp), dimension(0:imax,0:jmax+1,0:kmax+1) :: v, w …Run Code Online (Sandbox Code Playgroud) 我开始使用MPI-IO并试图写一个我想用它做的事情的一个非常简单的例子; 然而,即使它是一个简单的代码,我从这里和那里读到的例子中获得了一些灵感,我得到了一个我不明白的分段错误.
这段代码的逻辑非常简单:每个线程都将处理一个本地数组,该数组是我想写的全局数组的一部分.我使用MPI_Type_Create_Subarray这样做创建一个子阵列类型.然后我只是打开文件,设置视图并尝试写入数据.我在这期间得到了分段错误MPI_File_Write_All.
这是代码:
program test
implicit none
include "mpif.h"
integer :: myrank, nproc, fhandle, ierr
integer :: xpos, ypos
integer, parameter :: loc_x=10, loc_y=10
integer :: loc_dim
integer :: nx=2, ny=2
real(8), dimension(loc_x, loc_y) :: data
integer :: written_arr
integer, dimension(2) :: wa_size, wa_subsize, wa_start
call MPI_Init(ierr)
call MPI_Comm_Rank(MPI_COMM_WORLD, myrank, ierr)
call MPI_Comm_Size(MPI_COMM_WORLD, nproc, ierr)
xpos = mod(myrank, nx)
ypos = mod(myrank/nx, ny)
data = myrank
loc_dim = loc_x*loc_y
wa_size = (/ nx*loc_x, ny*loc_y /) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OVERFLOW-PLOT3D q文件格式(在此定义:http ://overflow.larc.nasa.gov/files/2014/06/Appendix_A.pdf)保存一个解决方案。对于单个网格,基本上是
READ(1) NGRID
READ(1) JD,KD,LD,NQ,NQC
READ(1) REFMACH,ALPHA,REY,TIME,GAMINF,BETA,TINF, &
IGAM,HTINF,HT1,HT2,RGAS1,RGAS2, &
FSMACH,TVREF,DTVREF
READ(1) ((((Q(J,K,L,N),J=1,JD),K=1,KD),L=1,LD),N=1,NQ)
Run Code Online (Sandbox Code Playgroud)
所有变量都是双精度数字,但NGRID,JD,KD,LD,NQ,NQC和IGAM是整数。我需要使用MPI-IO导出解决方案。如果我仅用一个处理器做一个非常简单的示例,以下代码将不起作用,但是我不明白为什么。
call mpi_file_open( mpi_comm_world, fileOut, mpi_mode_wronly + mpi_mode_create, &
mpi_info_null, mpi_fh, ierr )
offset = 0
call mpi_file_seek( mpi_fh, offset, mpi_seek_set, ierr )
call mpi_file_write( mpi_fh, (/NGRID,JD,KD,LD,NQ,NQC/), 6, mpi_integer, mstat, ierr )
call mpi_file_write( mpi_fh, (/REFMACH,ALPHA,REY,TIME,GAMINF,BETA,TINF/), 7, mpi_double_precision, mstat, ierr )
call mpi_file_write( mpi_fh, IGAM, 1, mpi_integer, mstat, ierr )
call mpi_file_write( mpi_fh, (/HTINF,HT1,HT2,RGAS1,RGAS2,FSMACH,TVREF,DTVREF/), 8, mpi_double_precision, mstat, ierr )
call mpi_file_write( mpi_fh, Q, NQ*JD*KD*LD, …Run Code Online (Sandbox Code Playgroud) 我有2处理器(这是一个例子),我希望这些2处理器写入文件。我希望他们写在文件的末尾,但不是混合模式,就像这样:
[file content]
proc0
proc1
proc0
proc1
proc0
proc1
(and so on..)
Run Code Online (Sandbox Code Playgroud)
我想让他们按照这种模式写:
[file content]
proc0
proc0
proc0
proc1
proc1
proc1
(and so on..)
Run Code Online (Sandbox Code Playgroud)
是否可以?如果是这样,要使用的设置是什么?
我有一个使用MPI的C++程序,我希望每个进程(最多32个)写入文件.我正在使用一个小的测试数据集,其中包含100个双重均匀分布在整个过程中的数据集.到目前为止,输出的格式如下:
data_sink.Write(&d_p[i], 1, MPI::DOUBLE);
data_sink.Write(&space, 1, MPI::CHAR);
data_sink.Write(&r_p[j], 1, MPI::DOUBLE);
data_sink.Write(&new_line, 1, MPI::CHAR);
Run Code Online (Sandbox Code Playgroud)
格式化此输出的最佳方法是什么,以便GNUPlot可以直接解释结果?