2011-02-04 74 views
0

信息在MPI程序我想传递给员工的信息,但我得到了一个问题:MPI问题发送给工人

Number of worker tasks = 4 
    sending 1-th element q=0.011000 to task 1 
    received 1-th element q=0.000000 in task 108827872 
    sending 2-th element q=0.012000 to task 2 
    sending 3-th element q=0.013000 to task 3 
    received 2-th element q=0.000000 in task 1353735488 
    sending 4-th element q=0.014000 to task 4 
    received 3-th element q=0.000000 in task -1900924208 
    received 4-th element q=0.000000 in task -1215863168 

很可能我没有做传递正确的信息,你知道错误可能是哪里?

#include "mpi.h"    /* required MPI library */ 
#include <stdio.h> 
#include <math.h> 

#define NRRR 16    /* number of rows in matrix A */ 
#define NLLL 16     /* number of columns in matrix A */ 
#define MASTER 0    /* taskid of first task */ 
#define FROM_MASTER 1   /* setting a message type */ 
#define FROM_WORKER 2   /* setting a message type */ 

int main(argc,argv) 
int argc; 
char *argv[]; 
{ 
    int numtasks,    /* number of tasks in partition */ 
    taskid,    /* a task identifier */ 
    numworkers,   /* number of worker tasks */ 
    source,    /* task id of message source */ 
    dest,     /* task id of message destination */ 
    mtype, 
    i,j, 
    rc;     /* message type */ 
    double qr[NRRR], 
    ql[NLLL], 
    element_r[NRRR][3], 
    element_l[NLLL][3];   


    MPI_Status status; 
    rc = MPI_Init(&argc,&argv); 
    rc|= MPI_Comm_size(MPI_COMM_WORLD,&numtasks); 
    rc|= MPI_Comm_rank(MPI_COMM_WORLD,&taskid); 

    if (rc != 0) 
     printf ("error initializing MPI and obtaining task ID info\n"); 

    numworkers = numtasks-1; 

    // MASTER 
    if (taskid == MASTER) 
    { 
     printf("\n\n\n\nNumber of worker tasks = %d\n",numworkers); 

     // init element_r and element_l 
     for(j=0;j<NRRR;j++){ 
      element_r[j][0]=j; 
      element_r[j][1]=j+1; 
      element_r[j][2]=j+2; 
      qr[j] = j*1e-4+1e-3; 
     } 

     for(i=0;i<NLLL;i++){ 
      element_l[i][0]=12000+i; 
      element_l[i][1]=12000+i+1; 
      element_l[i][2]=12000+i+2; 
      ql[i] = i*1e-3 +1e-2 ; 
     } 

     mtype = FROM_MASTER; 
     for (dest=1; dest<=numworkers; dest++) 
     { 
      printf(" sending %d-th element q=%f to task %d\n",dest,ql[dest],dest); 
      MPI_Send(&ql[dest], 1, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);       
     } 

    } 

    // WORKER 
    if (taskid > MASTER) 
    { 
     mtype = FROM_MASTER;   
     MPI_Recv(&ql, 1, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status); 
     printf(" received %d-th element q=%f in task %d\n",taskid,ql,taskid);  

    } 

    MPI_Finalize(); 
} 

回答

2

看着你的发送和接收,我没有看到任何错误。主发送ql[N],给每个工人N,这是收到并存储在ql[0]

看起来你只是没有正确地打印出来。

我得到一个合理的输出,当我更换了与工人循环:

// WORKER 
if (taskid != MASTER) 
{ 
    mtype = FROM_MASTER; 
    MPI_Recv(&ql, 1, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status); 
    printf(" received %d-th element q=%f in task %d\n", taskid, ql[0], taskid); 

} 

实例运行:

$ mpiexec.exe -np 5 ./a.exe 

Number of worker tasks = 4 
    sending 1-th element q=0.011000 to task 1 
    sending 2-th element q=0.012000 to task 2 
    received 1-th element q=0.011000 in task 1 
    sending 3-th element q=0.013000 to task 3 
    received 2-th element q=0.012000 in task 2 
    sending 4-th element q=0.014000 to task 4 
    received 3-th element q=0.013000 in task 3 
    received 4-th element q=0.014000 in task 4 

顺便说一句,你当前做的是什么MPI_Scatter是专为。 Examples here