【问题标题】:MPI send derived data type with pointer in Fortran 90MPI 在 Fortran 90 中使用指针发送派生数据类型
【发布时间】:2013-09-20 18:08:29
【问题描述】:

我想发送一个用户定义的数据类型为:

TYPE CELL
    INTEGER :: NUM
    TYPE(CELL), POINTER :: NEXT => NULL()
END TYPE CELL

TYPE CELLLIST
    INTEGER :: NBCELL
    TYPE(CELL), POINTER :: BEGIN => NULL()
END TYPE CELLLIST

而MPI要发送的变量定义为:

TYPE(CELLLIST) :: _CELLLIST

在这个变量中,_CELLIST%NBCELL表示链表的长度,CELL类型的指针指向链表的头部。

我想使用 MPI_send 和 MPI_recv 通过 MPI 传输单元列表。该怎么做?

【问题讨论】:

    标签: mpi fortran90


    【解决方案1】:

    从一个 MPI 进程向另一个进程发送指针是没有意义的。

    问题在于它们,指针,是特定于进程的。将指针视为存储其目标的内存地址是一个合理的类比。该内存地址不可移植,没有一个进程的地址空间中的地址与另一个进程的地址空间中的地址相同的概念。

    您必须解开_CELLLIST 中的指针链,发送CELLS,然后在目标进程上重建指针链。

    我想您可能会将CELLS 打包到一个数组中进行传输。或者您可以一次发送一个CELL,因为接收进程将按照接收包含CELLs 的消息的顺序重建动态数据结构。

    【讨论】:

    • 非常感谢您的建议。我将创建一个数组来探索 celllist 并发送数组而不是用户类型变量 _celllist。
    • 是的,指针信息变得没用了。拒绝打包或一次发送:改为签入MPI_Type_hindexed,这类似于索引类型,但基于绝对地址。
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 2012-12-21
    • 2015-01-21
    • 1970-01-01
    • 2012-11-27
    • 2019-01-20
    • 2013-08-13
    • 2012-02-03
    相关资源
    最近更新 更多