- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
#include <stdio.h>
#include <math.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int i, done = 0, n;
double PI25DT = 3.141592653589793238462643;
double pi, tmp, h, sum, x;
int numprocs, rank;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (numprocs < 1)
printf("numprocs = %d, should be run with numprocs > 1\n", numprocs);
else {
while (!done)
{
if (rank == 0) {
printf("Enter the number of intervals: (0 quits) \n");
scanf("%d",&n);
}
if (n == 0) break;
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
h = 1.0 / (double) n;
sum = 0.0;
for (i = 1 + rank; i <= n; i+=numprocs) {
x = h * ((double)i - 0.5);
sum += 4.0 / (1.0 + x*x);
}
MPI_Reduce(&sum, &tmp, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0) {
pi = h * tmp;
printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
}
}
}
MPI_Finalize();
}
我在 number of processes = 10 和在 scanf("%d", &n); 中输入 0 后运行这个程序;该程序似乎没有完成,我必须使用 Ctrl+C 关闭它。
10 total processes killed (some possibly by mpirun during cleanup) mpirun: clean termination accomplished
杀死进程后出现在控制台。
最佳答案
当然可以。看看这里发生了什么:
if (rank == 0) {
printf("Enter the number of intervals: (0 quits) \n");
scanf("%d",&n);
}
if (n == 0) break;
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
如果您在等级 0 上输入“0”,则等级 0 中断,但所有其他等级都保留上次 n 中的所有内容(或者,在第一次迭代的情况下,该内存中的任何随机内容地点)。于是ranks 1-(N-1)进入了MPI_Bcast
,耐心等待参与广播,找出n
是什么,同时rank 0已经退出循环,正坐在 MPI_Finalize
想知道其他人在哪里。
你只需要翻转这些线:
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0) break;
现在大家同时决定是否跳出循环。
关于c - MPI_Finalize() 没有完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10195812/
我正在使用 openMPI,而且我有一个奇怪的错误。 看来,即使在 MPI_Finalize() 之后,每个线程仍在运行。 我遵循了一个简单的 Hello World 程序的指南,它看起来像这样: #
我对以下代码有疑问: 大师: #include using namespace std; #include "mpi.h" #include #include #include #define
我有第一个进程 (test1),它动态生成第二个进程 (test2),然后等待从生成的组接收带有标记 1 的消息。生成的进程执行一些计算,然后向父组(包含第一个进程)发送一 strip 有标记 1 的
MPI 规范规定在每个线程退出前调用 MPI_Finalize。它如何处理断言等运行时错误? 如果我 assert(cond) 并且 cond 的计算结果为 false,我就没有机会调用 MPI_Fi
#include #include #include int main(int argc, char *argv[]) { int i, done = 0, n; double
我正在使用 openMPI 在 C 中编程。我的代码贴在下面。发生的事情是,每当我运行这个程序时,我都会收到一个段错误。我相信我已经通过使用这些 printf 语句隔离了问题。分段似乎发生在 MPI_
我遇到了 MPI_Finalize 的问题。当我可以 MPI_Finalize(); 时,我在程序末尾遇到了一个段错误,输出如下: A matrix = 48.3962 65.3245 15.0385
您好,对于具有多个 .hp 和 .cpp 文件的 C++ 大型 mpi 项目,是否应该有 MPI_Finalize();在每个使用 mpi 函数的头文件或 cpp 文件的末尾?还是应该在主 cpp 文
我正在编写一个简单的代码来学习如何定义 MPI_Datatype 并将其与 MPI_Gatherv 结合使用。我想确保我可以在一个进程中组合可变长度、动态分配的结构化数据数组,这似乎工作正常,直到我调
首先,我明确地说,我是法国人,而且我的英语不太好。 我正在开发 MPI 应用程序,遇到一些问题,希望有人可以帮助我。 正如我的文章标题中所报道的,当我必须终止我的应用程序然后调用 MPI_Finali
我正在尝试使用 MPI_Comm_Spawn 运行一个 mpi 程序。我生成 1 个工作程序,然后在两个程序中调用 MPI_reduce,以添加一些结果。出于某种原因,应用程序在 MPI_Comm_s
我是一名优秀的程序员,十分优秀!