From 50bf605b19ba030a9c39a41ecf6021f2ae25d748 Mon Sep 17 00:00:00 2001 From: Erik Strand <erik.strand@cba.mit.edu> Date: Sat, 6 Mar 2021 13:17:27 -0500 Subject: [PATCH] Add MPI pi calculation (CPU) --- mpi_pi_cpu/.gitignore | 2 ++ mpi_pi_cpu/Makefile | 2 ++ mpi_pi_cpu/load_modules.sh | 5 ++++ mpi_pi_cpu/mpi_pi_cpu.c | 53 +++++++++++++++++++++++++++++++++++++ mpi_pi_cpu/mpi_pi_cpu.slurm | 15 +++++++++++ 5 files changed, 77 insertions(+) create mode 100644 mpi_pi_cpu/.gitignore create mode 100644 mpi_pi_cpu/Makefile create mode 100755 mpi_pi_cpu/load_modules.sh create mode 100644 mpi_pi_cpu/mpi_pi_cpu.c create mode 100644 mpi_pi_cpu/mpi_pi_cpu.slurm diff --git a/mpi_pi_cpu/.gitignore b/mpi_pi_cpu/.gitignore new file mode 100644 index 0000000..130dcdd --- /dev/null +++ b/mpi_pi_cpu/.gitignore @@ -0,0 +1,2 @@ +mpi_pi_cpu +output diff --git a/mpi_pi_cpu/Makefile b/mpi_pi_cpu/Makefile new file mode 100644 index 0000000..928fa28 --- /dev/null +++ b/mpi_pi_cpu/Makefile @@ -0,0 +1,2 @@ +mpi_pi_cpu: mpi_pi_cpu.c + mpicc $< -o $@ diff --git a/mpi_pi_cpu/load_modules.sh b/mpi_pi_cpu/load_modules.sh new file mode 100755 index 0000000..8190933 --- /dev/null +++ b/mpi_pi_cpu/load_modules.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +module purge +module load spack git gcc/7.3.0 openmpi/3.1.4-pmi-cuda-ucx + diff --git a/mpi_pi_cpu/mpi_pi_cpu.c b/mpi_pi_cpu/mpi_pi_cpu.c new file mode 100644 index 0000000..dae3498 --- /dev/null +++ b/mpi_pi_cpu/mpi_pi_cpu.c @@ -0,0 +1,53 @@ +/* +* mpipi.c +* Neil Gershenfeld 2/5/11 +* Erik Strand 3/6/2021 +* use MPI to evaluate pi by summation +*/ + +#include <stdio.h> +#include <mpi.h> +#include <sys/time.h> + +// number of terms evaluated by each process +#define NPTS 100000 + +void main(int argc, char** argv) { + // variables used by all ranks + int rank, i, istart, iend; + double sum, pi; + + // variables used only by rank 0 + unsigned long int start_time, end_time; + struct timeval start, end; + int nproc; + double mflops; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == 0) { + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + gettimeofday(&start, NULL); + } + + istart = NPTS * rank; + iend = NPTS * (rank + 1); + sum = 0.0; + for (i = istart; i <= iend; ++i) { + sum += 0.5 / ((i - 0.75) * (i - 0.25)); + } + MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + + if (rank == 0) { + gettimeofday(&end, NULL); + start_time = start.tv_sec * 1e6 + start.tv_usec; + end_time = end.tv_sec * 1e6 + end.tv_usec; + mflops = (double)nproc * NPTS * 5.0 / (end_time - start_time); + printf("processes = %d, terms per process = %ld, total terms = %ld\n", nproc, NPTS, nproc * NPTS); + printf("time = %f, estimated MFlops = %f\n", (end_time - start_time) / 1.0e6, mflops); + printf("pi ~ %f\n", pi); + } + + MPI_Finalize(); +} diff --git a/mpi_pi_cpu/mpi_pi_cpu.slurm b/mpi_pi_cpu/mpi_pi_cpu.slurm new file mode 100644 index 0000000..f224a2e --- /dev/null +++ b/mpi_pi_cpu/mpi_pi_cpu.slurm @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH -J mpi_pi_cpu +#SBATCH -o output/mpi_pi_cpu_%j.out +#SBATCH -e output/mpi_pi_cpu_%j.err +#SBATCH --nodes=2 +#SBATCH --ntasks-per-node=8 +#SBATCH --gres=gpu:0 +#SBATCH --cpus-per-task=1 +#SBATCH --ntasks-per-core=1 +#SBATCH --threads-per-core=1 +#SBATCH --mem=1G +#SBATCH --time 00:05:00 + +source ./load_modules.sh +srun ./mpi_pi_cpu -- GitLab