C++ 如何在MPI中使用多维STL向量

C++ 如何在MPI中使用多维STL向量,c++,stl,mpi,C++,Stl,Mpi,我试图在MPI中乘以两个矩阵,但我的两个矩阵都是向量形式 向量Mat1按MxN顺序排列哪个 向量Mat2哪个是NxL订单 结果也是矢量形式的 vector <vector <int> > Mat3; 使用散射和聚集功能接收数据作为 MPI_Scatterv(Mat1.data(), CNTS, SNTS, MPI_INT, MatPartS.data(), MatPartS.size(), MPI_INT, 0, MPI_COMM_WORLD); f

我试图在MPI中乘以两个矩阵,但我的两个矩阵都是向量形式

向量Mat1按MxN顺序排列哪个

向量Mat2哪个是NxL订单

结果也是矢量形式的

vector <vector <int> > Mat3;
使用散射和聚集功能接收数据作为

    MPI_Scatterv(Mat1.data(), CNTS, SNTS, MPI_INT, MatPartS.data(), MatPartS.size(), MPI_INT, 0, MPI_COMM_WORLD);


    for (int i = 0; i < myRowsSize; ++i)
    {
            for (int j = 0; j < L; ++j)
            {
                    ResultMatPart[i][j]=0;
                    for (int k = 0; k < N; ++k)
                    {
                             ResultMatPart[i][j] += MatPartS[i][k] * Mat2[k][j];
                    }
            }
    }               


    MPI_Gatherv(ResultMatPart.data(), ResultMatPart.size(), MPI_INT, ResultMat.data(), RCNTS, SCNTS, MPI_INT, 0, MPI_COMM_WORLD);  
有关于如何在MPI中传递多维STL向量的帮助吗

多谢各位


这些MPI函数需要一维数组。您需要将2D向量收集到单个向量中。这只是为什么用向量的向量来表示矩阵很糟糕的原因之一

看看我对其他人的向量困境给出的答案。它提供了一个使用单个向量的简单矩阵类:


这些MPI函数需要一维数组。您需要将2D向量收集到单个向量中。这只是为什么用向量的向量来表示矩阵很糟糕的原因之一

看看我对其他人的向量困境给出的答案。它提供了一个使用单个向量的简单矩阵类:


始终可以使用行主顺序(或列主顺序)存储矩阵()。因为这是矩阵的一维表示,所以可以使用“散射”将其发送过来


如果您真的需要一个二维数组,您应该查看MPI\u PACK、MPI\u UNPACK或MPI派生类型。

您可以始终使用行主顺序(或列主顺序)来存储矩阵()。因为这是矩阵的一维表示,所以可以使用“散射”将其发送过来

如果您真的需要一个二维数组,那么应该查看MPI_包、MPI_解包或MPI派生类型

向量Mat1按MxN顺序排列哪个

向量Mat2哪个是NxL订单

这甚至不能确保行的长度是相等的

包含在重载[]-op的类中的平坦M*N大小的字段(例如简单的
real_type*
std::valarray
)是一个更健壮的模型,也非常适合MPI

向量Mat1按MxN顺序排列哪个

向量Mat2哪个是NxL订单

这甚至不能确保行的长度是相等的


包含在重载[]-op的类中的平坦M*N大小的字段(例如简单的
real_type*
std::valarray
)是一个更健壮的模型,也非常适合MPI。

因此,不可能在MPI中传递2D矩阵/数组。在网上搜索后,这是我的观察。只有我们能传递一个向量。我的问题是我的数组太大(m=1000000,N=100),如果上面的代码可以工作,它也会增长。不知何故,我能够将它容纳到一个二维数组中。你能给我发一个关于如何处理这个问题的小帖子吗。我是新的MPI,但在C++中有规律。谢谢。或者我应该在这行前面放一个for循环:MPI_Bcast(Mat2.data(),Mat2.size(),MPI_INT,0,MPI_COMM_WORLD);比如(i=0;;)MPI_Bcast(Mat2[0][i].data(),Mat2.size(),MPI_INT,0,MPI_COMM_WORLD)等等。你说它太大是什么意思?这只是大约400兆字节的32位
int
值。当然,10年前那是个大问题,但现在不是了。。。唯一的诀窍是它需要是连续的,这有时有点难以实现。我实际上没有任何MPI的经验,所以我不能对您的具体使用问题发表评论。很明显,它是在普通阵列上运行的。如果可以将操作分解为多个块,那么就开始吧。所以,在MPI中传递2D矩阵/数组是不可能的。在网上搜索后,这是我的观察。只有我们能传递一个向量。我的问题是我的数组太大(m=1000000,N=100),如果上面的代码可以工作,它也会增长。不知何故,我能够将它容纳到一个二维数组中。你能给我发一个关于如何处理这个问题的小帖子吗。我是新的MPI,但在C++中有规律。谢谢。或者我应该在这行前面放一个for循环:MPI_Bcast(Mat2.data(),Mat2.size(),MPI_INT,0,MPI_COMM_WORLD);比如(i=0;;)MPI_Bcast(Mat2[0][i].data(),Mat2.size(),MPI_INT,0,MPI_COMM_WORLD)等等。你说它太大是什么意思?这只是大约400兆字节的32位
int
值。当然,10年前那是个大问题,但现在不是了。。。唯一的诀窍是它需要是连续的,这有时有点难以实现。我实际上没有任何MPI的经验,所以我不能对您的具体使用问题发表评论。很明显,它是在普通阵列上运行的。如果可以将操作分解为多个块,那么就开始吧。实验并没有什么坏处。你们有并没有用MPI_包和MPI_解包函数展示2D数组的例子?你们有并没有用MPI_包和MPI_解包函数展示2D数组的例子?
    MPI_Scatterv(Mat1.data(), CNTS, SNTS, MPI_INT, MatPartS.data(), MatPartS.size(), MPI_INT, 0, MPI_COMM_WORLD);


    for (int i = 0; i < myRowsSize; ++i)
    {
            for (int j = 0; j < L; ++j)
            {
                    ResultMatPart[i][j]=0;
                    for (int k = 0; k < N; ++k)
                    {
                             ResultMatPart[i][j] += MatPartS[i][k] * Mat2[k][j];
                    }
            }
    }               


    MPI_Gatherv(ResultMatPart.data(), ResultMatPart.size(), MPI_INT, ResultMat.data(), RCNTS, SCNTS, MPI_INT, 0, MPI_COMM_WORLD);  
Fatal error in PMPI_Scatterv: Message truncated, error stack:
PMPI_Scatterv(376).....: MPI_Scatterv(sbuf=0x108fe00, scnts=0x108fef0, displs=0x108ffc0, MPI_INT, rbuf=0x1090270, rcount=4, MPI_INT, root=0, MPI_COMM_WORLD) failed
MPIR_Scatterv_impl(187): 
MPIR_Scatterv(106).....: 
MPIR_Localcopy(340)....: Message truncated; 64 bytes received but buffer size is 16