如何创建具有无序位移数组的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 条评论
登录 后参与评论

相关文章

具有无序列表的Flexbox

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

如何将具有无序列表的字符串解析为通用字符串列表?

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

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

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

使用 NSHTMLTextDocumentType 属性的 UITextView 中具有无序列表的重复项目符号

如何创建具有多态数据的数组?

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

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

创建具有无限列表的元素生成器

是否可以创建具有无限无限滚动的网页?

如何从文本文件中删除所有无序行?

如何将所有无序列表浮动到下拉div的左侧?

如何在Center bootstrap中使div带有无序列表?

从数组中删除具有无限值的行

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

如何创建具有 2 个数组的对象数组?

如何根据对象数组在反应中创建无序列表?

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

HashTable具有无限深度。为什么?如何避免?

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

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

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

如何创建具有公共属性值的对象数组

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

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

如何创建具有可用时隙的对象数组

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