我的目标是将一个矩阵(保存在向量中)分发给N个处理器。 由于分布式块是重叠的,我想使用MPI_Scatterv函数。
但是,在通话后每个等级都设置为零,之后我得到一个mpi错误代码11(SegFault)
为了测试,我打印了这些行列。在hello0,排名为0,1,2,3,但在hello2,它们变为0,0,0,0
TBH我不确定,我的代码总体上是多么正确,但是在注释掉MPI_Scatter函数调用时问题就消失了。
代码:
int rank, size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//Matrix is NxN
int N = 16;
//ghostlines(How many overlapping lines)
int X = 1;
//basic chunk size
int rsize = (N * N / size);
//bigger than need be
std::vector<double> rbuff(2*rsize + 2 * X, 0);
std::cout << "hallo0 "<<rank<<std::endl;
//is filled with some random numbers before being sent
std::vector<double> v1(N * N, X0);
// For N=16, size = 4, X=1
// sizes = {65, 66, 66, 65}
// disps = {0, 62, 124, 186}
MPI_Scatterv(v1.data(), sizes, disps, MPI_DOUBLE, &rbuff, sizes[rank], MPI_DOUBLE, 0, MPI_COMM_WORLD);
std::cout << "hallo2 "<<rank<<std::endl;