MPI_Bcast c++ STL vector

MPI_Bcast c++ STL vector

本文关键字:STL vector c++ Bcast MPI      更新时间:2023-10-16

为什么以下代码不起作用?它适用于我的用户定义类,但不适用于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作为一个整体发送?

vector本身的地址与其data的地址不同。像您建议的那样发送对象只适用于可复制的类型——您可以想象MPI通信的工作原理与memcpy类似。你可以用std::is_trivially_copyable来检查——std::vector本身从来都不是可复制的。

但是,vector将它的data存储在连续内存中,您可以在该内存上使用memcpy

必须确保所有MPI进程在执行操作之前都有一个具有相同size的向量。CCD_ 10是不够的。如果您只知道一个进程上的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);

您很可能想要

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