我已经设置了2个int向量的向量,现在我想发送它并通过OpenMPI接收它,以便我可以在从属节点上对这个结构进行计算。如果可能的话,我想一次性发送这个庞大的结构......
在主要方面,我已经宣布了我的向量并使其在发送和接收方面都很常见:
std::vector < std::vector<int> > temp;
在发送方面,我填写了这个结构,后来,我试图发送它:
MPI_Send(&temp[0], 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
而且,在接收方,我一直在表演:
temp.resize(2);
MPI_Recv(&temp[0], 2, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
但是,一旦我尝试访问收到的项目,接收方就会抛出一个seg故障,所以我一定做错了。我的问题是这种方法有什么问题,或者如果有更有效的方法可行,甚至可能更好!?
此外,我不喜欢使用提升,所以我可以更好地掌握这个级别的情况。
你不能发送一组矢量。向量就像指向动态分配的数组的指针。您正在将指针(或向量的内存布局中首先出现的任何内容)复制到接收向量的数组中,然后尝试访问该地址(但该地址是指发送方中分配的内存)。
有两个向量,在两个地方都会有一些内容,&v1[0]
和&v2[0]
(或C ++ 11中的v1.data()
)。如果你正确地调整了向量的大小,你可以在一个向量中将一个int的数组存储到另一个向量中,但无论如何你必须对每个向量进行一次发送操作(即每个实际的int数组)。
编辑:如果你对这一切都不满意,只需将所有内容(两个向量的大小和内容)复制到一个大的int[]
C风格的数组中。与实际发送相比,本地复制不太可能昂贵。