将向量分散到可变 MPI 中
Scatter a vector into a variable MPI
我正在尝试从秩 = 0 的进程向所有其他进程 (1,2,3,4) 发送一个来自向量n_pointsBuffer
的值。问题是只有进程 0 获得其值,而其他进程则没有。谁能向我解释一下我是否可能要做什么,如果是这样,如何做?这是我第一次使用 MPI。
#include <mpi.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(int argc, char* argv[]) {
MPI::Init(argc, argv);
int num_procs = MPI::COMM_WORLD.Get_size();
int rank = MPI::COMM_WORLD.Get_rank();
srand(getpid());
int n_points;
if (rank == 0) {
int n_pointsBuffer[] = { 1000000, 1203100, 1231230, 1231000, 1312322 };
MPI::COMM_WORLD.Scatter(n_pointsBuffer, 1, MPI::INT, &n_points, 1,
MPI::INT, 0);
}
cout << "Rank = " << rank << ", n_points = " << n_points << "n";
double sum = 0;
for (int i = 0; i < n_points; i++) {
double x = rand() / ((double) (RAND_MAX));
double f = 1.0 / (1.0 + x * x);
sum += f;
}
double avg_sum = 0;
MPI::COMM_WORLD.Reduce(&sum, &avg_sum, 1, MPI::DOUBLE, MPI::SUM, 0);
if (rank == 0) {
double pi = 4.0 * (avg_sum / num_procs / ((double) (n_points)));
cout << "Pi is approx " << pi << " with error " << pi - M_PI << ".n";
}
MPI::Finalize();
return 0;
}
这是因为每个人都必须打电话给Scatter()
。不仅仅是根。引用另一个答案:
MPI_Scatter函数包含发送和接收逻辑。这 根进程(此处指定为 0)发送数据,并且所有 接收者收到;每个参与者都必须调用例行程序。 分散是 MPI 集合操作的一个例子,其中所有任务 在沟通者中必须调用相同的例程。广播、屏障、 缩减操作和收集操作是其他示例。
请注意,每个集体行动都是一样的。这里有一个使用广播的例子(你也可以在同一个仓库中找到一些其他程序,这些是我写的,用来测试我的由转储机器组成的 MPI 集群)。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- c++ MPI 广播向量
- 对象的序列化向量为STD :: String,以与MPI一起使用
- MPI发送/recv的向量
- 将向量分散到可变 MPI 中
- 使用 MPI 分散对的 c++ 向量
- 如何通过Boost MPI传递序列化类的向量
- MPI,C,派生类型,向量结构
- 使用 MPI c 的整数和向量
- 如何在MPI中使用多维STL向量
- MPI同步矩阵的向量
- C++:使用 MPI 的 gatherv 连接不同长度的向量