gpt4 book ai didi

c - MPI_Finalize() 没有完成

转载 作者:IT王子 更新时间:2023-10-29 01:10:31 25 4
gpt4 key购买 nike

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com