我希望使用这个最小代码在一个类型为struct的向量中分散许多元素
struct node
{
scale2 P;
scale2 V;
float M;
//
node(float M, float Px, float Py) // constructor
:P(Px,Py)
, V( 0.f, 0.f )
, M(m)
{}
};
主要功能
int main(int argc, char **argv){
std::vector<node> bodies;
std::vector<node> b;
int rank, size, ROOT =0;
long int pC;
MPI_Datatype MPI_NODE;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
//creating data type that represents node
//setup description of scale2 and float
// define and commit structure type
if(rank == ROOT){
// initialise bodies
pC = bodies.size();
cout <<pC << " nodes" << endl;
}
MPI_Bcast(&pC, 1, MPI_LONG, ROOT, MPI_COMM_WORLD);
MPI_Scatter(&bodies, pC/size, MPI_NODE, &b, pC/size, MPI_NODE, ROOT, MPI_COMM_WORLD);
cout << "rank "<<rank<<" has " <<b.size()<<" values of bodies"<<endl;
//other stuff
MPI_Finalize();
return 0;
}
我正在寻找的输出(4个进程和body的大小= 64)是
rank 0 has 16 values of bodies
rank 1 has 16 values of bodies
rank 2 has 16 values of bodies
rank 3 has 16 values of bodies
我得到的输出
rank 0 has 64 values of bodies
rank 2 has 2818 values of bodies
rank 1 has 0 values of bodies
rank 3 has 11311978710794943764 values of bodies
我确定问题出现在MPI_Scatter
行或其下方的行中,即以错误的方式输出b.size()
的方式。我的问题也可能是vector<node> b
在MPI_scatter
中传递的方式。其余的代码工作正常,因为我测试了没有这两行。如果代码的这一部分不是问题(我怀疑它),那么我定义数据类型MPI_NODE
的方式是错误的,在这种情况下我将编辑我的代码以显示该部分。
答案 0 :(得分:0)
使用C ++,您不能简单地使用std::vector
的地址,而必须使用.data()
。您还必须在recvbuf
中预留足够的空间,这意味着您必须手动b.resize(pC)
。
您的代码中可能存在更多问题,请学习编写proper example code(不仅仅是最小的,也是完整且可验证的!)。