C++ 如何使用动态MPI\U类型创建和MPI\U Bcast?

C++ 如何使用动态MPI\U类型创建和MPI\U Bcast?,c++,g++,mpi,mpich,C++,G++,Mpi,Mpich,到目前为止,我一直在使用openmpi/1.10.2和gcc/5.3.0,我的代码运行良好 我正在处理的集群使用gcc/5.3.0将其MPI实现更改为cray-mpich/7.5.0,我发现了以下错误 编译器正在将局部变量(idx,disp,块,和类型)预分配为。所有数组都预先分配了size==2 #include<mpi.h> #include<vector> #include<iostream> int main( int argc, char** ar

到目前为止,我一直在使用
openmpi/1.10.2
gcc/5.3.0
,我的代码运行良好

我正在处理的集群使用
gcc/5.3.0
将其MPI实现更改为
cray-mpich/7.5.0
,我发现了以下错误

编译器正在将局部变量(
idx
disp
,和
类型
)预分配为
。所有数组都预先分配了
size==2

#include<mpi.h>
#include<vector>
#include<iostream>

int main( int argc, char** argv)
{
    MPI_Init(&argc, &argv);

    int rank;
    int size;

    MPI_Comm_rank(MPI_COMM_WORLD,&rank); //passing the references
    MPI_Comm_size(MPI_COMM_WORLD,&size); //passing the references

    std::vector<int> mIntegers(0);
    std::vector<double> mFloats(2);

    if (rank == 0 )
    {
        mFloats[0]=1.0;
        mFloats[1]=1.0;
    }

    int ioRank = 0;
    int nBlocks = 0;

    if(mIntegers.size() > 0)
    {
        nBlocks++;
    }

    if(mFloats.size() > 0)
    {
        nBlocks++;
    }

    int idx = 0;
    MPI_Aint    displ[nBlocks];
    int         blocks[nBlocks];
    MPI_Datatype   types[nBlocks];
    MPI_Aint    element;

    // Create integer part

    if(mIntegers.size() > 0)
    {
        MPI_Get_address(mIntegers.data(), &element);
        displ[idx] = element;
        blocks[idx] = mIntegers.size();
        types[idx] = MPI_INT;
        idx++;
    }

    // Create floats part
    if(mFloats.size() > 0)
    {
        MPI_Get_address(mFloats.data(), &element);
        displ[idx] = element;
        blocks[idx] = mFloats.size();
        types[idx] = MPI_DOUBLE;
        idx++;
    }

    MPI_Datatype   paramType;

    // Create MPI datatype
    MPI_Type_create_struct(nBlocks, blocks, displ, types, &paramType);
    // Commit MPI datatype
    MPI_Type_commit(&paramType);

    // Broadcast the information
    MPI_Bcast(MPI_BOTTOM, 1, paramType, ioRank, MPI_COMM_WORLD);
    MPI_Barrier(MPI_COMM_WORLD);

    std::cout<<"Process:"<< rank <<" of " << size << " F[0] "<<mFloats[0]<< ", F[1] "<<mFloats[1]<<  std::endl ;

    // Free the datatype
    MPI_Type_free(&paramType);

    MPI_Finalize();

    return 0;

}
并执行:

$mpirun -n 16 segFault
因此,由于内存分配不匹配,
MPI\u Bcast
导致
分段错误

MPICH将
MPI\u BOTTOM
MPIR\u F08\u MPI\u BOTTOM
定义为

#define MPI_BOTTOM      (void *)0
extern int MPIR_F08_MPI_BOTTOM;
而open mpi将
mpi\u BOTTOM
定义为

#define MPI_BOTTOM               ((void *) 0)          /* base reference address */

“所有数组都是预先分配的,大小==2。”这不是这里发布的代码所做的。@HristoIliev这是GCC对-O2所做的。在处理
MPI\u BOTTOM
时,这可能是MPICH中的一个错误。OpenMPI中也有一个类似的问题,最近才得到修复。@HristoIliev有没有检查过?我现在使用两个BCast来代替两个数组,看看它是否再次失败。
#define MPI_BOTTOM               ((void *) 0)          /* base reference address */