我已经设置了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错误,所以我一定做错了。我的问题是这种方法有什么问题,或者如果有更有效的方法可行,甚至更好!?
此外,我不想使用提升,所以我可以更好地掌握这个级别的情况。
答案 0 :(得分:0)
您无法发送矢量数组。向量就像指向动态分配的数组的指针。您将指针(或向量的内存布局中首先出现的任何内容)复制到接收向量的数组中,然后尝试访问该地址(但该地址是指发送方中分配的内存)。
使用两个向量,可以在两个位置进行整数,&v1[0]
和&v2[0]
(或C ++ 11中的v1.data()
)。如果你正确地调整了向量的大小,你可以在一个向量中将一个int的数组存储到另一个向量中,但无论如何你必须为每个向量(即每个实际的int数组)执行一次发送操作。
编辑:如果您对所有这一切都不满意,只需将所有内容(两个向量的大小和内容)复制到一个大int[]
C风格的数组中。与实际发送相比,本地复制不太可能是昂贵的。