。。。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <mpi.h>
double f(double x) {
return 4.0 / (1.0 + x * x);
}
int main(int argc, char **argv) {
int rank, size, i, n;
double pi, h, sum, x;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (argc != 2) {
if (rank == 0) {
printf("Usage: mpiexec -n <num_procs> %s <num_steps>\n", argv[0]);
}
MPI_Finalize();
return 1;
} else {
n = atoi(argv[1]);
}
// 梯形积分法
double start_time_trap = MPI_Wtime(); // 记录开始时间
h = 1.0 / n;
int chunk = n / size;
int start = rank * chunk;
int end = (rank == size - 1) ? n : (rank + 1) * chunk;
sum = 0.0;
for (i = start; i < end; i++) {
x = h * (i + 0.5);
sum += f(x);
}
sum *= h;
MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); // 结果汇总
if (rank == 0) {
double end_time_trap = MPI_Wtime(); // 记录结束时间
printf("Using trapezoidal rule with %d processes, %d steps, pi = %.16f, time = %f s\n", size, n, pi, end_time_trap - start_time_trap);
}
// 蒙特卡洛法
int total_samples = atoi(argv[1]) / size;
double start_time_monte = MPI_Wtime(); // 记录开始时间
srand(time(NULL) + rank * 1000);
count = 0;
for (i = 0; i < total_samples; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
if (x * x + y * y <= 1.0) {
count++;
}
}
int global_count;
MPI_Reduce(&count, &global_count, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); // 结果汇总
if (rank == 0) {
double end_time_monte = MPI_Wtime(); // 记录结束时间
pi = 4.0 * (double)global_count / (double)atoi(argv[1]);
printf("Using Monte Carlo method with %d processes, %d samples, pi = %.16f, time = %f s\n", size, atoi(argv[1]), pi, end_time_monte - start_time_monte);
}
MPI_Finalize();
return 0;
}