【问题标题】:Sending vector of int vectors through OpenMPI通过 OpenMPI 发送 int 向量的向量
【发布时间】:2026-01-05 10:45:01
【问题描述】:

我已经设置了一个包含 2 个 int 向量的向量,现在我想通过 OpenMPI 发送和接收它,以便我可以在从节点上对这个结构进行计算。如果可能的话,我想一次性发送这个庞大的结构......

在 main 上,我已经声明了我的向量,并使其在发送方和接收方都通用:

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);

但是,一旦我尝试访问收到的项目,接收方就会抛出一个段错误,所以我一定做错了什么。我的问题是这种方法有什么问题,或者如果有更有效的方法可以做到这一点甚至更好!?

此外,我不喜欢使用 boost,这样我可以更好地掌握这个级别的情况。

【问题讨论】:

    标签: c++ vector openmpi


    【解决方案1】:

    您不能发送向量数组。向量就像一个指向动态分配数组的指针。您正在将指针(或任何首先出现在向量的内存布局中的内容)复制到接收向量的数组中,然后尝试访问该地址(但该地址是指在发送方中分配的内存)。

    如果有两个向量,则在两个地方会有整数,&amp;v1[0]&amp;v2[0](或 C++11 中的 v1.data())。如果您正确调整向量的大小,您可以将一个向量中的整数数组 memcpy 到另一个向量中,但在任何情况下,您都必须对每个向量(即每个实际的 int 数组)执行一次发送操作。


    编辑:如果您对所有这些不满意,只需将所有内容(两个向量的大小和内容)复制到一个大的int[] C 样式数组中。与实际发送相比,本地复制不太可能昂贵。

    【讨论】:

    • 感谢您的回答。我希望有办法,但我想没有。您是否会碰巧知道是否可以一次性发送这么多数据?
    • 这不是数据量的问题。问题是temp[0].data()temp[1].data()(两者都是int*)指向完全不同的内存块。
    • 我明白了,谢谢。但我想问一下,我是否仍然可以一次性提供这些数据,也许是通过使用另一种结构或设置,这样我就不必将我的发送请求分成更小的部分。
    • 嗯,你可以把你的两个向量连接成一个
    • 您可以创建派生数据类型并使用它一次性发送/接收。请注意,在创建派生数据类型时(例如,before 调用 MPI_Recv())时,您需要知道接收方的两个向量大小。这有点令人费解,我不确定性能提升(如果有的话)是否值得额外的复杂性。底线,坚持两个 MPI 调用可能是一个较小的邪恶。