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
Parallel processing MPI_BCAST()仅应用于基本组的一小部分_Parallel Processing_Fortran_Mpi_Fortran90 - Fatal编程技术网

Parallel processing MPI_BCAST()仅应用于基本组的一小部分

Parallel processing MPI_BCAST()仅应用于基本组的一小部分,parallel-processing,fortran,mpi,fortran90,Parallel Processing,Fortran,Mpi,Fortran90,我将8个处理器分为两组,每组平均包含4个处理器。我要求每个子组的根使用子例程“MPI_BCAST”与他们的下属进行一些通信 我遇到了一个问题:为了表示子组的根,我应该使用子组根与MPI_COMM_WORLD communicator对应的原始秩,还是使用新communicator表示的新秩 以下面的代码片段为例,我想要求p:0将数据发送给它的下属p:1、p:2和p:3,同样,我要求p:4将数据发送给p:5、p:6和p:7。为了达到这个目标,我想知道是否应该将第36行中的第四个参数指定为1,或者将

我将8个处理器分为两组,每组平均包含4个处理器。我要求每个子组的根使用子例程“MPI_BCAST”与他们的下属进行一些通信

我遇到了一个问题:为了表示子组的根,我应该使用子组根与MPI_COMM_WORLD communicator对应的原始秩,还是使用新communicator表示的新秩

以下面的代码片段为例,我想要求p:0将数据发送给它的下属p:1、p:2和p:3,同样,我要求p:4将数据发送给p:5、p:6和p:7。为了达到这个目标,我想知道是否应该将第36行中的第四个参数指定为1,或者将它们分别指定为0和4,条件是我所指的是哪一个子组的负责人

谢谢。 背风

MPI中的所有列组类型参数(原点、目标等)必须与通信器参数给定的列组位于同一通信器中。实际上,这意味着在创建一个新的通信器后,该通信器中的每个进程都必须调用MPI_Comm_rank和MPI_Comm_size来检索它在该通信器中的秩和总大小(当然,除非您可以通过代码中的其他方法推断出新的秩和大小)

另一方面,由于您正在将原始通信器拆分为两个不相交的通信器,我认为更容易实现这一点的方法是使用MPI_Comm_split,而不是像您所做的那样手动设置组。

所有列组类型参数(原点、目标等)MPI中的列组必须与communicator参数给定的列组位于同一个communicator中。实际上,这意味着在创建一个新的通信器后,该通信器中的每个进程都必须调用MPI_Comm_rank和MPI_Comm_size来检索它在该通信器中的秩和总大小(当然,除非您可以通过代码中的其他方法推断出新的秩和大小)


另一方面,由于您正在将原始通讯器拆分为两个不相交的通讯器,我认为更简单的方法是使用MPI_Comm_split,而不是像您所做的那样手动设置组。

谢谢您的回复。我没有使用MPI_Comm_split,而是选择使用这种替代方法,因为我的实际程序中处理器的划分不均匀。经过反复试验,我终于得到了想要的结果,将第36行中的第四个参数设置为0,这意味着并行协议自动将每个新子组根的秩指定为0,而不是1(这是一个错误)或0和4(一个与协议工作方式不一致的规范)。还可以使用模糊的
MPI\u Group\u translate\u ranks
将原始组中进程的排名转换为新组中的排名。当用户拆分通讯器时,如果不知道新的列组编号是什么,例如,如果所有列组都为拆分呼叫提供了相同的键,则此功能非常有用。谢谢您的回复。我没有使用MPI_Comm_split,而是选择使用这种替代方法,因为我的实际程序中处理器的划分不均匀。经过反复试验,我终于得到了想要的结果,将第36行中的第四个参数设置为0,这意味着并行协议自动将每个新子组根的秩指定为0,而不是1(这是一个错误)或0和4(一个与协议工作方式不一致的规范)。还可以使用模糊的
MPI\u Group\u translate\u ranks
将原始组中进程的排名转换为新组中的排名。当用户拆分通讯器且不知道新列组编号是什么时(例如,如果所有列组都向拆分调用提供了相同的键),此功能非常有用。
1  program main
2    include 'mpif.h'
3    integer :: ierr, irank, num_procs, base_group
4    integer :: nrow, ncol, irow, icol
5    integer :: dummy_group, dummy_comm, new_comm, new_rank
6    integer :: i, j, roster(4), data(4)
7    
8    call MPI_Init ( ierr )
9    call MPI_COMM_RANK( MPI_comm_world, irank, ierr )
10   call MPI_COMM_SIZE( MPI_comm_world, num_procs, ierr)
11   call MPI_COMM_GROUP( MPI_comm_world, base_group, ierr)
12   nrow = 4
13   ncol = 2
14   irow = mod( irank, nrow )  + 1
15   icol = irank/nrow + 1
16   
17   roster(1) = 0
18   do i = 2, nrow
19       roster(i) = roster(i-1) + 1        
20   enddo
21   
22   do i = 1, ncol
23    call MPI_GROUP_INCL( base_group, nrow, roster, dummy_group, ierr )
24    call MPI_COMM_CREATE( MPI_COMM_WORLD, dummy_group, dummy_comm, ierr ) 
25    if( icol == i ) new_comm = dummy_comm
26    forall( j=1:nrow ) roster(j) = roster(j) + nrow
27   enddo
28   
29   ! Here I want to initialize data for processors P:0 and P:4
30   if( irank == 0 ) data = 0
31   if( irank == 4 ) data = 4
32   
33   ! In the code below I want to require P:0 to send data to 
34   ! its subordinates P:1, P:2, and P:3. Similarly, I ask P:4 
35   ! to send out its data to P:5, P:6, P:7.
36   call MPI_BCAST( data, 4, MPI_INTEGER, 0, new_comm, ierr)
37   
38   call MPI_Finalize ( ierr ) 
39 end program