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);
为什么下面的代码不起作用?它适用于我的用户定义 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);