在MPI中如何广播c++矢量
In MPI How to broadcast c++ vector?
我想用MPI广播c++向量。
我不允许使用boost.mpi
现在我在MPI(c++)中使用Vector Usage中最受欢迎的答案,但它不起作用…
好的,下面是代码:
// declaration of variables (ParsedData object will contain these variables)
int generators_count, intervals_count;
std::vector<float> mean_arr, variance_arr, interval_begins_arr, interval_ends_arr;
std::vector<int> amount_of_numbers_to_generate_arr;
// load data into parsed_data object
if (process_id == 0) {
ParsedData parsed_data = load_input_data(filename);
intervals_count = parsed_data.intervals_count;
generators_count = parsed_data.generators_count;
mean_arr = parsed_data.mean_arr;
variance_arr = parsed_data.variance_arr;
interval_begins_arr = parsed_data.interval_begins_arr;
interval_ends_arr = parsed_data.interval_ends_arr;
amount_of_numbers_to_generate_arr = parsed_data.amount_of_numbers_to_generate_arr;
}
// send size of vectors to all processes - that MPI code works
MPI_Bcast(&intervals_count, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&generators_count, 1, MPI_INT, 0, MPI_COMM_WORLD);
// reserve memory for vectors
if (process_id != 0) {
mean_arr.reserve(generators_count);
variance_arr.reserve(generators_count);
amount_of_numbers_to_generate_arr.reserve(generators_count);
interval_begins_arr.reserve(intervals_count);
interval_ends_arr.reserve(intervals_count);
}
// stolen from https://stackoverflow.com/questions/2546298/vector-usage-in-mpic
// broadcast each vector, following code compiles but not works properly
MPI_Bcast(&mean_arr[0], mean_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD);
MPI_Bcast(&variance_arr[0], variance_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD);
MPI_Bcast(&interval_begins_arr[0], interval_begins_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD);
MPI_Bcast(&interval_ends_arr[0], interval_ends_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD);
MPI_Bcast(&amount_of_numbers_to_generate_arr[0], amount_of_numbers_to_generate_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD);
当我只是简单地把结果放在不同的过程中,我得到了错误的答案:
cout << "process ID " << process_id << endl << "amount_of_numbers_to_generate_arr[0] " << amount_of_numbers_to_generate_arr[0] << endl;
结果:using process 0
process ID 0
amount_of_numbers_to_generate_arr[0] 100000000
using process 1
process ID 1
amount_of_numbers_to_generate_arr[0] -423989576
using process 2
process ID 2
amount_of_numbers_to_generate_arr[0] 1741864632
应该是:
using process 0
process ID 0
amount_of_numbers_to_generate_arr[0] 100000000
using process 1
process ID 1
amount_of_numbers_to_generate_arr[0] 100000000
using process 2
process ID 2
amount_of_numbers_to_generate_arr[0] 100000000
如何解决这个问题?
或者可能有另一种方法可以做到这一点?
当你"为向量保留内存"时,你实际上并没有调整向量的大小。在随后的MPI_Bcast
调用中,向量的大小仍然是0
,因此没有接收到任何值。
要实际调整矢量的大小,调用resize
而不是reserve
。
相关文章:
- 其中降频广播实际上是有用的
- boost::asio UDP 广播客户端仅接收"fast"数据包
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- 在具有 MPI 的超立方体中广播
- 为什么不允许这种交叉广播?
- c++ MPI 广播向量
- 为什么在template函数广播中把两个extensor表达式加在一起不正确
- 特征中的稀疏矩阵和向量加法广播
- 如何在INET的应用层中发送广播数据包
- 特征张量广播语法
- 我需要帮助理解GetIpAddrTable和接口广播地址
- C++ UDP 广播使用 ::write
- 如何将 Eigen::Tensor 广播到更高维度?
- Twitch的RTMP广播数据包体结构
- LAN 上的计算机不会始终使用 boost::asio C++接收到 255.255.255.255 的 UDP 广播
- 在本征C++中广播(两个)向量
- 广播__M128矢量的一个任意元素
- UDP 客户端不会在 esp32 上广播消息
- 如何使用Boost Asio接收到255.255.255.255的UDP广播
- mpi_bcast,将阵列缓冲区广播到接收缓冲区中的特定位置