如何创建具有无序位移数组的mpi_type_indexed

射线

我有一些数据要写入文件中的特定位置。每个职位都以数组的形式给我。目前,我通过使用mpi_file_write_at在特定位置写入每个变量来编写它们。位置既不是连续的也不是有序的,因此程序会在文件中来回移动。

DO I=1,SIZE(VALUES)
  POS=ALL_POS(I)
  VAL=VALUES(I)
  CALL MPI_FILE_WRITE_AT(FH,POS,VAL,1,MPI_REAL,MPI_STATUS_IGNORE,IERR)
END DO

但是我知道,推荐的具有良好性能的方法是使用文件视图和集体编写例程。因此,我认为解决方案将是创建一个mpi_type_indexed并将数组ALL_POS用作位移数组。然后使用此类型通过mpi_file_set_view描述文件。但是,当我这样做时,每次不对数组进行排序时,程序都会崩溃。

下面是一个重现我的问题的最小示例。该程序可以编译但存在段错误。如果将DISPLACEMENTS(3)的值更改为优于DISPLACEMENTS(2)的值,则程序将运行而不会出现任何问题。(对于某些低于DISPLACEMENTS(2)的值,例如99,有时似乎也可以使用)

那么是否可以创建具有无序位移数组的索引类型并将其用作视图?我在文档中找不到相反的说法。唯一的限制似乎在blocklenghts数组上,该数组只能是正整数。

  PROGRAM INDEXED
    USE MPI
    IMPLICIT NONE
    REAL :: A(0:15)
    INTEGER :: INDEXTYPE,FH,IERR
    DATA A /1.0,  2.0,  3.0,  4.0,  5.0,  6.0,  7.0,  8.0,
 &          9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0 /
    INTEGER(KIND=MPI_OFFSET_KIND) :: OFFSET

    CALL MPI_INIT(IERR)
    CALL CREATE_DATARES_TYPE(INDEXTYPE)

    CALL MPI_FILE_OPEN(MPI_COMM_WORLD, "TEST",
 &                     MPI_MODE_RDWR+MPI_MODE_CREATE,
 &                     MPI_INFO_NULL,FH,IERR)
    CALL MPI_CHECK_CALL(IERR)

    OFFSET=0
    CALL MPI_FILE_SET_VIEW(FH, OFFSET,MPI_REAL,
 &                         INDEXTYPE,'NATIVE',
 &                         MPI_INFO_NULL, IERR)
    CALL MPI_CHECK_CALL(IERR)

    CALL MPI_FILE_WRITE(FH,A,SIZE(A),MPI_REAL,
 &                      MPI_STATUS_IGNORE,IERR)
    CALL MPI_CHECK_CALL(IERR)

    CALL MPI_FILE_CLOSE(FH,IERR)
    CALL MPI_CHECK_CALL(IERR)

    CALL MPI_FINALIZE(IERR) 
  END PROGRAM INDEXED

  SUBROUTINE CREATE_DATARES_TYPE(DATARES_TYPE)
    USE MPI
    IMPLICIT NONE
    INTEGER, INTENT(OUT) :: DATARES_TYPE
    INTEGER :: IERR, N
    INTEGER, ALLOCATABLE :: BLOCKLENS(:), DISPLACEMENTS(:)
    N=3
    ALLOCATE(BLOCKLENS(N))
    ALLOCATE(DISPLACEMENTS(N))
    BLOCKLENS(1) = 1
    BLOCKLENS(2) = 3
    BLOCKLENS(1) = 1
    DISPLACEMENTS(1) = 2
    DISPLACEMENTS(2) = 100
    DISPLACEMENTS(3) = 51

    CALL MPI_TYPE_INDEXED(N, BLOCKLENS, DISPLACEMENTS,
 &                        MPI_REAL, DATARES_TYPE, IERR)
    CALL MPI_CHECK_CALL(IERR)

    CALL MPI_TYPE_COMMIT(DATARES_TYPE, IERR)
    CALL MPI_CHECK_CALL(IERR)

    DEALLOCATE(BLOCKLENS)
    DEALLOCATE(DISPLACEMENTS)
  END SUBROUTINE

  SUBROUTINE MPI_CHECK_CALL(IERR)
    USE MPI
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: IERR
    INTEGER :: NERR, RESULTLEN
    CHARACTER(LEN=MPI_MAX_ERROR_STRING) :: SERR
    IF(IERR /= MPI_SUCCESS) THEN
      CALL MPI_ERROR_STRING(IERR,SERR,RESULTLEN,NERR)
      WRITE(*,*)SERR
      CALL BACKTRACE
    END IF
  END SUBROUTINE
吉尔·古埃拉德(Gilles Gouaillardet)

派生的数据类型构造中存在错误。

它应该是

BLOCKLENS(1) = 1
BLOCKLENS(2) = 3
BLOCKLENS(3) = 1

代替

BLOCKLENS(1) = 1
BLOCKLENS(2) = 3
BLOCKLENS(1) = 1

然后,该测试对于ompioromio314组件都可以正常工作

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

具有无序列表的Flexbox

来自分类Dev

如何在熊猫数据框中将具有无序索引的行移动到第一行?

来自分类Java

Java nativeQuery:具有AliasToEntityMapResultTransformer的ResultSet在地图中具有无序的列

来自分类Dev

具有无符号值的位移位给出带符号的结果

来自分类Dev

JavaScript:如何从数组创建无序列表?

来自分类Mysql

为用户创建具有无限空间的组

来自分类Java

具有无限队列的ThreadPoolExecutor不创建新线程

来自分类Dev

C ++ MPI创建并发送具有字段char [16]和整数的结构数组

来自分类Java

如何启动具有无限内存的JVM?

来自分类Dev

具有无限参数的C#方法或具有数组或列表的方法?

来自分类Dev

如何在PostgreSQL中创建具有范围的数组

来自分类Dev

如何创建具有教义关系,joincolumn和ManyToOne的数组?

来自分类Dev

如何在Swift中创建具有递增值的数组?

来自分类Dev

如何访问具有动态创建名称的javascript数组?

来自分类Dev

如何创建具有预定范数和均值的数组?

来自分类Java

Java中是否有无序的,可重复的Collection类?

来自分类Dev

有无序集合的Python数据类型吗?

来自分类Dev

创建具有其他属性的数组

来自分类Dev

从具有重复值的数组创建对象

来自分类Java

具有无限参数的Java方法

来自分类Dev

该开关盒如何具有无法访问的代码?

来自分类Dev

如何使用Alamofire连接本地主机(具有无效证书)?

来自分类Java

如何编写具有无效返回类型的函数的单元测试

来自分类Dev

如何构建具有无限循环的函数的后支配树?

来自分类Java

如何在具有无效方法的类中使用spring @autowired注释?

来自分类Dev

如何专门化具有无类型约束的特征?

来自分类Dev

如何在Ruby on Rails中使用回形针制作具有无限图像的模型?

来自分类Dev

如何使用猫鼬填充具有无限嵌套级别的文档

来自分类Python

如何将numpy数组拆分为固定大小的块(有无重叠)?

TOP 榜单

热门标签

归档