我有以下代码:

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,例如在var name之前设置&然后运行。

MPI_init和其他必需的函数在其他类中调用,在这里我也创建此类对象。

有人能帮我吗?

最佳答案

MPI_Recv将接收到的数据复制到第一个参数(以下情况为myX)指定的缓冲区中:

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


问题是您尚未创建用于存储此内容的缓冲区。

您可以这样做:

myX = new double[amount];


例如,创建缓冲区,不要忘了之后通过以下操作再次释放内存:

delete[] myX;

关于c++ - MPI_Send双指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34910230/

10-09 08:45