Commit 6a98a5afa7035c2b05e0855df8839e5030abd85b
0 parents
Exists in
master
lab1
Showing 7 changed files with 262 additions and 0 deletions Side-by-side Diff
lab1/Makefile
View file @
6a98a5a
... | ... | @@ -0,0 +1,35 @@ |
1 | +GCC = gcc | |
2 | +MPI = mpicc | |
3 | +CFLAGS = -O3 -fopenmp | |
4 | +OMP_FLAG = -fopenmp | |
5 | +RM = rm -rf | |
6 | + | |
7 | + | |
8 | +EXE = pi_ser pi_omp pi_task pi_mpi | |
9 | + | |
10 | +all : $(EXE) | |
11 | + | |
12 | +#.PHONY: all clean purge | |
13 | + | |
14 | + | |
15 | +pi_ser: pi_ser.o | |
16 | + $(GCC) $(CFLAGS) -o $@ $^ | |
17 | + | |
18 | +pi_task: pi_task.o | |
19 | + $(GCC) $(CFLAGS) -o $@ $^ | |
20 | + | |
21 | +pi_omp: pi_omp.o | |
22 | + $(GCC) $(CFLAGS) $(OMP_FLAG) -o $@ $^ | |
23 | + | |
24 | +pi_mpi: pi_mpi.o | |
25 | + $(MPI) $(CFLAGS) -o $@ $^ | |
26 | + | |
27 | +%.o :%.c | |
28 | + $(GCC) $(CFLAGS) -c -o $@ $< | |
29 | + | |
30 | + | |
31 | +clean: | |
32 | + $(RM) *.o | |
33 | + | |
34 | +purge: clean | |
35 | + $(RM) $(EXE) |
lab1/README
View file @
6a98a5a
... | ... | @@ -0,0 +1,33 @@ |
1 | +============= | |
2 | +MESOCENTRE FC | |
3 | +============= | |
4 | + | |
5 | +-------------------------LAB 1---------------------------- | |
6 | + | |
7 | +Compute PI with numerical integration (Trapezoidal rule) of: | |
8 | + | |
9 | + / 1 | |
10 | + | 4 | |
11 | + | --------- dx | |
12 | + | 1 + x^2 | |
13 | + / 0 | |
14 | + | |
15 | +Provided solution | |
16 | +----------------- | |
17 | +- pi_ser : serial version | |
18 | +- pi_task : parallel array task version | |
19 | +- pi_omp : parallel OpenMP version | |
20 | +- pi_mpi : parallel MPI version | |
21 | +- pi_matlab : Matlab version | |
22 | + | |
23 | +Howto? | |
24 | +------ | |
25 | +1- use Make to compile | |
26 | +2- submit jobs using SGE | |
27 | +3- For matlab example : | |
28 | + | |
29 | +module load matlab | |
30 | +matlab -nojvm -nodisplay -nosplash -r 'Pi_matlab(100000000);exit' | |
31 | + | |
32 | + | |
33 | +HF |
lab1/pi_matlab.m
View file @
6a98a5a
lab1/pi_mpi.c
View file @
6a98a5a
... | ... | @@ -0,0 +1,59 @@ |
1 | +#include <stdio.h> | |
2 | +#include <string.h> | |
3 | +#include "mpi/mpi.h" | |
4 | +#define N 100000000 | |
5 | + | |
6 | +int main (int argc, char** argv) | |
7 | +{ | |
8 | + int rank; | |
9 | + int size; | |
10 | + long long int n; | |
11 | + long long int i; | |
12 | + | |
13 | + double l_sum,total_sum, x, h; | |
14 | + | |
15 | + MPI_Init(NULL, NULL); | |
16 | + | |
17 | + MPI_Comm_size(MPI_COMM_WORLD, &size); | |
18 | + MPI_Comm_rank(MPI_COMM_WORLD, &rank); | |
19 | + | |
20 | + n=N; | |
21 | + | |
22 | + if(rank==0) | |
23 | + { | |
24 | + if(argc==2) | |
25 | + { | |
26 | + n = atoll(argv[1]); | |
27 | + } | |
28 | + | |
29 | + printf("MPI version with process = %d\n", size); | |
30 | + printf("Number of intervals: %lld\n", n); | |
31 | + } | |
32 | + | |
33 | + | |
34 | + MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); | |
35 | + | |
36 | + | |
37 | + h = 1.0/n; | |
38 | + | |
39 | + l_sum = 0.0; | |
40 | + | |
41 | + for (i = rank; i < n; i += size) | |
42 | + { | |
43 | + x = (i + 0.5)*h; | |
44 | + l_sum += 4.0/(1.0 + x*x); | |
45 | + } | |
46 | + | |
47 | + l_sum *= h; | |
48 | + | |
49 | + MPI_Reduce(&l_sum,&total_sum,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); | |
50 | + | |
51 | + if(rank==0) | |
52 | + { | |
53 | + printf("Pi=%0.12g\n", total_sum); | |
54 | + | |
55 | + } | |
56 | + | |
57 | + MPI_Finalize(); | |
58 | + return 0; | |
59 | +} |
lab1/pi_omp.c
View file @
6a98a5a
... | ... | @@ -0,0 +1,38 @@ |
1 | +#include <stdio.h> | |
2 | +#include <string.h> | |
3 | +#include <stdlib.h> | |
4 | +#include <omp.h> | |
5 | + | |
6 | +#define N 100000000 | |
7 | +int main (int argc, char** argv) | |
8 | +{ | |
9 | + long long int n; | |
10 | + long long int i; | |
11 | + | |
12 | + double l_sum, x, h; | |
13 | + | |
14 | + n=N; | |
15 | + | |
16 | + if(argc==2) | |
17 | + { | |
18 | + n=atol(argv[1]); | |
19 | + } | |
20 | + | |
21 | + | |
22 | + h = 1.0/n; | |
23 | + | |
24 | + l_sum = 0.0; | |
25 | + | |
26 | +#pragma omp parallel for private(i,x) reduction(+:l_sum) | |
27 | + for (i = 0; i < n; i ++) | |
28 | + { | |
29 | + x = (i + 0.5)*h; | |
30 | + l_sum += 4.0/(1.0 + x*x); | |
31 | + } | |
32 | + | |
33 | + l_sum *= h; | |
34 | + | |
35 | + printf("N=%lld,PI=%0.12g\n",n, l_sum); | |
36 | + | |
37 | + return 0; | |
38 | +} |
lab1/pi_ser.c
View file @
6a98a5a
... | ... | @@ -0,0 +1,35 @@ |
1 | +#include <stdio.h> | |
2 | +#include <stdlib.h> | |
3 | +#include <string.h> | |
4 | +#define N 100000000 | |
5 | +int main (int argc, char** argv) | |
6 | +{ | |
7 | + long long int n; | |
8 | + long long int i; | |
9 | + | |
10 | + double l_sum, x, h; | |
11 | + | |
12 | + n=N; | |
13 | + | |
14 | + if(argc==2) | |
15 | + { | |
16 | + n=atol(argv[1]); | |
17 | + } | |
18 | + | |
19 | + | |
20 | + h = 1.0/n; | |
21 | + | |
22 | + l_sum = 0.0; | |
23 | + | |
24 | + for (i = 0; i < n; i ++) | |
25 | + { | |
26 | + x = (i + 0.5)*h; | |
27 | + l_sum += 4.0/(1.0 + x*x); | |
28 | + } | |
29 | + | |
30 | + l_sum *= h; | |
31 | + | |
32 | + printf("N=%lld, PI = %0.12g\n",n ,l_sum); | |
33 | + | |
34 | + return 0; | |
35 | +} |
lab1/pi_task.c
View file @
6a98a5a
... | ... | @@ -0,0 +1,49 @@ |
1 | +#include <stdio.h> | |
2 | +#include <string.h> | |
3 | +#include <stdlib.h> | |
4 | + | |
5 | +#define N 100000000 | |
6 | + | |
7 | +int main (int argc, char** argv) | |
8 | +{ | |
9 | + int task_id; | |
10 | + int total_tasks; | |
11 | + long long int n; | |
12 | + long long int i; | |
13 | + | |
14 | + double l_sum, x, h; | |
15 | + | |
16 | + n=N; | |
17 | + | |
18 | + if(argc<3) | |
19 | + { | |
20 | + fprintf(stderr,"Usage : %s task_id total_tasks [n]\n",argv[0]); | |
21 | + exit(0); | |
22 | + } | |
23 | + | |
24 | + task_id = atoi(argv[1]); | |
25 | + total_tasks = atoi(argv[2]); | |
26 | + | |
27 | + if(argc==4) | |
28 | + { | |
29 | + n = atoll(argv[3]); | |
30 | + } | |
31 | + | |
32 | + fprintf(stderr, "task_id=%d total_tasks=%d n=%lld\n", task_id, total_tasks, n); | |
33 | + | |
34 | + h = 1.0/n; | |
35 | + | |
36 | + l_sum = 0.0; | |
37 | + | |
38 | + for (i = task_id; i < n; i += total_tasks) | |
39 | + { | |
40 | + x = (i + 0.5)*h; | |
41 | + l_sum += 4.0/(1.0 + x*x); | |
42 | + } | |
43 | + | |
44 | + l_sum *= h; | |
45 | + | |
46 | + printf("Pi=%0.12g\n", l_sum); | |
47 | + | |
48 | + return 0; | |
49 | +} |