在C中使用mpi.h,有4个处理器,每个处理器分配了8个元素的缓冲区(整数),以及6个元素的另一个数组(p)。 我以一种包含越来越多的数字序列的方式初始化每个处理器的每个p数组(处理器0有0,1,2,3,4,5;处理器2有6,7等等)。 现在我想使用MPI_Alltoallv在一个唯一的数组(缓冲区)中发送每个矩阵,但由于matric是4x6,我想向处理器0发送8个元素,向处理器1发送8个元素,向处理器2发送4个元素处理器3的4个元素。 所以我试着在我的代码中这样做,我链接:
但是它无法实现我想做的事情:它只是在缓冲区中接收一个4x4矩阵,忽略索引大于4的元素。
答案 0 :(得分:0)
根据alltoallv的specification:
sendcounts
整数数组等于指定要发送到每个处理器的元素数量的组大小
所以你应该为每个处理器设置不同的发送缓冲区 说
if (myid==0)
send[]=[6,0,0,0]
if(myid==1)
send[]=[2,4,0,0]
if(myid==2)
send[]=[0,4,2,0]
if(myid==1)
send[]=[0,0,2,4]
和相应的位移数组。
if (myid==0)
disp[]=[0,0,0,0]
if(myid==1)
disp[]=[0,2,0,0]
if(myid==2)
disp[]=[0,0,4,0]
if(myid==1)
disp[]=[0,0,0,2]
目前,您已将每个值设置为1,因此所有处理器从每个处理器获得1个值。因此总共有4个值。