首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI_Scatter使用

MPI_Scatter使用
EN

Stack Overflow用户
提问于 2016-05-13 16:15:27
回答 1查看 815关注 0票数 0

我正在试图修改我的程序,以便代码看起来更好。现在我正在使用MPI_Send和MPI_Recv,但我正在尝试使它与MPI_Scatter一起工作。我有一个名为All_vals的数组,我试图向每个奴隶发送Sub_arr_len相等的部分。因此,在我首先找到应该发送给每个奴隶的值的数量之后,我必须发送和接收值的数量,然后发送和接收值。我试图将这些发送/recv更改为MPI_Scatter,并考虑这样一种情况,即值的数目不能被分成相等的部分,比如当我有20个数字时,但是我有3个进程。所以奴隶应该有20/3=6的值,但是主人应该有其余的20-2*6=8。

下面是我要编辑的部分:

代码语言:javascript
复制
int master(int argc, char **argv){
...
for (i=0; i<ntasks; i++)
    {
    Sub_arr_len[i]=Num_vals/ntasks;      //Finding the number of values I should send to every process             
    printf("\n\nIn range %d there are %d\n\n",i,Sub_arr_len[i]);
    }

    for(i=1;i<ntasks;i++) {
        Sub_len = Sub_arr_len[i];
        MPI_Isend(&Sub_len,1, MPI_INTEGER, i, i, MPI_COMM_WORLD, &request);
        MPI_Wait(&request, &status);
        Sub_arr_start += Sub_arr_len[i-1];
        printf("\r\nSub_arr_start = %d ",Sub_arr_start);
        MPI_Isend(&All_vals[Sub_arr_start],Sub_len, MPI_INTEGER, i, i, MPI_COMM_WORLD, &request);
        MPI_Wait(&request, &status);
    }
...
}  


int slave(){
MPI_Irecv(&Sub_arr_len, 1, MPI_INTEGER, 0, myrank, MPI_COMM_WORLD, &request);
    MPI_Wait(&request,&status);
    printf("\r\nSLAVE:Sub_arr_len = %d\n\n",Sub_arr_len);
    All_vals = (int*) malloc(Sub_arr_len * sizeof(MPI_INTEGER));

    MPI_Irecv(&All_vals[0], Sub_arr_len, MPI_INTEGER, 0, myrank, MPI_COMM_WORLD, &request);
    MPI_Wait(&request,&status);
}

我试图制造分散的东西,但是我做错了,所以如果有人帮我建造它,我会很高兴的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-13 18:19:59

使用MPI_Scatter时,所涉及的每个级别都必须接收相同数量的元素,包括根。通常,根进程是分散操作的正常参与者,并“接收”自己的块。这意味着您还需要为根进程指定一个接收缓冲区。基本上,您有以下选项:

  1. 在根目录上使用MPI_IN_PLACE作为recvbuf,这样根就不会向自己发送任何东西。将它与将原始发送缓冲区的尾部从根中分离出来结合起来,这样这个“尾”就有许多可以被进程数整除的元素。例如,对于20个元素,分散&All_vals[2]共有18个元素,每个元素6个(再次包含根元素)。然后根可以使用All_vals0-7。
  2. 用几个不做任何事情的元素填充sendbuffer,这样它就可以被进程数整除。
  3. 使用MPI_Scatterv向每个级别发送不等数量的元素。下面是一个很好的例子如何正确设置发送计数和移位

最后一种选择有一些明显的优势。它在进程之间创建了最少的负载不平衡,并允许所有进程使用相同的代码。如果适用的话,第二个选项非常简单,并且仍然有很好的负载平衡。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37214798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档