【发布时间】:2019-09-15 21:07:28
【问题描述】:
我尝试使用蒙特卡罗方法评估 pi 值。更准确地说,使用圆周法。
最初我写了一个迭代次数是固定的代码。现在,我试图模拟代码在输入增长时的行为。
为此,我编写了这段代码,但它不起作用:
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mpi.h>
#define SEED time(NULL)
int main(int argc, char **argv) {
int rank, size;
unsigned int seed;
double x, y, start, end;
long long int i, j, all_point, points = 0, all_intern;
long long int dim[] = {5, 50, 500, 5000, 50000, 500000, 5000000, 50000000};
MPI_Init(&argc, &argv);
start = MPI_Wtime();
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
seed = SEED + rank;
for ( j = 0; j < 8; j++ ) {
for ( i = 0; i < dim[j]; i++ ) {
x = (double) rand_r(&seed) / RAND_MAX;
y = (double) rand_r(&seed) / RAND_MAX;
if ( x * x + y * y <= 1.0 ) points++;
}
MPI_Reduce(&points, &all_intern, 1, MPI_LONG_LONG_INT, MPI_SUM, 0, MPI_COMM_WORLD);
all_point = dim[j] * size;
MPI_Barrier(MPI_COMM_WORLD);
end = MPI_Wtime();
if ( rank == 0 ) {
printf("\u03C0 \u2248 %Lf\n", (long double) all_intern / all_point * 4.0);
printf("Time elapsed: %.4f\n", end - start);
}
}
MPI_Finalize();
return 0;
}
【问题讨论】:
-
不起作用是什么意思?
-
@Chelmy88 它评估了错误的 pi 值。如果您固定迭代次数,则打印的 pi 值是正确的
-
我认为当你进入
j循环时points应该重置为0,或者如果你想保留以前的迭代,所有all_points应该是dim<=j的总和。跨度> -
@Chelmy88 你能解释得更好吗?
-
"它评估错误的 pi 值" --> 发布您的输出和预期输出会有所帮助。
标签: c mpi simulation