2016-01-20 144 views
0

我有以下代码:MPI_SEND双指针

double * myX; 
double * myY; 
double * myZ; 
int amount; 
int count;  // number of process 

void SomeClass::someMethod(double *x, double *y, double *z, int amount) { 

    if (myId == 0) { 
     myX = x; 
     myY = y; 
     myZ = z; 
     amount = amount; 
     for(int i = 1; i < count; ++i) { 
      MPI_Send(&amount, 1, MPI_INT, i, 0, MPI_COMM_WORLD); 
      MPI_Send(myX, amount, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); 
      MPI_Send(myY, amount, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); 
      MPI_Send(myX, amount, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); 
     } 
    }           
} 

void SomeClass::anotherMethod(void) { 

    if(myId != 0) { 
     MPI_Recv(&amount, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     MPI_Recv(myX, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     MPI_Recv(myY, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     MPI_Recv(myZ, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);   
    } 

    // rest of code 
    MPI_Reduce(args); 
} 

但我有问题,因为我得到Null buffer pointer当我运行该代码或Segmentation fault当我改变的东西,例如设置&之前变数名称,然后运行。

MPI_init和其他所需的函数在其他类中被调用,其中我也创建了这个类对象。

有人可以帮助我吗?

+1

你的问题会比较清楚你代码产生了错误:您的许多MPI调用中的哪一个会导致“空缓冲区指针”? 'Segmentation fault'是从哪一行抛出的? – Edward

+0

@爱德华权利,这是当我尝试从双数组中获取数据。 –

回答

3

MPI_RECV将它接收到的数据复制到由(在下面的情况下MYX)所述第一参数指定的缓冲液:

MPI_Recv(myX, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 

的问题是,您还没有创建一个缓冲器来存储此。

你可以这样做:

myX = new double[amount]; 

例如创建缓冲区,不忘再次释放内存之后用:如果你解释的哪一部分

delete[] myX; 
+0

感谢您的好答案。其实这是一个错误。 –