MPI_Bast:堆栈与堆

MPI_Bcast: Stack vs Heap

本文关键字:堆栈 Bast MPI      更新时间:2023-10-16

我不太明白为什么我不能广播存储在堆中的数组(new double[n](,但如果数组存储在堆栈中,它会运行良好
请告诉我发生了什么事。

#include "mpi.h"
int main(int argc, char* argv[])
{
    MPI_Init(&argc, &argv);
    int iproc;
    MPI_Comm_rank(MPI_COMM_WORLD, &iproc);
    int n = 1000;
    double *A=new double[n];
    //double A[n];                                                                                                       
    printf("Before Bcast from rank %dn",iproc);
    MPI_Bcast(&A, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
    printf("After Bcast from rank %dn",iproc);
    delete[] A;
    MPI_Finalize();
    return 0;
}

输出:

Before Bcast from rank 0
Before Bcast from rank 1
After Bcast from rank 0
After Bcast from rank 0  (why does this line show up again?)
APPLICATION TERMINATED WITH THE EXIT STRING: Hangup (signal 1)

简而言之,应该将&A替换为A

在这种情况下发生了什么?内存损坏。

double *A驻留在堆栈上(A在堆中(。MPI_Bcast(&A, n,,,)将修改指针本身,并且堆栈int procint n上的更多数据是内存覆盖的受害者。

堆栈中的内存布局是

double* A;  // it points some new address
int n;      // next to *A
int iproc;  // next to n

它是16字节(在x86_64环境中(MPI_Bcast(&A, n,,将从&A写入40000字节的0。包括CCD_ 9和CCD_。

它用A == n == iproc == 0 提供结果

所以delete[] A;被强制删除空指针,这会导致segfault。

为了避免这些悲剧(射中自己的脚(

const double *A = new double[n];

const将拯救您。有关详细信息,请参阅http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967/Constant-Pointers-and-Pointers-to-Constants.htm