c - MPI_Scatter 用法

标签 c mpi

我正在尝试修改我的程序,以便代码看起来更好。现在我正在使用 MPI_Send 和 MPI_Recv,但我正在尝试使其与 MPI_Scatter 一起使用。我有一个名为 All_vals 的数组,我尝试将 Sub_arr_len 等份发送到每个从站。 因此,在我首先找到应该发送给每个从站的值的数量后,我必须发送和接收值的数量,然后发送和接收值。我正在尝试将这些发送/接收更改为 MPI_Scatter 并考虑值的数量无法分成相等部分的情况,就像我有 20 个数字,但我有 3 个进程时一样。所以从机应该有 20/3=6 个值,但主机应该有其余的 20-2*6=8。
这是我要编辑的部分:

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);
}

我正在尝试制作分散的东西,但我做错了一些事情,所以如果有人帮助我构建它,我会很高兴。

最佳答案

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

  1. 在根上使用MPI_IN_PLACE作为recvbuf,这样根就不会向自己发送任何内容。将其与从根分散原始发送缓冲区的尾部相结合,使得该“尾部”具有可被进程数整除的多个元素。例如。 20 个元素分散 &All_vals[2] 总共有 18 个元素,每个元素 6 个(再次包括根)。然后根可以使用 All_vals[0-7]。
  2. 用一些不执行任何操作的元素填充发送缓冲区,使其可被进程数整除。
  3. 使用MPI_Scatterv向每个等级发送不相等数量的元素。 Here is a good example如何正确设置发送计数和位移

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

关于c - MPI_Scatter 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37214798/

相关文章:

c - 如何在linux中用c写一个http1.0的代理服务器?

c - 为函数中的结构分配内存,该函数返回指向结构的指针

c - MPI RMA 操作 : Ordering between MPI_Win_free and local load

c - MPI_Finalize 在动态生成的进程中挂起

c - 与单独使用 OpenMP 相比,混合 OpenMP/MPI 的运行时间更慢

ios - iOS 应用程序中的 C 样式字符串被损坏

c - scanf函数吸收01

C 中的自定义错误

C-MPI 发送创建的带有字符数组的 typedef 结构

c - 打开 MPI Waitall() 段错误