MPI_Scatter:Scatter Eigen Matrix

时间:2016-04-17 17:55:47

标签: mpi eigen3

我正在尝试使用以下的特征矩阵实现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 gloaldata
MPI_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?

2 个答案:

答案 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中发生了错误,但我认为问题的根源在于指针与分配数组之间存在一些混淆。