MPI_散射:散射特征矩阵

MPI_散射:散射特征矩阵,mpi,eigen3,Mpi,Eigen3,我尝试使用特征矩阵实现MPI_散射,使用以下方法: // 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_

我尝试使用特征矩阵实现MPI_散射,使用以下方法:

// 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;
然后,我尝试使用

MPI_Scatter(globaldata.data(), 1, MPI_DOUBLE, &localdata, 1, MPI_DOUBLE, 0,
            MPI_COMM_WORLD);
然而,我不认为以上是正确的。如何将上述特征矩阵逐列分散,以便在运行
mpirun-np 4./mpitest
时,例如,我可以看到映射到每个进程的特征矩阵的每一列,或者如果np为2,则看到映射到每个进程的特征矩阵的2?发送数据类型和接收数据类型是否正确,即MPI双精度?

在MPI分散中,计数(作为1)是发送到每个进程的元素数。要在“大小”过程中均匀分布矩阵,则需要将计数设置为16/大小(对于4x4矩阵示例)

这依赖于矩阵中的所有数据被存储为单个连续的内存块-您需要检查MatrixXd类型的情况,尽管我猜这是真的

同样,分散分布是分布行还是分布列取决于存储顺序。对于标准C数组,在4个进程上,您将向每个进程发送单独的行,而不是列。但是,Eigen似乎默认为列主存储(Fortran标准,但不适用于C),这意味着您发送的是整个列。

在MPI_散点中,计数(为1)是发送到每个进程的元素数。要在“大小”过程中均匀分布矩阵,则需要将计数设置为16/大小(对于4x4矩阵示例)

这依赖于矩阵中的所有数据被存储为单个连续的内存块-您需要检查MatrixXd类型的情况,尽管我猜这是真的


同样,分散分布是分布行还是分布列取决于存储顺序。对于标准C数组,在4个进程上,您将向每个进程发送单独的行,而不是列。但是,Eigen似乎默认为列主存储(Fortran标准,但不适用于C),这意味着您将发送整个列。

您需要为接收缓冲区分配空间。简单地将变量定义为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_分散中,但我认为问题的根源在于指针和分配数组之间存在一些混淆。

您需要为接收缓冲区分配空间。简单地将变量定义为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_分散中,但我认为问题的根源在于指针和分配数组之间存在一些混淆。

如果我不使用MatrixSD而只使用X,它仍然不起作用。X是一个大小为4*6的数组。我试着使用MPI_散布(X,4,MPI_DOUBLE,&X1,4,MPI_DOUBLE,0,MPI_COMM_WORLD);其中X1也被声明为double*X1;我正在使用mpirun-np4./test运行。它给了我分割错误。如果我不使用MatrixXd而只使用X,它仍然不起作用。X是一个大小为4*6的数组。我试着使用MPI_散布(X,4,MPI_DOUBLE,&X1,4,MPI_DOUBLE,0,MPI_COMM_WORLD);其中X1也被声明为double*X1;我正在使用mpirun-np4./test运行。这给了我一个错误。