【问题标题】:MPI_Send double pointerMPI_Send 双指针
【发布时间】:2016-04-26 21:36:21
【问题描述】:

我有以下代码:

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,例如在变量名称之前设置&amp;,然后运行。

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

有人可以帮我吗?

【问题讨论】:

  • 如果您解释了代码的哪一部分导致了错误,您的问题会更清楚:您的许多 MPI 调用中的哪一个导致Null buffer pointerSegmentation fault 是从哪一行抛出的?
  • @Edward 对,那是我尝试从双数组中获取数据的时候。

标签: c++ segmentation-fault mpi


【解决方案1】:

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

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

问题是您还没有创建缓冲区来存储它。

你可以这样做:

myX = new double[amount];

例如创建缓冲区,之后不要忘记再次释放内存:

delete[] myX;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多