- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两个程序。产生执行一些计算的“ worker ”的“主人”,我希望主人从 worker 那里得到结果并存储总和。我正在尝试使用 MPI_Reduce 从 worker 那里收集结果,而 worker 使用 MPI_Reduce 发送给主人 MPI_Comm。我不确定这是否正确。这是我的程序:
大师:
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int world_size, universe_size, *universe_sizep, flag;
int rc, send, recv;
// intercommunicator
MPI_Comm everyone;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
if (world_size != 1) {
cout << "Top heavy with management" << endl;
}
MPI_Attr_get(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, &universe_sizep, &flag);
if (!flag) {
cout << "This MPI does not support UNIVERSE_SIZE. How many processes total?";
cout << "Enter the universe size: ";
cin >> universe_size;
} else {
universe_size = *universe_sizep;
}
if (universe_size == 1) {
cout << "No room to start workers" << endl;
}
MPI_Comm_spawn("so_worker", MPI_ARGV_NULL, universe_size-1,
MPI_INFO_NULL, 0, MPI_COMM_SELF, &everyone,
MPI_ERRCODES_IGNORE);
send = 0;
rc = MPI_Reduce(&send, &recv, 1, MPI_INT, MPI_SUM, 0, everyone);
// store result of recv ...
// other calculations here
cout << "From spawned workers recv: " << recv << endl;
MPI_Finalize();
return 0;
}
worker :
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int rc, send,recv;
int parent_size, parent_id, my_id, numprocs;
// parent intercomm
MPI_Comm parent;
MPI_Init(&argc, &argv);
MPI_Comm_get_parent(&parent);
if (parent == MPI_COMM_NULL) {
cout << "No parent!" << endl;
}
MPI_Comm_remote_size(parent, &parent_size);
MPI_Comm_rank(parent, &parent_id) ;
//cout << "Parent is of size: " << size << endl;
if (parent_size != 1) {
cout << "Something's wrong with the parent" << endl;
}
MPI_Comm_rank(MPI_COMM_WORLD, &my_id) ;
MPI_Comm_size(MPI_COMM_WORLD, &numprocs) ;
cout << "I'm child process rank "<< my_id << " and we are " << numprocs << endl;
cout << "The parent process rank "<< parent_id << " and we are " << parent_size << endl;
// get value of send
send = 7; // just an example
recv = 0;
rc = MPI_Reduce(&send, &recv, 1, MPI_INT, MPI_SUM, parent_id, parent);
if (rc != MPI_SUCCESS)
cout << my_id << " failure on mpi_reduce in WORKER" << endl;
MPI_Finalize();
return 0;
}
我编译了两者并像这样执行(mpic++ for osx):
mpic++ so_worker.cpp -o so_worker
mpic++ so_master.cpp -o so_master
mpirun -n 1 so_master
这是运行产生 worker 的主人的正确方法吗?
在 master 中,我总是从 MPI_Reduce 返回 0。我可以使用内部通讯器的 MPI_reduce 还是应该使用工作人员的 MPI_Send 和主机的 MPI_Recv?我真的不确定为什么它不起作用。
如有任何帮助,我们将不胜感激。谢谢!
最佳答案
MPI_Comm_get_parent
返回包含原始进程和所有派生进程的父内部通信器。在这种情况下,调用 MPI_Comm_rank(parent, &parent_id)
不会返回父进程的等级,而是返回当前进程在内部通信器本地组中的等级:
I'm child process rank 0 and we are 3
The parent process **rank 0** and we are 1
I'm child process rank 1 and we are 3
The parent process **rank 1** and we are 1
I'm child process rank 2 and we are 3
The parent process **rank 2** and we are 1
(观察突出显示的值有何不同 - 人们会期望父进程的等级应该相同,不是吗?)
这就是 MPI_Reduce()
调用不会成功的原因,因为所有工作进程都为根等级指定了不同的值。由于原来只有一个master进程,它在parent
远程组中的rank为0
,因此所有worker都应该指定0
为root MPI_Reduce
:
//
// Worker code
//
rc = MPI_Reduce(&send, &recv, 1, MPI_INT, MPI_SUM, 0, parent);
这只是问题的一半。另一半是根集体操作(例如 MPI_REDUCE
)与内部通信器的操作有点不同。首先必须决定这两个组中的哪一个将托管根。一旦确定了根组,根进程必须将 MPI_ROOT
作为 MPI_REDUCE
中的 root
的值传递给根组中的所有其他进程必须传递 MPI_PROC_NULL
。也就是说,接收组中的进程根本不参与根集体操作。由于master代码是这样写的,因此master组中只能有一个进程,那么将master代码中对MPI_Reduce
的调用更改为:
//
// Master code
//
rc = MPI_Reduce(&send, &recv, 1, MPI_INT, MPI_SUM, MPI_ROOT, everyone);
请注意,master 本身也不参与归约操作,例如sendbuf
(在这种情况下为 &send
)的值是无关紧要的,因为根不会发送要减少的数据——它只是收集对值执行的减少的结果来自远程组中的进程。
关于c++ - MPI_Comm_spawn 和 MPI_Reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731751/
我对 MPI 很陌生,我正在尝试使用 MPI_Reduce 来查找整数数组的最大值。我有一个整数数组 arr尺寸arraysize ,这是我的代码: MPI_Init(&argc, &argv); M
我在 fortran 中遇到 MPI_REDUCE() 的精度问题。我测试了两种对存储在每个节点上的 double 数字求和的方法。我使用的 MPI_REDUCE() 行是 call MPI_REDU
只是一个问题。如果我使用函数 MPI_Reduce,只有根可以分配接收缓冲区,当这是一个动态数组时?。例如: int r = 10; int *yloc, *y; ... yloc = calloc(
我正在尝试使用 MPI_reduce() 计算跨进程分布的 1000 个数字的平均值。不幸的是,到目前为止,我的代码只给出零,而不是预期的答案(数字的算术平均值)。 我做错了什么? #include
MPI documentation断言接收缓冲区 (recvbuf) 的地址中的地址仅在根目录下才有意义。这意味着可能不会在其他进程中分配内存。 this question 证实了这一点. int M
我正在尝试在 C(或 C++)中使用 MPI_REDUCE 来查找数组中的最小值(和索引)。我有这个适用于常规数组,但现在我想切换到一个动态计算值的数组。即 arr[n] 的值是通过调用 fun(n)
我开始研究使用 C 和 OpenMPI 库进行并行编程。所以现在一切看起来都太复杂了。 我正在尝试做一个单程序多数据:掌握:- 初始化一个数组- segmentation 它- 将相同大小的位发送到不
我最近遇到了一个堰行为。如果我在我的机器上运行以下代码(使用最新版本的 cygwin,Open MPI 版本 1.8.6),我会得到一个线性增长的内存使用量,这很快就会淹没我的电脑。 program
我试图将我的处理器分成几组,然后添加每组的总和独立地......但直到现在我还无法正确找到结果。一个简单的例子如下: int main(int argc, char** argv) { int
我得到了一个小练习,我必须通过使用 MPI 来估计 n 个球体的总体积来实现蒙特卡罗算法,这些球体的中心坐标和半径在 3 维中。即使我们必须使用 MPI,我们也可以在本地机器上启动所有进程,因此没有网
我正在尝试找到随机生成的数字的最大值。对此有任何想法... 我正在使用 MPI_Scatter 将随机生成的数字分成相等的进程。我正在使用 MPI_Reduce 从每个进程中获取最大值。 #inclu
我正在尝试做一些简单的 MPI 项目(w MPICH),但在这样做时我遇到了一个我既不理解也无法解决的问题(可能是因为我误解了文档)。所以我基本上想做的是将一个结构传递给 MPI_Reduce,以便对
我的 MPI 代码有问题,当代码在多个节点 上运行时挂起。它在单个节点 上运行时成功 完成。我不确定如何调试它。有人可以帮我调试这个问题吗? 程序使用: mpicc -o string strin.c
我有一个顺序程序,它计算数值并将结果存储在一个数组中,其中每个元素代表一个数字“位置”。 例如,一个计算结果[2,4,5,1,1,8,9,3,1]表示一个十进制值2.45118931 格式是resul
当使用 MPI_reduce 时,根处理器是否也对自身应用指定的 MPI 操作? 例如,假设以下代码由包括 root 在内的所有处理器运行,root 是否将它的 local_sum 减少为 globa
我学会了使用一些 MPI 函数。当我尝试使用 MPI_Reduce 时,我在运行代码时收到检测到堆栈粉碎: #include #include #include void main(int ar
我有两个程序。产生执行一些计算的“ worker ”的“主人”,我希望主人从 worker 那里得到结果并存储总和。我正在尝试使用 MPI_Reduce 从 worker 那里收集结果,而 worke
我不明白为什么一旦我使用包含动态分配数组的自定义 MPI 数据类型,MPI_Reduce() 就会出现段错误。有人知道吗 ?以下代码在 MPI_Reduce() 内部使用 2 个处理器时会崩溃。但是,
我正在尝试使用 MPI 库用 C 语言编写程序。在我的程序中,我正在解决 TSP(但没有使用任何特殊算法......)。我的输入参数是int nCites , int xCoord[]和 int yC
我需要缩减节点从其他节点获取元素列表的拷贝(存储在 vector 中)。我定义了自己的还原函数,但它不起作用。程序终止/崩溃。 这是代码: #include #include "mpi.h" #in
我是一名优秀的程序员,十分优秀!