MPI_Bcast c++ STL 向量

MPI_Bcast c++ STL vector

为什么下面的代码不起作用?它适用于我的用户定义 class 但不适用于 STL 矢量。

std::vector<int> v(4);
MPI_Bcast(&v, sizeof(v), MPI_BYTE, 0, MPI_COMM_WORLD);

我遇到分段错误:

[sdg:13611] Signal: Segmentation fault (11)
[sdg:13611] Signal code: Address not mapped (1)

既然vector中的元素是连续存储的,为什么我不能使用MPI_BYTE作为一个整体发送std::vector?

很可能你想要

if (!v.empty())
    MPI_Bcast(&v[0], v.size() * sizeof(decltype(v)::value_type)), MPI_BYTE, 0, MPI_COMM_WORLD);

vector 本身的地址与其 data 的地址不同。像您建议的那样发送对象仅适用于 普通可复制 类型 - 您可以想象 MPI 通信的工作方式类似于 memcpy。您可以检查 std::is_trivially_copyable - std::vector 本身永远不会 可简单复制 .

但是,vector 将其 data 存储在连续内存中 - 您可以在其上使用 memcpy.

您必须确保所有MPI进程在操作之前都有一个具有相同size的向量。 capacity 是不够的。如果您只知道一个进程上的 size,则必须先广播大小,然后 resize 相应地在另一个进程上广播目标向量。

此外,向量中的元素本身必须可简单复制

MPI_Bcast(v.data(), v.size(), MPI_INT, 0, MPI_COMM_WORLD);

如果由于某种原因您无法确定 MPI 类型(例如 MPI_INT),您可以按如下方式进行(避免在更改类型时中断冗余)。

MPI_Bcast(v.data(), v.size() * sizeof(decltype(v)::value_type)), MPI_BYTE, 0, MPI_COMM_WORLD);