【发布时间】:2016-09-09 22:24:38
【问题描述】:
我正在尝试修改我的程序,以便代码看起来更好。现在我正在使用 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);
}
我正在尝试制作分散的东西,但我做错了,所以如果有人帮助我构建它,我会很高兴。
【问题讨论】: