MPI_Bcast c++ STL vector
MPI_Bcast c++ STL vector
为什么以下代码不起作用?它适用于我的用户定义类,但不适用于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);
相关文章:
- MPI_Bcast c++ STL vector
- 将stl::vector iteratator条目传递到函数中
- STL vector.insert 方法期望_InputIterator作为参数
- stl::unordered_map 和 stl::vector 的销毁有何不同
- "lvalue required as increment operand" 关于 C++ 和 stl vector's begin()
- STL Vector push_back()
- STL vector: resize() and assign()
- STL Vector:临时调用 data() 时的未定义行为
- STL vector的默认构造函数
- 删除STL vector中的表项
- STL vector和new运算符
- c++ STL vector.erase()总是删除最后一个元素
- 返回对stl vector的引用
- 包装STL vector并改变其迭代器的行为
- 从类型为T的数组初始化类型为T*的Stl Vector
- 将包含指针的stl::vector强制转换为包含常量指针的stl::vector
- STL vector.clear()导致内存双元释放或pthreads程序损坏
- STL vector of vector从double到unsigned int的转换
- 检查STL vector中某个位置的元素是否存在(已设置)
- STL Vector, deque或容器等效Android