C++ 如何在MPI中使用多维STL向量
我试图在MPI中乘以两个矩阵,但我的两个矩阵都是向量形式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
向量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