标签: mpi-io

用MPI IO写几个分布式数组

我正在重写一个使用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)

fortran mpi fortran90 mpi-io

5
推荐指数
1
解决办法
426
查看次数

MPI-IO:写子阵列

我开始使用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)

fortran mpi mpi-io

4
推荐指数
1
解决办法
1667
查看次数

使用MPI-IO编写Fortran格式的文件

我正在尝试使用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)

io fortran mpi mpi-io

2
推荐指数
1
解决办法
1521
查看次数

是否可以在同一个文件中以指定的方式在文件末尾使用多个处理器进行写入?

我有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 mpi-io

2
推荐指数
1
解决办法
2362
查看次数

GNUPlot的MPI IO格式

我有一个使用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可以直接解释结果?

c++ gnuplot mpi mpi-io

1
推荐指数
1
解决办法
438
查看次数

标签 统计

mpi ×5

mpi-io ×5

fortran ×3

c++ ×1

fortran90 ×1

gnuplot ×1

io ×1