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, ¶mType);
// Commit MPI datatype
MPI_Type_commit(¶mType);
// 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(¶mType);
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 */