Parallel processing 并行计算二维阵列的直方图
我有一个9x9 2D阵列。我用随机数填充数组,然后将数组的前3行发送到秩为1的处理,将数组的第2 3行发送到秩为2的处理,最后将数组的第3 3 3行发送到秩为3的处理。我的意思是每个进程将得到3行数组 进程接收到主数组的相应行后,它将计算从根进程接收到的3行的直方图。然后将直方图返回到根进程。所有3个流程都将完成此任务 问题是rank=3的进程无法接收根进程发送的行。我不明白为什么? 如果有人看一下我的代码并找到解决我问题的方法,我将非常感激 提前谢谢 我正在使用MPI和c。这是我的密码Parallel processing 并行计算二维阵列的直方图,parallel-processing,mpi,Parallel Processing,Mpi,我有一个9x9 2D阵列。我用随机数填充数组,然后将数组的前3行发送到秩为1的处理,将数组的第2 3行发送到秩为2的处理,最后将数组的第3 3 3行发送到秩为3的处理。我的意思是每个进程将得到3行数组 进程接收到主数组的相应行后,它将计算从根进程接收到的3行的直方图。然后将直方图返回到根进程。所有3个流程都将完成此任务 问题是rank=3的进程无法接收根进程发送的行。我不明白为什么? 如果有人看一下我的代码并找到解决我问题的方法,我将非常感激 提前谢谢 我正在使用MPI和c。这是我的密码 #in
#include "mpi.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
int main(int argc, char* argv[])
{
int my_rank;
int p;
int i;
int k;
int m;
int tag=0;
int array[9][9];
int sub_array[3][9]; // 3 rows and 9 columns for each process
int c[20];
MPI_Status status;
// MPI_Datatype MPI_INT;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
MPI_Comm_size(MPI_COMM_WORLD,&p);
// MPI_Type_contiguous(9,MPI_INT,&MPI_INT);
// MPI_Type_commit(&MPI_INT);
srand(time(NULL));
for(i=0; i<20 ; i++)
c[i] = 0;
if(my_rank == 0)
{
for(i=0; i<9 ; i++)
for(k=0; k<9 ; k++)
{
array[i][k] = rand()%20+1; // fill the array with random numbers from 1 to 20;
}
for(i=0; i<9 ; i++)
{
printf("\n");
for(k=0; k<9 ; k++)
{
printf("%d ",array[i][k]); // prints the array here
}
}
// here each process will be sent 3 rows of the array;
for(i=0; i<3 ; i++)
MPI_Send(&(array[i][0]),9,MPI_INT,1,tag,MPI_COMM_WORLD); // 1st 3 rows of the array are sent to process 1
for(i=3; i<6 ; i++)
MPI_Send(&(array[i][0]),9,MPI_INT,2,tag,MPI_COMM_WORLD); // 2nd 3 rows of the array are sent to process 2
for(i=6; i<9 ; i++)
MPI_Send(&(array[i][0]),9,MPI_INT,3,tag,MPI_COMM_WORLD); // 3rd 3 rows of the array are sent to process 3
for (i=1;i<=3;i++)
MPI_Recv(&sub_array, 9, MPI_INT,i, 0, MPI_COMM_WORLD, &status); // root receives the subarrays from each node;
}
if(my_rank != 0)
{
// for the process with rank=1;
for(i=0; i<3 ; i++)
{
MPI_Recv(&(sub_array[i][0]),9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
for(k=0; k<9 ; k++)
{
for(m=0 ; m<20 ; m++) // here the process with rank=1 calculates the histogram
{
if(sub_array[i][k] == m)
c[m]++;
}
}
}
// for the process with rank=2
for(i=3; i<6 ; i++)
{
MPI_Recv(&(sub_array[i][0]),9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
for(k=0; k<9 ; k++)
{
for(m=0 ; m<20 ; m++) // here the process with rank=2 calculates the histogram
{
if(sub_array[i][k] == m)
c[m]++;
}
}
}
// for the process with rank=3
for(i=6; i<9 ; i++)
{
MPI_Recv(&(sub_array[i][0]),9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
for(k=0; k<9 ; k++)
{
for(m=0 ; m<20 ; m++) // here the process with rank=3 calculates the histogram
{
if(sub_array[i][k] == m)
c[m]++;
}
}
}
}
// here the histogram must be printed.
for(k=0; k<20 ; k++)
{
printf("\n");
printf("%2d : ",k);
for(i=0 ; i<c[k] ; i++)
{
printf("=");
}
}
MPI_Finalize();
return 0;
}
#包括“mpi.h”
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int我的_等级;
INTP;
int i;
int k;
int m;
int tag=0;
整数数组[9][9];
int sub_数组[3][9];//每个进程3行9列
INTC[20];
MPI_状态;
//MPI_数据类型MPI_INT;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和我的通信等级);
MPI通信大小(MPI通信世界和p);
//MPI_类型_连续(9、MPI_INT和MPI_INT);
//MPI_类型_提交(&MPI_INT);
srand(时间(空));
对于以下循环中的(i=0;i)
// for the process with rank=3
for(i=6; i<9 ; i++)
{
// snip
for(i=0; i<3 ; i++) // notice the reuse of the var i here!
//snip
}
//用于秩为3的进程
对于(i=6;i#包括
#包括
#包括
int main(int argc,char*argv)
{
int我的_等级;
INTP;
int数组[9];
int localArray[3];
int i;
int k;
int m;
INTA[9][9];
int b[10][50];
INTC[20];
MPI_状态;
MPI_数据类型my_类型;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和我的通信等级);
MPI通信大小(MPI通信世界和p);
MPI类型(9、MPI类型和my类型);
MPI类型提交(&my类型);
srand(时间(空));
对于(i=0;我按照你说的编辑了我的代码,但仍然不起作用。顺便说一下,谢谢。
#include <stdio.h>
#include <conio.h>
#include <time.h>
int main(int argc, char* argv)
{
int my_rank;
int p;
int Array[9];
int localArray[3];
int i;
int k;
int m;
int a[9][9];
int b[10][50];
int c[20];
MPI_Status status;
MPI_Datatype my_type;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
MPI_Comm_size(MPI_COMM_WORLD,&p);
MPI_Type_contiguous(9,MPI_INT,&my_type);
MPI_Type_commit(&my_type);
srand(time(NULL));
for(i=0; i<20 ; i++)
c[i] = 0;
if(my_rank == 0)
{
for(i=0; i<9 ; i++)
for(k=0; k<9 ; k++)
{
a[i][k] = rand()%20;
}
for(i=0; i<9 ; i++)
{
printf("\n");
for(k=0; k<9 ; k++)
{
printf("%d ",a[i][k]);
}
}
for(i=0; i<3 ; i++)
MPI_Send(&(a[i][0]),1,my_type,1,0,MPI_COMM_WORLD);
for(i=3; i<6 ; i++)
MPI_Send(&(a[i][0]),1,my_type,2,0,MPI_COMM_WORLD);
for(i=6; i<9 ; i++)
MPI_Send(&(a[i][0]),1,my_type,3,0,MPI_COMM_WORLD);
}
if(my_rank != 0)
{
for(i=0; i<3 ; i++)
{
MPI_Recv(&(b[i][0]),1,my_type,0,0,MPI_COMM_WORLD,&status);
}
for(i=0; i<3 ; i++)
for(k=0; k<9 ; k++)
{
for(m=0 ; m<20 ; m++)
{
if(b[i][k] == m)
c[m]++;
}
}
printf("\n \n ");
for(m=0 ; m<20 ; m++)
printf("%d ",c[m]);
for(i=3; i<6 ; i++)
{
MPI_Recv(&(b[i][0]),1,my_type,0,0,MPI_COMM_WORLD,&status);
}
for(i=0; i<3 ; i++)
for(k=0; k<9 ; k++)
{
for(m=0 ; m<20 ; m++)
{
if(b[i][k] == m)
c[m]++;
}
}
printf("\n \n ");
for(m=0 ; m<20 ; m++)
printf("%d ",c[m]);
for(i=0; i<3 ; i++)
{
MPI_Recv(&(b[i][0]),1,my_type,0,0,MPI_COMM_WORLD,&status);
}
for(i=0; i<3 ; i++)
for(k=0; k<9 ; k++)
{
for(m=0 ; m<20 ; m++)
{
if(b[i][k] == m)
c[m]++;
}
}
printf("\n \n ");
for(m=0 ; m<20 ; m++)
printf("%d ",c[m]);
}
for(k=0; k<20 ; k++)
{
printf("\n");
printf("%2d : ",k);
for(i=0 ; i<c[k] ; i++)
{
printf("=");
}
}
MPI_Finalize();
return 0;
}