欢迎光临散文网 会员登陆 & 注册

。。。

2023-05-26 20:10 作者:释o怀灬  | 我要投稿

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

}


。。。的评论 (共 条)

分享到微博请遵守国家法律