c++ - MPI_Bcast c++ STL 向量
问题描述
为什么下面的代码不起作用?它适用于我的用户定义类,但不适用于 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
a本身的地址与它的 不同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);
推荐阅读
- c# - 如何将锁系统状态添加到我的 SaveState 类?
- arrays - 如何将对象传递给一个方法,然后再传递给另一个方法
- three.js - 如何将旧的演示升级到最新版本的three.js?
- regex - 不允许 XSD 正则表达式中的特定字符串
- php - 消息:尝试访问 null 类型值的数组偏移量
- javascript - ES6 将两个变量组合成一个现有的 javaScript 对象
- python - 读取 .txt 并用逗号分割列表时出错
- javascript - Chrome 插件随机向我的 C++ 本地主机应用程序发送垃圾
- c# - 单击上传按钮时我无法显示文件路径
- android - 如何防止 Flutter 构建输出带回旧的调试输出?