我正在尝试使用以下的特征矩阵实现MPI_Scatter:
// get pointer to samples
double *X = prob.x;
// map the samples into the matrix object
MatrixXd globaldata = Map<MatrixXd>(X, dims, nsmp);
MatrixXd localdata;
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
printf("Processor %d has data before Scatter \n", rank);
cout << globaldata<<endl<<endl;
}
MPI_Scatter(globaldata.data(), 1, MPI_DOUBLE, &localdata, 1, MPI_DOUBLE, 0,
MPI_COMM_WORLD);
printf("Processor %d has data \n", rank);
cout << localdata << endl;
MatrixXd globaldata的输出是:
-1 -1 -1 -1
-0.997455 -0.996032 -0.998472 -0.996154
-0.94402 -0.912698 -0.966387 -0.915385
-0.974555 -0.960317 -0.984721 -0.961538
-0.46056 -0.0753968 -0.676089 0.423077
1 1 1 1
然后我尝试使用
分散特征Matrix gloaldataMPI_Scatter(globaldata.data(), 1, MPI_DOUBLE, &localdata, 1, MPI_DOUBLE, 0,
MPI_COMM_WORLD);
但我不认为上述是正确的。我如何逐列分散上面的特征矩阵,以便当我运行mpirun -np 4 ./mpitest
时,我看到每列特征矩阵映射到每个进程,或者如果np是2,则映射到每个进程的2? send_datatype和recv_datatype是否正确i-e MPI_DOUBLE?
答案 0 :(得分:2)
在MPI_Scatter中,计数(您有1)是发送到每个进程的元素数。将矩阵均匀地分布在&#34;尺寸&#34;然后你需要将计数设置为16 / size(对于你的4x4矩阵示例)。
这依赖于矩阵中的所有数据存储为单个连续的内存块 - 您需要检查MatrixXd类型的情况,尽管我猜它会是的。
同样,散点图是否分配行或列取决于您的存储顺序。对于标准C阵列,在4个进程上,您将向每个进程发送单独的行,而不是列。但是,Eigen似乎默认为列主要存储(Fortran的标准,但不是C的标准),这意味着你要发送整个列。
答案 1 :(得分:0)
您需要为接收缓冲区分配空间。简单地将变量定义为double *不会保留任何存储空间,因此您将收到错误消息。我认为原始示例也是如此 - localdata已定义,但看起来没有分配存储空间。
要使代码正常工作,您可以尝试:
double X1[24]; // This is more storage than you need but its safe
...
MPI_Scatter(X, 4,MPI_DOUBLE, X1, 4, MPI_DOUBLE, 0, MPI_COMM_WORLD)
虽然MPI_Scatter中发生了错误,但我认为问题的根源在于指针与分配数组之间存在一些混淆。