C 用MPI乘多项式
我的程序必须乘两个多项式。我将多项式定义为两个整数数组。我必须使用MPI,我不明白为什么在使用“mpiexec”执行程序后,在我的命令行上它只是等待,什么也不做。我认为我没有以正确的方式发送/接收阵列,但我不知道如何解决它C 用MPI乘多项式,c,mpi,C,Mpi,我的程序必须乘两个多项式。我将多项式定义为两个整数数组。我必须使用MPI,我不明白为什么在使用“mpiexec”执行程序后,在我的命令行上它只是等待,什么也不做。我认为我没有以正确的方式发送/接收阵列,但我不知道如何解决它 int main(int argc, char *argv[]){ int numtasks, taskid, numworkers, source, dest, mtype, offset, i, j, chunksize; int A[ARRAYSIZE
int main(int argc, char *argv[]){
int numtasks, taskid, numworkers, source, dest, mtype, offset, i, j, chunksize;
int A[ARRAYSIZE], B[ARRAYSIZE], C[ARRAYSIZE*2-1];
MPI_Status status;
/*---INITIALIZATIONS---*/
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
if (numtasks < 2){
printf("Need at least 2 MPI tasks. Quitting...\n");
MPI_Abort(MPI_COMM_WORLD, 0);
exit(1);
}
numworkers = numtasks - 1;
printf("MPI task %d has started...",taskid);
chunksize = (ARRAYSIZE / numtasks);
/* MASTER task */
if (taskid == MASTER){
printf("mpi_mm has started with %d tasks.\n", numtasks);
printf("Initializing polynoms...\n");
for (i = 0; i < ARRAYSIZE; i++)
A[i] = 10 * i;
for (i = 0; i < ARRAYSIZE; i++)
B[i] = 10 + i;
offset = chunksize;
mtype = FROM_MASTER;
for (dest = 1; dest <= numworkers; dest++){
printf("Sending data to task %d\n", dest);
MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&A[offset], chunksize, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&B,ARRAYSIZE,MPI_INT, dest, mtype, MPI_COMM_WORLD);
printf("Sent %d elements to task %d offset=%d\n",chunksize,dest,offset);
offset = offset + chunksize;
}
/*Receive results from worker tasks*/
offset = 0;
for (i = 1; i <= numworkers; i++){
source = i;
MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&C[offset], ARRAYSIZE * 2 - 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
printf("Received results from task %d\n", source);
}
printf("******************************************************\n");
printf("Result polynom: \n");
printPoly(C, ARRAYSIZE * 2 - 1);
printf("******************************************************\n");
printf("Done.\n");
}
/* WORKER TASK */
if (taskid > MASTER){
mtype = FROM_MASTER;
MPI_Recv(&offset, 1, MPI_INT, MASTER,mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&A[offset], chunksize, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&B, ARRAYSIZE, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
for (i = 0; i < ARRAYSIZE; i++){
for (j = 0; j < ARRAYSIZE; j++){
C[i + j] = A[i] * B[j];
}
}
mtype = FROM_WORKER;
MPI_Send(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
MPI_Send(&C, ARRAYSIZE*2-1,MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
}
MPI_Finalize();
}
intmain(intargc,char*argv[]){
int numtask、taskid、numworkers、source、dest、mtype、offset、i、j、chunksize;
int A[ARRAYSIZE],B[ARRAYSIZE],C[ARRAYSIZE*2-1];
MPI_状态;
/*---初始化---*/
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和任务ID);
MPI通信大小(MPI通信世界和numtasks);
如果(numtasks<2){
printf(“需要至少2个MPI任务。正在退出…\n”);
MPI_中止(MPI_通信世界,0);
出口(1);
}
numworkers=numtasks-1;
printf(“MPI任务%d已启动…”,任务ID);
chunksize=(ARRAYSIZE/numtask);
/*主任务*/
if(taskid==MASTER){
printf(“mpi_mm已从%d个任务开始。\n”,numtask);
printf(“初始化多项式…\n”);
对于(i=0;i 对于(dest=1;dest)您在主控接收循环之前忘记更改标记。您需要在此处添加来自\u WORKER;
的mtype=标记。在主控接收循环之前忘记更改标记。您需要在此处添加来自\u WORKER;
的mtype=标记。