MPI_Bcast C++ STL 向量

use*_*490 1 c++ parallel-processing stl mpi

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

std::vector<int> v(4);
MPI_Bcast(&v, sizeof(v), MPI_BYTE, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)

我遇到分段错误:

[sdg:13611] Signal: Segmentation fault (11)
[sdg:13611] Signal code: Address not mapped (1)
Run Code Online (Sandbox Code Playgroud)

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

Zul*_*lan 5

a 本身的地址vector与它的 的地址不同data。像您建议的那样发送对象仅适用于可简单复制的类型 - 您可以想象 MPI 通信的工作方式类似于memcpy. 您可以检查一下std::is_trivially_copyable-std::vector本身绝不能轻易复制

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

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

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

MPI_Bcast(v.data(), v.size(), MPI_INT, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)

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

MPI_Bcast(v.data(), v.size() * sizeof(decltype(v)::value_type)), MPI_BYTE, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)