Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran中具有不同窗口大小的MPI共享内存_Fortran_Mpi_Shared Memory - Fatal编程技术网

Fortran中具有不同窗口大小的MPI共享内存

Fortran中具有不同窗口大小的MPI共享内存,fortran,mpi,shared-memory,Fortran,Mpi,Shared Memory,我正试图采用我的代码来利用MPI共享内存 为了使事情尽可能简单,假设我只有两个内核。 Core A需要Core b的大小为_b的数组,Core b需要Core A的大小为_A的数组 在core A上执行时,我可以执行以下操作吗? call MPI_WIN_ALLOCATE_SHARED(size_a_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_a, mpierr) call C_F_pointer(ptr, fptr, (/s

我正试图采用我的代码来利用MPI共享内存

为了使事情尽可能简单,假设我只有两个内核。 Core A需要Core b的大小为_b的数组,Core b需要Core A的大小为_A的数组

在core A上执行时,我可以执行以下操作吗?

 call MPI_WIN_ALLOCATE_SHARED(size_a_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_a, mpierr)
 call C_F_pointer(ptr, fptr, (/size_a/))
对于核心B

 call MPI_WIN_ALLOCATE_SHARED(size_b_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_b, mpierr)
 call C_F_pointer(ptr, fptrb, (/size_b/))
现在假设我随后分别通过MPI_发送/接收win_a和win_b与core b和core a进行通信。现在的逻辑是按照以下方式进行这两个查询

核心A:

        call MPI_WIN_SHARED_QUERY( win_b
 &                               , rank_of_core_B
 &                               , size_b
 &                               , disp_unit
 &                               , ptr_buf
 &                               , mpierr )
        call C_F_pointer(ptr_buf, fptr_query_A, (/size_b/))
对于核心B,则反之亦然

 call MPI_WIN_ALLOCATE_SHARED(size_b_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_b, mpierr)
 call C_F_pointer(ptr, fptrb, (/size_b/))
假设我知道在核心B中,我的指针
fptrb
指向一个数组,即

  fptrb = GIVEN_ARRAY_OF_SIZEB
例如,我是否能够通过访问
fptr\u query\u a
来检索核心a中的内存

   fptr_recv = fptr_query_A
其中,
fptr\u recv
是在核心a中声明的指针,其类型与
fptr\u query\u a

我问这个问题是因为手册中不清楚例程
MPI\u WIN\u ALLOCATE\u SHARED
,除了是通信shm的集合外,所有共享内存核是否必须具有相同的WIN和大小

请在回答时,我想我的一些困惑源于以下几点

1) 调用
MPI\u WIN\u ALLOCATE\u SHARED
时,我是否将本地内存从调用处理器分配到共享环境,即共享通信组

1.a)如果是,则表示每个处理器声明其想要共享的内容,并从接收器(想要访问共享内存的处理器)的审查点,调用
MPI\u WIN\u shared\u QUERY
,以了解处理器在内存中存储其可共享数据的位置

最后,如果后两点总体有效,我不确定我是否理解如何执行
MPI\u WIN\u SHARED\u查询
调用

我的理解是
MPI\u-WIN\u共享\u查询(WIN、rank、size、disp\u unit、baseptr)
WIN
是我们想要检索数据的任何核心的窗口,大小和排名也是如此。
那么本质上,这是否意味着我总是需要传达胜利和规模,以便作出决定

与此同时,我自己也能回答这个问题,答案是

1) 调用MPI_WIN_ALLOCATE_SHARED时,我将本地内存从调用处理器分配到共享环境,即共享通信组

是,每个列组将分配一个单独的缓冲区,其大小由共享通信器组中的所有其他列组访问。即使rank不需要分配共享缓冲区,它也应该调用大小为零的函数

如果是,则意味着每个处理器声明它想要共享的内容,并从接收方(想要访问共享内存的处理器)的审查点,调用MPI_WIN_shared_查询,以了解处理器在内存中存储其可共享数据的位置

这就是我的理解

我的理解是MPI_WIN_SHARED_QUERY(WIN、rank、size、disp_unit、baseptr),WIN是我们想要检索数据的任何核心的窗口,大小和等级也是如此。那么本质上,这是否意味着我总是需要传达胜利和规模,以便作出决定

由于所有MPI列组都必须调用
MPI\u WIN\u ALLOCATE\u SHARED
,因此每个列组都有自己的MPI句柄
WIN
。因此,您可以使用此句柄调用
MPI\u WIN\u SHARED\u QUERY
,以获取指向由MPI秩
秩分配的共享缓冲区的指针。此函数还查询列组共享内存的大小