C 用MPI乘多项式

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

我的程序必须乘两个多项式。我将多项式定义为两个整数数组。我必须使用MPI,我不明白为什么在使用“mpiexec”执行程序后,在我的命令行上它只是等待,什么也不做。我认为我没有以正确的方式发送/接收阵列,但我不知道如何解决它

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=标记。