commit 74c67290c2c5b31fe3339d26a0760b24805debea Author: Sebastián Santisi Date: Wed Jun 12 22:01:36 2024 +0000 Commit inicial diff --git a/00_pi.c b/00_pi.c new file mode 100644 index 0000000..6ea47c1 --- /dev/null +++ b/00_pi.c @@ -0,0 +1,29 @@ +#include +#include +#include + +int main(int argc, char *argv[]) { + if(argc != 2) { + fprintf(stderr, "Uso: %s \n", argv[0]); + return 1; + } + + size_t tiros = atoi(argv[1]); + + size_t positivos = 0; + + for(size_t i = 0; i < tiros; i++) { + double x = (double)random() / RAND_MAX; + double y = (double)random() / RAND_MAX; + if(x * x + y * y < 1) + positivos++; + } + + double pi = 4.0 * positivos / tiros; + + printf("Tiros = %zd, Positivos = %zd\n", tiros, positivos); + printf("π ~= %.15f\n", pi); + printf("ε = %f%%\n", 100 * fabs(M_PI - pi) / M_PI); + return 0; +} + diff --git a/01_pi_seed.c b/01_pi_seed.c new file mode 100644 index 0000000..4b9aeb5 --- /dev/null +++ b/01_pi_seed.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + if(argc != 2) { + fprintf(stderr, "Uso: %s \n", argv[0]); + return 1; + } + + srand(time(NULL)); + + size_t tiros = atoi(argv[1]); + + size_t positivos = 0; + + for(size_t i = 0; i < tiros; i++) { + double x = (double)random() / RAND_MAX; + double y = (double)random() / RAND_MAX; + if(x * x + y * y < 1) + positivos++; + } + + double pi = 4.0 * positivos / tiros; + + printf("Tiros = %zd, Positivos = %zd\n", tiros, positivos); + printf("π ~= %.15f\n", pi); + printf("ε = %f%%\n", 100 * fabs(M_PI - pi) / M_PI); + return 0; +} + diff --git a/02_pi_openmp.c b/02_pi_openmp.c new file mode 100644 index 0000000..093734e --- /dev/null +++ b/02_pi_openmp.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + if(argc != 2) { + fprintf(stderr, "Uso: %s \n", argv[0]); + return 1; + } + + printf("Hilos: %d\n", omp_get_max_threads()); + + size_t tiros = atoi(argv[1]); + + size_t positivos = 0; + + #pragma omp parallel reduction(+: positivos) + { + int seed = time(NULL) + omp_get_thread_num(); + + #pragma omp for + for(size_t i = 0; i < tiros; i++) { + double x = (double)rand_r(&seed) / RAND_MAX; + double y = (double)rand_r(&seed) / RAND_MAX; + if(x * x + y * y < 1) + positivos++; + } + } + + double pi = 4.0 * positivos / tiros; + + printf("Tiros = %zd, Positivos = %zd\n", tiros, positivos); + printf("π ~= %.15f\n", pi); + printf("ε = %f%%\n", 100 * fabs(M_PI - pi) / M_PI); + return 0; +} + diff --git a/03_pi_mpi.c b/03_pi_mpi.c new file mode 100644 index 0000000..dc2cf4c --- /dev/null +++ b/03_pi_mpi.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include + + +int main(int argc, char *argv[]) { + if(argc != 2) { + fprintf(stderr, "Uso: %s \n", argv[0]); + return 1; + } + + int my_rank, num_procs; + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &num_procs); + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + if(! my_rank) + printf("Procesos: %d\n", num_procs); + + srand(time(NULL) + my_rank); + + size_t tiros = atol(argv[1]); + tiros = tiros / num_procs * num_procs; + + size_t positivos_parciales = 0; + for(size_t i = 0; i < tiros / num_procs; i++) { + double x = (double)random() / RAND_MAX; + double y = (double)random() / RAND_MAX; + if(x * x + y * y < 1) + positivos_parciales++; + } + + size_t positivos; + MPI_Reduce(&positivos_parciales, &positivos, 1, MPI_LONG, MPI_SUM, 0, MPI_COMM_WORLD); + + if(! my_rank) { + double pi = 4.0 * positivos / tiros; + + printf("Tiros = %zd, Positivos = %zd\n", tiros, positivos); + printf("π ~= %.15f\n", pi); + printf("ε = %f%%\n", 100 * fabs(M_PI - pi) / M_PI); + } + + MPI_Finalize(); + + return 0; +} + diff --git a/hola_mpi.c b/hola_mpi.c new file mode 100644 index 0000000..a91d1ff --- /dev/null +++ b/hola_mpi.c @@ -0,0 +1,25 @@ +#include +#include + +int main(int argc, char *argv[]) { + int my_rank, num_procs; + char nombre[MPI_MAX_PROCESSOR_NAME]; + int len; + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &num_procs); + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + MPI_Get_processor_name(nombre, &len); + + + if(! my_rank) { + printf("¡Holas generales!\n"); + printf("Procesos: %d\n", num_procs); + } + + printf("¡Hola desde el proceso %d en %s!\n", my_rank, nombre); + + MPI_Finalize(); + + return 0; +} + diff --git a/hola_openmp.c b/hola_openmp.c new file mode 100644 index 0000000..5d2bf89 --- /dev/null +++ b/hola_openmp.c @@ -0,0 +1,17 @@ +#include +#include +#include +#include +#include + +int main(void) { + printf("¡Holas generales!\n"); + + printf("Hilos: %d\n", omp_get_max_threads()); + + #pragma omp parallel + printf("¡Hola desde el hilo %d!\n", omp_get_thread_num()); + + return 0; +} + diff --git a/slurm-03_pi_mpi b/slurm-03_pi_mpi new file mode 100644 index 0000000..22abdad --- /dev/null +++ b/slurm-03_pi_mpi @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +#SBATCH -o slurm.out +#SBATCH -e slurm.err +#SBATCH -N 2 +#SBATCH --ntasks-per-node 32 +#SBATCH --partition=debug +#SBATCH --time=3-0:0 + +time mpirun -mca pml ucx --mca btl ^vader,tcp,openib,uct -x UCX_NET_DEVICES=mlx4_0:1 ./03_pi_mpi 10000000000 + diff --git a/slurm-hola b/slurm-hola new file mode 100644 index 0000000..841155c --- /dev/null +++ b/slurm-hola @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +#SBATCH -o slurm.out +#SBATCH -e slurm.err +#SBATCH -N 2 +#SBATCH --ntasks-per-node 32 +#SBATCH --partition=debug +#SBATCH --time=3-0:0 + +mpirun ./hola_mpi +