From 83d5aaf9685578a02642e6e50060341a6611a169 Mon Sep 17 00:00:00 2001 From: Kirill <kirill.kolesnikov@etu.unistra.fr> Date: Tue, 26 Nov 2024 12:33:16 +0100 Subject: [PATCH] Encore des tps --- .../TPnote2024/Parallele_S6.code-workspace | 11 + Mec_discord/annales/TPnote2024/covariance | Bin 0 -> 17856 bytes Mec_discord/annales/TPnote2024/covariance.c | 126 ++++++ Mec_discord/annales/TPnote2024/gather | Bin 0 -> 17688 bytes Mec_discord/annales/TPnote2024/gather.c | 121 +++++ Mec_discord/annales/TPnote2024/tri | Bin 0 -> 18024 bytes Mec_discord/annales/TPnote2024/tri_fusion.c | 147 ++++++ Mec_discord/annales/test.c | 0 Mec_discord/annales/tp1_openmp_codes/ex1 | Bin 0 -> 17032 bytes Mec_discord/annales/tp1_openmp_codes/ex2 | Bin 0 -> 17240 bytes Mec_discord/annales/tp1_openmp_codes/ex3 | Bin 0 -> 17656 bytes Mec_discord/annales/tp1_openmp_codes/ex4 | Bin 0 -> 17648 bytes Mec_discord/annales/tp1_openmp_codes/ex5 | Bin 0 -> 17656 bytes Mec_discord/annales/tp1_openmp_codes/ex6 | Bin 0 -> 17744 bytes Mec_discord/annales/tp1_openmp_codes/ex7 | Bin 0 -> 17696 bytes .../annales/tp1_openmp_codes/tp0_1_hello.c | 11 + .../tp0_1_hello.c:Zone.Identifier | 3 + .../annales/tp1_openmp_codes/tp0_2_for.c | 29 ++ .../tp0_2_for.c:Zone.Identifier | 3 + .../annales/tp1_openmp_codes/tp1_3_addvec.c | 71 +++ .../tp1_3_addvec.c:Zone.Identifier | 3 + .../annales/tp1_openmp_codes/tp1_4_sum.c | 68 +++ .../tp1_4_sum.c:Zone.Identifier | 3 + .../annales/tp1_openmp_codes/tp1_5_matvec.c | 81 ++++ .../tp1_5_matvec.c:Zone.Identifier | 3 + .../tp1_openmp_codes/tp1_6_stencil1d.c | 81 ++++ .../tp1_6_stencil1d.c:Zone.Identifier | 3 + .../tp1_openmp_codes/tp1_7_reductionreinit.c | 92 ++++ .../tp1_7_reductionreinit.c:Zone.Identifier | 3 + .../tp1_openmp_codes/tp1_8_polynomial.c | 87 ++++ .../tp1_8_polynomial.c:Zone.Identifier | 3 + .../._tp2_1_matmat.c | Bin 0 -> 176 bytes .../._tp2_3_enumeration_sort.c | Bin 0 -> 176 bytes .../annales/tp2_parallelisation_codes/bubble | Bin 0 -> 17760 bytes .../annales/tp2_parallelisation_codes/enum | Bin 0 -> 17824 bytes .../tp2_parallelisation_codes/tp2_1_matmat.c | 82 ++++ .../tp2_parallelisation_codes/tp2_2_pi.c | 76 ++++ .../tp2_3_enumeration_sort.c | 122 +++++ .../tp2_4_bubble_sort.c | 119 +++++ .../._tp3_1_nb_threads.c | Bin 0 -> 176 bytes .../._tp3_4_fibonacci.c | Bin 0 -> 176 bytes .../tp3_synchronisation_et_taches_codes/ex1 | Bin 0 -> 17128 bytes .../tp3_synchronisation_et_taches_codes/ex2 | Bin 0 -> 17816 bytes .../tp3_synchronisation_et_taches_codes/ex3 | Bin 0 -> 17936 bytes .../tp3_synchronisation_et_taches_codes/ex4 | Bin 0 -> 17792 bytes .../mandel.c | 227 ++++++++++ .../rasterfile.h | 50 +++ .../tp3_1_nb_threads.c | 16 + .../tp3_2_primes.c | 123 +++++ .../tp3_3_dag.c | 109 +++++ .../tp3_4_fibonacci.c | 92 ++++ Mec_discord/annales/tpMPI/annale | Bin 0 -> 18136 bytes Mec_discord/annales/tpMPI/annale.c | 373 ++++++++++++++++ Mec_discord/annales/tpMPI/hello | Bin 0 -> 17128 bytes Mec_discord/annales/tpMPI/hello.c | 22 + Mec_discord/annales/tpMPI/ping.c | 59 +++ Mec_discord/annales/tpMPI/prodmat | Bin 0 -> 17640 bytes Mec_discord/annales/tpMPI/prodmat.c | 107 +++++ Mec_discord/annales/tpMPI/tri | Bin 0 -> 17728 bytes Mec_discord/annales/tpMPI/tri_qs_fusion.c | 148 ++++++ Mec_discord/annales/tri_fusion_first_try.c | 420 ++++++++++++++++++ 61 files changed, 3094 insertions(+) create mode 100644 Mec_discord/annales/TPnote2024/Parallele_S6.code-workspace create mode 100644 Mec_discord/annales/TPnote2024/covariance create mode 100644 Mec_discord/annales/TPnote2024/covariance.c create mode 100644 Mec_discord/annales/TPnote2024/gather create mode 100644 Mec_discord/annales/TPnote2024/gather.c create mode 100644 Mec_discord/annales/TPnote2024/tri create mode 100644 Mec_discord/annales/TPnote2024/tri_fusion.c create mode 100644 Mec_discord/annales/test.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/ex1 create mode 100644 Mec_discord/annales/tp1_openmp_codes/ex2 create mode 100644 Mec_discord/annales/tp1_openmp_codes/ex3 create mode 100644 Mec_discord/annales/tp1_openmp_codes/ex4 create mode 100644 Mec_discord/annales/tp1_openmp_codes/ex5 create mode 100644 Mec_discord/annales/tp1_openmp_codes/ex6 create mode 100644 Mec_discord/annales/tp1_openmp_codes/ex7 create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c create mode 100644 Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c:Zone.Identifier create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/._tp2_1_matmat.c create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/._tp2_3_enumeration_sort.c create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/bubble create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/enum create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/tp2_1_matmat.c create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/tp2_2_pi.c create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/tp2_3_enumeration_sort.c create mode 100644 Mec_discord/annales/tp2_parallelisation_codes/tp2_4_bubble_sort.c create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/._tp3_1_nb_threads.c create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/._tp3_4_fibonacci.c create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex1 create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex2 create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex3 create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex4 create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/mandel.c create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/rasterfile.h create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_1_nb_threads.c create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_2_primes.c create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_3_dag.c create mode 100644 Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_4_fibonacci.c create mode 100644 Mec_discord/annales/tpMPI/annale create mode 100644 Mec_discord/annales/tpMPI/annale.c create mode 100644 Mec_discord/annales/tpMPI/hello create mode 100644 Mec_discord/annales/tpMPI/hello.c create mode 100644 Mec_discord/annales/tpMPI/ping.c create mode 100644 Mec_discord/annales/tpMPI/prodmat create mode 100644 Mec_discord/annales/tpMPI/prodmat.c create mode 100644 Mec_discord/annales/tpMPI/tri create mode 100644 Mec_discord/annales/tpMPI/tri_qs_fusion.c create mode 100644 Mec_discord/annales/tri_fusion_first_try.c diff --git a/Mec_discord/annales/TPnote2024/Parallele_S6.code-workspace b/Mec_discord/annales/TPnote2024/Parallele_S6.code-workspace new file mode 100644 index 0000000..af98cda --- /dev/null +++ b/Mec_discord/annales/TPnote2024/Parallele_S6.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": ".." + }, + { + "path": "../../projet-progparallele-IL3-2324" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/Mec_discord/annales/TPnote2024/covariance b/Mec_discord/annales/TPnote2024/covariance new file mode 100644 index 0000000000000000000000000000000000000000..85eacbc210d9a16ced3b6973bb9189a531b9cbde GIT binary patch literal 17856 zcmeHPeRNwzb{|=CVnSjokTfQIL}bO*0j${hs!cISj-5P#LbAajflVS5OOAE0Wup&B zIDw5Z0n{Mk_ACMR?4E{p+ugHmmvk4-h8{S`aTE;QT^xG4Kw*pdT4W9%iGX075cPN8 zoBRCqBJK9`^dC>o^PT&fduQ(4xij<L)0=#!)win5ViBCI;u=AmW3Gm{x!@Yk2;mkD zVix``5SNH)fNi+kve-;tE7J;?R!BK3DCt#GrU<=Ag9THzkSOVuN(X0XB}|1~<4Lca zvXVE`N6yvcm~y$^o<l1aCi<A{A5)_q`NmPJ={cGT>2awyE-C8~OL}!uuTJVQ6)Z0) z`;&Y^SA+DYnL1EL$)Wxg!mPJR>X~ValxIq9P`dH`c<{f|-a4swz@b(n%yhE`3#Q!O zx1dLU`OhXE=Jm3@QsXcx{m9fJ8(7>G-nL@d;;vwAS2&W`QM;pIMeT}Zu2_$2i7G*M zQ5zIft8dsq!;&UUx=|gAIg+RH@j20b12_NldymAEvsP^jeR%sPw_MD1P@5z}iS&7h ziKqNLTqL9QzYjSLBYG_K>u#c@(o!g%SER5Kn4<{(0kC57UzflSmB2$K@K_1_qY}8S zg#DM6z~3%W&ksxB_m{vg2kyXSP7wgb{Bv#zdtNRfe`5*!%@TMca0f1P+7F<ZJ@1sj z&x4%{&6N<3c;DXB-AfT(FZ|xNHU3~I8rmL?#Y54yH7mP%BB8dxwyu!y`?q)ZMEtRM zAR71kHPNDitJkhs=MThty2I_7v_Sp-?V-5;&Um;xq;v7kXebc$M-tt_s1k|<HNH0x z4Rm#dx^x9d`ZcAPCb2CLjfO)}>O(tqU<HiqjfNxf4u5;+Z6dTI92c=@02THo;xQD$ z`1aeV%-<0RcL~_k8xD%@P<Jd87u{&BryWx5I|BZWa3s(bzKgm|waadI2f`825e<d3 z_LsTp1a)=^sM>{k%J{s^D*-KaEz|Rpxh1aUa5~NIGW@e*y(q{0rhFN4+A2^crXxo( z6)KJl)&UzXZS7eHI`WNgVi~Cr4FG99ayyAH7uPX=8SysZk^D#v@mArbN{}qbXFz$q zj9(BwN1)yHQhrW2Jd0MIt&&g7r}8q<DfM|@<NZYZky@>&k^2_oX?Z_U;nvC-Xa2Qo zHJsKs>M^HL11`6AwJ2-AX)WV)+<?>i%W2$z(|XEDk@$1~vP){wIs?vYIu&d(;Bcg# zZZ+WQeTFRQG~mYltJi>2+njb7aP|?E?Ka>T06jfuz~wEBS~g(7XX?^IJZ8W#uzEUR zz^imrh#wnpju9$8XuxM1<PRBe<GPeK;O86UhYh$45w�fXk3FXia6OJTT>fDGy9} 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/TPnote2024/covariance.c b/Mec_discord/annales/TPnote2024/covariance.c new file mode 100644 index 0000000..19871e1 --- /dev/null +++ b/Mec_discord/annales/TPnote2024/covariance.c @@ -0,0 +1,126 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <math.h> +#include <omp.h> + +#define ERROR 1.e-6 // Acceptable precision +#define MAX_VAL 5. // Random values are [0, MAX_VAL] + +// Matrix size +#define N 4000 +#define M 1000 + +#define TYPE float + +// Computation kernel (to parallelize) +void covariance_kernel(TYPE data[N][M], TYPE cov[M][M], TYPE mean[M]) +{ + #pragma omp parallel + { + int i, j, k; + #pragma omp for private(i) + for ( j = 0; j < M; j++) + { + mean[j] = 0.; + for ( i = 0; i < N; i++) + mean[j] += data[i][j]; + mean[j] /= N; + } + + #pragma omp for private(j) + for ( i = 0; i < N; i++) + for ( j = 0; j < M; j++) + data[i][j] -= mean[j]; + + #pragma omp for private(j,k) reduction(+: cov[:M][:M]) + for ( i = 0; i < M; i++) + for ( j = i; j < M; j++) + { + cov[i][j] = 0.; + for (k = 0; k < N; k++) + cov[i][j] += data[k][i] * data[k][j]; + cov[i][j] /= (N - 1.); + cov[j][i] = cov[i][j]; + } + } +} + +// Reference computation kernel (do not touch) +void covariance_reference(TYPE data[N][M], TYPE cov[M][M], TYPE mean[M]) +{ + for (int j = 0; j < M; j++) + { + mean[j] = 0.; + for (int i = 0; i < N; i++) + mean[j] += data[i][j]; + mean[j] /= N; + } + + for (int i = 0; i < N; i++) + for (int j = 0; j < M; j++) + data[i][j] -= mean[j]; + + for (int i = 0; i < M; i++) + for (int j = i; j < M; j++) + { + cov[i][j] = 0.; + for (int k = 0; k < N; k++) + cov[i][j] += data[k][i] * data[k][j]; + cov[i][j] /= (N - 1.); + cov[j][i] = cov[i][j]; + } +} + +// MAIN +int main() +{ + TYPE (*data)[M] = malloc(N * M * sizeof(TYPE)); + TYPE (*cov)[M] = malloc(M * M * sizeof(TYPE)); + TYPE *mean = malloc(M * sizeof(TYPE)); + TYPE (*data_ref)[M] = malloc(N * M * sizeof(TYPE)); + TYPE (*cov_ref)[M] = malloc(M * M * sizeof(TYPE)); + TYPE *mean_ref = malloc(M * sizeof(TYPE)); + double time_reference, time_kernel, speedup; + + // INITIALIZATION + srand(time(NULL)+getpid()); + for (size_t i = 0; i < N; i++) + for (size_t j = 0; j < M; j++) + data[i][j] = data_ref[i][j] = (TYPE)rand()/(RAND_MAX/MAX_VAL); + + // REFERENCE CALL + time_reference = omp_get_wtime(); + covariance_reference(data_ref, cov_ref, mean_ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + // KERNEL CALL + time_kernel = omp_get_wtime(); + covariance_kernel(data, cov, mean); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + printf("Speedup ------ : %3.5lf\n", speedup); + + // Check if the result differs from the reference + for (size_t i = 0; i < M; i++) { + for (size_t j = i; j < M; j++) { + if (fabs(cov_ref[i][j] - cov[i][j]) > ERROR) + { + printf("Bad results :-(((\n"); + exit(1); + } + } + } + printf("OK results :-)\n"); + + free(data); + free(cov); + free(mean); + free(cov_ref); + free(mean_ref); + return 0; +} diff --git a/Mec_discord/annales/TPnote2024/gather b/Mec_discord/annales/TPnote2024/gather new file mode 100644 index 0000000000000000000000000000000000000000..7285c7c7b4f65492ce17946be50c87e5f9131f10 GIT binary patch literal 17688 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 A&;S4c literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/TPnote2024/gather.c b/Mec_discord/annales/TPnote2024/gather.c new file mode 100644 index 0000000..065c1cb --- /dev/null +++ b/Mec_discord/annales/TPnote2024/gather.c @@ -0,0 +1,121 @@ +// TP noté de programmation parallèle - exercice MPI - IL3S6P 2023/2024. +#include <stdio.h> +#include <unistd.h> +#include <time.h> +#include <stdlib.h> +#include <string.h> +#include <mpi.h> + +// affichage en couleurs : +#define YEL "\033[33m" +#define RED "\033[31m" +#define GREEN "\033[32m" +#define NORM "\033[0m" + +// taille du tableau par défaut [test2] +#define N 13 + +// variables globales, initialisées au début de main() +int rank, size; + + +// Fonction à écrire : +void mon_gather(void *sbuf, void *rbuf, int count, MPI_Datatype type, + int root, MPI_Comm comm) +{ + // cette fonction doit faire la même chose que : + // MPI_Gather(sbuf, count, type, rbuf, count, type, root, comm); + // * sans utiliser de communication collective. * + + + + for(int i = 0 ;i < size; i++ ) + if(rank == i) { + void *tosend = sbuf + i*(count/size); + MPI_Send(tosend,count/size,type, 0,0,comm); + + + if (i == 0 ) + { + + MPI_Recv(rbuf + (i*(count/size)), count/size,type,i,0,comm,NULL) ; + } + } + + + + return; +} + + +// Programme de test, ne nécessite pas de modification. +int main( int argc, char **argv ) +{ + srand(time(0)+getpid()); + // init + MPI_Init(&argc,&argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + if(rank==0) + printf("Nb process: %d\n", size); + + + // test 1 : un caractère sur root=0 + char c = 'a' + rand()%26; + char s_mon[size+1], s_mpi[size+1]; + s_mon[0] = s_mon[size] = s_mpi[size] = '\0'; + + mon_gather(&c, s_mon, 1, MPI_CHAR, 0, MPI_COMM_WORLD); + MPI_Gather(&c, 1, MPI_CHAR, s_mpi, 1, MPI_CHAR, 0, MPI_COMM_WORLD); + + if(rank==0 && argc==1) + { + printf(YEL"[test1] "NORM); + if(strncmp(s_mon, s_mpi, size)) + { + printf(RED"Failed!"NORM" ('%s' != '%s')\nAborting\n", s_mon, s_mpi); + MPI_Abort(MPI_COMM_WORLD, 1); + exit(1); + } + printf(GREEN"OK"NORM" results\n"); + } + + // synchro pour attendre le abort() éventuel du test1... + MPI_Barrier(MPI_COMM_WORLD); + + // test 2 : tableau de N longs sur root=size-1 + long val[N]; + printf("val [on %d] =", rank); + for(int i=0; i<N; i++) + { + val[i] = rand()%100; + printf("%3ld", val[i]); + } + printf("\n"); + + long *res_mon = calloc(size*N, sizeof(long)); + long *res_mpi = calloc(size*N, sizeof(long)); + + mon_gather(val, res_mon, N, MPI_LONG, size-1, MPI_COMM_WORLD); + MPI_Gather(val, N, MPI_LONG, res_mpi, N, MPI_LONG, size-1, MPI_COMM_WORLD); + + if(rank==size-1) + { + printf(YEL"[test2] "NORM); + for(int i=0; i<N*size; i++) + { + if(res_mon[i] != res_mpi[i]) + { + printf(RED"Failed!"NORM" ('%ld' != '%ld' [%d])\n", + res_mon[i], res_mpi[i], i); + MPI_Abort(MPI_COMM_WORLD, 1); + exit(1); + } + } + printf(GREEN"OK"NORM" results\n"); + } + + MPI_Finalize(); + return(0); +} diff --git a/Mec_discord/annales/TPnote2024/tri b/Mec_discord/annales/TPnote2024/tri new file mode 100644 index 0000000000000000000000000000000000000000..f9824bcb08ddecc2d4f4060b0ac93e772a8b618e GIT binary patch literal 18024 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/TPnote2024/tri_fusion.c b/Mec_discord/annales/TPnote2024/tri_fusion.c new file mode 100644 index 0000000..33c5f08 --- /dev/null +++ b/Mec_discord/annales/TPnote2024/tri_fusion.c @@ -0,0 +1,147 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <sys/types.h> +#include <unistd.h> +#include <string.h> +#include <omp.h> + +#define N 10000000 + +// fonctions de vérification définies plus loin +void verif_init(int *); +int verif(int *); + +// pour fusionner deux parties de tableau triées +// en tab [deb..pos1-1] et tab [pos1..pos2-1] +// résultat en place dans tab. Utilise tmp (mêmes indices): +int tmp[N]; +void fusion(int* restrict tab, int deb, int pos1, int pos2) +{ + int i1 = deb, i2 = pos1, ir = deb; + + while (i1 < pos1 && i2 < pos2) { + if (tab[i2] < tab[i1]) + tmp[ir++] = tab[i2++]; + else + tmp[ir++] = tab[i1++]; + } + + while (i1 < pos1) + tmp[ir++] = tab[i1++]; + + while (i2 < pos2) + tmp[ir++] = tab[i2++]; + + memcpy(tab+deb, tmp+deb, (pos2-deb)*sizeof(int)); +} + +// Fonction de tri à paralléliser : +// Arguments : +// - tab un tableau d'entiers, alloué, trié en place par la fonction entre +// les positions pos1 et pos2 +void tri(int *tab, int pos1, int pos2) +{ + if(pos2 - pos1 > 1) + { + #pragma omp task + { + tri(tab, pos1, (pos1+pos2)/2); + } + + #pragma omp task + { + tri(tab, (pos1+pos2)/2, pos2); + } + + #pragma omp taskwait + fusion(tab, pos1, (pos1+pos2)/2, pos2); + } +} + +// variable globale pour éviter le stack overflow +int tab[N]; + +// MAIN +int main(int argc, char* argv[]) +{ + // initialisation + srand(time(0) + getpid()); + for (int i = 0; i < N; i++) { + tab[i] = rand()%N; + } + verif_init(tab); + + // le tri commence ici + double t0 = omp_get_wtime(); + + #pragma omp parallel + { + #pragma omp single + { + tri(tab, 0, N); + } + } + + double t1 = omp_get_wtime(); + + printf("Execution time: %lfs\n", t1-t0); + + // renvoie le code de retour de la fonction de vérification du tri + return verif(tab); +} + +// ----------ci-dessous: fonctions de vérification------------------------- +// ------------------Ne pas modifier--------------------------------------- +static int compte[N]; + +// fonction d'initialisation de la vérification +void verif_init(int* t) { + for (int i = 0; i < N; i++) + compte[i] = 0; + for (int i = 0; i < N; i++) + compte[t[i]]++; +} + +// fonction de vérification : le tableau passé en argument est le tableau de +// verif_init() trié (renvoie 0 si succès, 1 si échec + message sur stderr) +int verif(int* t) { + fprintf(stderr, "result:"); + for (int i = 0; i < 5 && i < N; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, " ..."); + for (int i = (N-5 > 0)? N - 5 : 0; i < N; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, "\n"); + + // vérification que le tableau t est bien le tableau trié : + // vérifie que les éléments sont dans l'ordre, et que le nombre + // d'occurrences de chaque valeur correspond au tableau compte initialisé + int nb = 1; + for (int i = 1; i < N; i++) { + if (t[i-1] == t[i]) { + nb++; + } + else if (t[i-1] > t[i]) { + fprintf(stderr, "Error (%d > %d at index %d-%d)\n", t[i-1], t[i], i-1, i); + return 1; + } else { + // vérifie le nombre d'occurrences de la valeur précédente + if (compte[t[i-1]] != nb) { + fprintf(stderr, + "Error (bad count of %d: %d occurences, should be %d)\n", + t[i-1], nb, compte[t[i-1]]); + return 1; + } + nb = 1; + } + } + // vérifie le nombre d'occurrences de la dernière valeur + if(compte[t[N-1]] != nb) { + fprintf(stderr, "Error (bad count of %d: %d occurences, should be %d)\n", + t[N-1], nb, compte[t[N-1]]); + return 1; + } + fprintf(stderr, "Result OK!\n"); + return 0; +} diff --git a/Mec_discord/annales/test.c b/Mec_discord/annales/test.c new file mode 100644 index 0000000..e69de29 diff --git a/Mec_discord/annales/tp1_openmp_codes/ex1 b/Mec_discord/annales/tp1_openmp_codes/ex1 new file mode 100644 index 0000000000000000000000000000000000000000..80fcb9920e60dce6c91f00d06c52b50b3f5c2353 GIT binary patch literal 17032 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp1_openmp_codes/ex2 b/Mec_discord/annales/tp1_openmp_codes/ex2 new file mode 100644 index 0000000000000000000000000000000000000000..f3f0e505388eac2a92f9735b0e62849d89493fc2 GIT binary patch literal 17240 zcmeHOe{fsXmA<m<#5l36&;(5Q5lwKwhDMPcC&ZyCl4B>&tem)xO$;S{kuBNQVoO@- zDJ0A;D+p$yCZcMmKj==UP5V#jZfEMY+nKQ4ZUx4)ooPD`KRUFOZrC=(PJuCIp(!-c zo^$Ux^3$_iW;^{;cSip1`R;elz3<%juHLiW{pU{qo(h{yaIuSz3bb5n72~Cb$8V<! zfLH7gweWX?xIwG{yHawh-KzjvRe7nR7^{i51EOC&R!ZP?iWZDKLPYdiuFS4fEsVmc zZ1k(bD%n<?#sh)E$nAyxT(TJwQ;Z%NR0u}1ABIeAR{GSgV$4!r9w%f!G|?|hep&Kk z6s#xYd}2=UvxD+!MHjSTaml|zSp5db&x#$SXT(0R95`<T|C;`K$S-xHiep8;q6H)O z_c8FJDI&#R2A<|#?r)iSNKqacalWx^84C|?Z{0E$+&mVJB#&-Bx?}t1?XB)a)ZHT6 zaa`C3PXFG0{WvW-<S31DF7OgU8{5;@zrF51*FG7&>a&0N!7pxp<b{`lk5q6B>=QLu zP|s70Hr7|c2Q}*WAA*|V5YL8wK90CtaX^EsMB@qIt}MYHScd=RGW<`M;f-bZTYz`L z$6CGuM5*z#0q?Sk!5)TBDg6(C-&jH~U_M8p<1w7UW}$cWb?d=UJTwwc7@>Gy_wKQ1 zB-9re9196u9~qBE^n?+J8@jHfC4~@89|;+{F&YmAf_fx5F81#4?$Kj`cwlTSG$vR8 zEhI`P#b6*F4~OD7rXd{AcIY$~4@Zn)eQ5MPFrf3H`>?JL2f|}O3>^*V!{JC^Ec^hD z5FKfR<AHEQ?DcoG@77z~TivaNdW(Bop$;sLtkvyNm1d}5setpX63$^f>+tMasn$rS z*?{{TAfDr1_!!rOuRzUjh)b?VyGmRjdu=#ei!0E(U}Hgl8z5hYGdJD@r#mdpK+2d6 zXxl{%*)xr3SBNXn2@0>5yiSRAia$Z?A@e!<o~rh$cIMfB=?=x?(NSngoHOyXgiC(b z#M4)a<mXL19C)EzH1T+ya(RMyjA6c>Crv!B73g!u#N)caC1>K*^{-lfY~uNtv1P`@ z*Km+BmNQV!Ksf{D43sla&OkW>rVPAYcf)(y@z<-hlU2XmB7`=PGb-{k+VN+qr=%*s zEe`ZTep3RVZi7JmD7Gxjy_(PGv(m;JtA)9<1siX87UrHR*m$F}F!$|(jW;+8b6+jk zcmuXD_i47Fw?neG4k7yk`;r@bU$oz`*l$?u^A`IRi~XY6_GkJUs<q?4JJ<Y^=I4C* z_{DxLv+Hdbw3a^a>(w55{Rz0^o4(XoyQNNI)m}g?^Sz#T^ZB55vT{=+j9*K4&Nk<? z%tQ>>=}S$S?4J}WyRo)KIyX&BDt;m>b&XX!6`z?Q{iNb++etr9`We#SNqXmdD*im_ zdr9w6{Dkw5*xp!m59xbI?@@g1An9YI?~y!=TiT6P)SiivK2G{c(q}3D0~CLT;!l$P zVbaf&eung)B)#)}8b9ejLwb+mC!816`2U6UJ*4+2zV>URkCDEI^#4lwEa_vU{|@OV zNuMSCe~^BL_<8c1l<iFuGo*VCbXt0%2ht6*jI*o#XkrvBn0#y)Pz||1%VF0ZSMtMh zcA6$Ul5U!C%GqqJdWL#+Dn2t$qdcYfi5Tg7NdNDo?;*X1&WbGQVrXByfA+ddIJ|9t zzgmbN;$?XT|4hH{lp~#e6V%$t&e@>0Rh_lTHQGbZ;OX6*^WAf(D>Ha;YW5o-8m`;$ z2p*Tb{+i$DN}v6Nmi`~OM&^6^{F$mFaD{7`+B^h@OXUnW<kx-XRw4d33+9th(K1!v zL1?>Ztb?T`f^}G0uE?LO+mOPzQ-q*TOZ~Qo5t=S*>3Qv`H}BA%x@gyI&uV8c8*3pz zCk3d^pM#;nI>7$8{-kzcvq;|BuN~jD5vy?F8mqOFyKVww_8Tyvvq2c*vsKrFZ94?M zMgDX5LnDm`<N5CL_51qzwe+O}urxYnPe1@)dV2P>#AiDv-l%)z1?Z(CeF0MaU+|bE zQ{9}KeGC+5g3$Cu-ybjg+Fq<Xh5sK(Pffpi@MT}!w_cfkf6cuO)wbt5G7a?|ZNL4e zyZxDMp9lY8H|JYB*)3p(s<ol#{pojQT$sJev*};vr>5T@sGNaDCsh0m)ex+52F5^B zyauS*S{!2AuajqHr{J>FGTrss$^QChUj0+#!u0b4L0IO}GhjXV`+2SI+s#_r)5+Ul zt#^L>kndjKA>SvavgxPckghcy()S_G+?9|ZmG^wE`MJ4U!PL@E|KaPya{c!m^k;T$ zy;%s~U0vy4`1-rj@A&$B=|96Vy14=91OBE<_#HF*DL6^Br!Luz4b3l8zWwP1fBMai z^lQHS+W*#$PuaA#SCSX-`-jKm)2D_P^Mmt)-%N<|dkd86n+nKsDQBRZfpP}Q87OC< zoPlx%${F~;4A|h;i9Y!QmTOaRr%V3o6^@L!-R>GQKlJfUEx|*sU9L?dHDceOOa11R zKq6Qp63KCD`hfoUR}}e^5@@Tv%E3vvmav}iIzkuWM#2Wdn+O{TZz23Jp_|Y{*i6_$ zxRtP#a2w%v!rKUU5VjHSB)pyQBZRvMKT3E9p;uvwQ259u6zyaairr)riVm^~MJL&W zVh`DbVlUZ*LL-|{bdgOc?j)N~{2keZ!cR7#=q8&`>?4~{>?fO0^eEd)m?F#(ijPq{ zVTv$ED0-=#Fh!Un6bGoCFh!Un6n)fAm?F#(ihgP*OcCY?#a+}+m?F#(ii6Znm?F#( ziUDdTOcCY=ytZrYxBG>9ALI1v`FslM&NuS;Cjec5IlvU)b?~TtdOn{Y1v~pzKK~M6 zZXuuV0p9a=KL0o%mbD6m?SWolJL<GuyLx4H7TS=<cWFEjV+(3JRyq+H;L{49dgwcb zgu}VVQGaLMs{5-`;*Rw@Z`s<g5oz?l7e0qUCmoT5g1iBr0pJe<a`8gt6nrM3KR1qT zkHh&`MZ2RuV{do3PF4CGjgMA!I6TK!bU3^fzpZh2fblt8plEkE+a1;ItAq#KX5e!# z#J<`Nm9Et_;-GUy#Szh7XFqauh5bTB4N#qMjJ{RS4y6M=mC)ZP<S2v$^!urbE=T=i z_D+W@Q`zZgJca!}x<Yg8IKFbP!y9qz@X6j`T!r4{Z`6K>gSp0kPnJtL1LX{qGf>Vz zIRoVklr!)*%fLDnDTg;wQ1Dg>ixoeoXtA1*U#x?d?qoT0mBMSt=J)5WCA*q%Jt4nG zhxde7xc!~W`6$|_@qP;m-}}r~Dx2Ry`!TiGC|X=e1E$+BQBOP_9$Aa;$7bn0wF+v< z5>guQO+i_%CLADw`NwG>JnkIn;HNBExc?i-W*z)KB99M-E2+z5*Hb+BWka^}xZw6x z+V4>!;1>*O)8SL}za13b^R|Ta&`r0Ou!rz4VT>?EXmS5Qv)Zd9dw1{N>1ymBOh$~P ztIZ8>jBajDN~`(77LVK0>TYRL{0D}VZ-Ca9NR%D^=fLl$o1@slgWo?d<}1ZNmW)$X zI8Tf9D+HgP#r#Ua=W#J#EqH#5`6~pU7sY&y;PbDTUnTfFE#~2>Eio^4*hS$g$vZ^0 zBwr^^m*jz5WA0Ja?LhLnU~aYJo6{~c!}<>iejnf5YKN!1nH$Xv>(>?D(>1r+#Z`jW zmty{EQR@7*!)n3nL9rfIGq0IZb-P$EoF#c)?G}A-S*jFo$sg$#Spk{H_i~-WNeh&G zMg<Pn!&3U2N#DZ@6xdjr;Dd2e7XBl|^SX{&EWPltnZ{4crU*!WY2Ho%kMa5aXE0^? zEc~?r$?H7P;=52OHU8y}>uDKht@!XJj-YV4IM`Y${)}{6w`AU51>Po>&ie(@TgQJ% z@=MP{CnU;N;ymewg}MU26)o4rO`yLL$VvKM<nOWVz`JB0#eaS+`K9MuuZ&ZyMJo)v zQ(Uv;Jd7=)_aI-f^m;tCjQ$DW*HkRc!}pib{|a~<kM(+aZ5e$f<gHZvdf;744_DkQ z_16^sW6P3O<W1`d-6n|Lz+?Wsl>ZPpd<b|aod5M+j-c?I9H+Ce?`#V-A0WN;de<pF zuY2<UL*NsXd~s~F9t3_(#nSouq~w?8`OC}j-v!>aG`#p3@UW^bDd&OTxP%45h<WrD zeK;C-4+-4E;ns1x$Z!O9W(>uRgpq`o9)`r?9u?gf*N1SIN&@zO1f%-MSadKjrU#8^ zJfR1YN5v5MkA;j-(7nU69k#fX65$?_unxOV0>|`F#E2gg!|}j)NDn5*$B%)F$<je- z6iK7Q!(-7vkcX!0dwPA{oqFfK4%{YFtPcvk<L-UF?ylX%E%NsTpkTX`-l<Upt)o}y zd;R;{eSUrao;?RT`}96vyT22o%AGDliKHC)U);ANcev2b8n0JcxXncm1p`K)uoq`> zvyRt`TVkZdvfl>0X+KRXjDQYXKN5gMhazxf*6lZodfamZiH8o=?wmrmrY%6`emVAV zGBU)$i+3OC!9-La4Mc*tGpTDogbjuxdNL6zj02N{a|Im_CKA-I+!bWrRJ1ro+#{sx zu;r;Rb36(-LfxP}P|V@Tn8Zy}C3iv<ZF{2J<6fiUeM^f&z%&VW;@CL!257_;j&col zLWSZn;f_R&kb5MObjRY+SSW5BGf{)dFl^2X2Z{2vcWpKTBSOkY1Bp@L4jzj@7YdEI zYB>^$C&JN4k)cCdJTw+S2dc%!4B?hZbwkxX5(N`0iO`U68=<3M;*|vIs64yep;5Ya zMuQNIEfqsuM9PEf&{beO48fE;Oq_7T1w0NHWvRvD|Igu_5G<+i-KYxRhcohXA2mxY z*Aek{51+NzpYPWhUC?GO{CvgScBq*B2k8Et5r20u7yjO0t_vz=f4=``bg_`o>VFV; zc=a;M<LBpDM(&@VXRYH8fImLVvOhmhFuE|gP;iV`Wq*F|3<HOU%>Mk`!N||cAd!W_ zu_^umYWOV5{``Ex$o=s6S;zPw_~WxJ+x#5En4+FI$2@+bMFuLEQ}*ZQ9mX69xqtTO zaeaaO+eydIMT}XKKl)hxzX}}YgyX|agDQm9JALc?f63zSB0t6$g=4UU7hkvd^Ya)Z z>zDJNwD_MU2gbwfNXYRRpS1Y%eGcRI_=eWv&tZRP@#p72M*hDM>#g~lCV!rP;UXnr zimqp33(ai*3@SK(?9b1YjD8jpTKj+5;?K{YjE6C}sqp#3)On~l;KRe@=M3JDZ`HHS z_!juqnf&>A_QYl&p|DO_i#GH49E0aB_s`G0ysw`VgV!Gx_T%~gH{kFP3;y)~vMk*g z$I!`C*q?C)IGg>2m&6{0+z*FfKektcGjiNN-+w#F->S#H%w-MrPx3+&``=n%RE7P` z$mfn(>ZO1?C~?<AV>5hsJiPwk{{eaIX8)tNDa&SQ<bGL;|4y+;WYe*oO0nMJU@^u2 E0qnlwm;e9( literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp1_openmp_codes/ex3 b/Mec_discord/annales/tp1_openmp_codes/ex3 new file mode 100644 index 0000000000000000000000000000000000000000..82b5f602459ddc0066492cc4edfaaa3d0ca41ecd GIT binary patch literal 17656 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp1_openmp_codes/ex4 b/Mec_discord/annales/tp1_openmp_codes/ex4 new file mode 100644 index 0000000000000000000000000000000000000000..5225f469380ee028e4cdbd1aec789d3f389b13d6 GIT binary patch literal 17648 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp1_openmp_codes/ex5 b/Mec_discord/annales/tp1_openmp_codes/ex5 new file mode 100644 index 0000000000000000000000000000000000000000..d8b2a05a5d517d5c33fcb071c2870094cb39b5ca GIT binary patch literal 17656 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp1_openmp_codes/ex6 b/Mec_discord/annales/tp1_openmp_codes/ex6 new file mode 100644 index 0000000000000000000000000000000000000000..32c26b3c4bb91d91634848040d346ef554c6f3bf GIT binary patch literal 17744 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 S*;J$`{yV0|GMj;o75@RVF*z9k literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp1_openmp_codes/ex7 b/Mec_discord/annales/tp1_openmp_codes/ex7 new file mode 100644 index 0000000000000000000000000000000000000000..c5e185c29a4c3dc943773630b8fd16d6e6fdd000 GIT binary patch literal 17696 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c b/Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c new file mode 100644 index 0000000..6c2cb58 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c @@ -0,0 +1,11 @@ +#include <stdio.h> +#include <omp.h> +int main() { + + #pragma omp parallel num_threads(6) + { + printf("Hello\n"); + printf("World\n"); + } + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp0_1_hello.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c b/Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c new file mode 100644 index 0000000..e58a317 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c @@ -0,0 +1,29 @@ +#include <stdio.h> +#include <omp.h> +#define SIZE 100 +#define CHUNK 10 + +int main() { + int i, tid; + double a[SIZE], b[SIZE], c[SIZE], sum = 0.; + + for (i = 0; i < SIZE; i++) + a[i] = b[i] = i; + + #pragma omp parallel private(tid) reduction(+: sum) + { + tid = omp_get_thread_num(); + if (tid == 0) + printf("Nb threads = %d\n", omp_get_num_threads()); + printf("Thread %d: starting...\n", tid); + + #pragma omp for + for (i = 0; i < SIZE; i++) { + c[i] = a[i] + b[i]; + sum += c[i]; + printf("Thread %d: c[%2d] = %g\n", tid, i, c[i]); + } + } + printf("sum = %g\n", sum); + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp0_2_for.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c b/Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c new file mode 100644 index 0000000..9b42462 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c @@ -0,0 +1,71 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 5120000 + +// Reference computation kernel (do not touch) +void addvec_reference(double c[N], double a[N], double b[N]) { + + for (size_t i = 0; i < N; i++) { + c[i] = a[i] + b[i]; + } +} + +// Computation kernel (to parallelize) +void addvec_kernel(double c[N], double a[N], double b[N]) { + + #pragma omp parallel for + for (size_t i = 0; i < N; i++) { + c[i] = a[i] + b[i]; + } +} + +int main() { + double* a = malloc(N * sizeof(double)); + double* b = malloc(N * sizeof(double)); + double* c = malloc(N * sizeof(double)); + double* ref = malloc(N * sizeof(double)); + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N; i++) { + a[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + b[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + } + + time_reference = omp_get_wtime(); + addvec_reference(ref, a, b); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + addvec_kernel(c, a, b); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + for (size_t i = 0; i < N; i++) { + if (ref[i] != c[i]) { + printf("Bad results :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(a); + free(b); + free(c); + free(ref); + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_3_addvec.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c b/Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c new file mode 100644 index 0000000..121b538 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c @@ -0,0 +1,68 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 5120000 + +// Reference computation kernel (do not touch) +void sum_reference(double* psum, double a[N]) { + double sum = 0.; + + for (size_t i = 0; i < N; i++) { + sum += a[i]; + } + *psum = sum; +} + +// Computation kernel (to parallelize) +void sum_kernel(double* psum, double a[N]) { + double sum = 0.; + + #pragma omp parallel for reduction (+: sum) + for (size_t i = 0; i < N; i++) { + sum += a[i]; + } + *psum = sum; +} + +int main() { + double* a = malloc(N * sizeof(double)); + double ref, sum; + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N; i++) { + a[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + } + + time_reference = omp_get_wtime(); + sum_reference(&ref, a); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + sum_kernel(&sum, a); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + if (abs(ref - sum) > ERROR) { + printf("Bad results :-(((\n"); + exit(1); + } + printf("OK results :-)\n"); + + free(a); + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_4_sum.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c b/Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c new file mode 100644 index 0000000..b49cf35 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c @@ -0,0 +1,81 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 5120 + +// Reference computation kernel (do not touch) +void matvec_reference(double c[N], double A[N][N], double b[N]) { + size_t i, j; + + for (i = 0; i < N; i++) { + c[i] = 0.; + for (j = 0; j < N; j++) { + c[i] += A[i][j] * b[j]; + } + } +} + +// Computation kernel (to parallelize) +void matvec_kernel(double c[N], double A[N][N], double b[N]) { + size_t i, j; + + #pragma omp parallel for private(j) + for (i = 0; i < N; i++) { + c[i] = 0.; + for (j = 0; j < N; j++) { + c[i] += A[i][j] * b[j]; + } + } +} + +int main() { + double* A = malloc(N * N * sizeof(double)); + double* b = malloc(N * sizeof(double)); + double* c = malloc(N * sizeof(double)); + double* ref = malloc(N * sizeof(double)); + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N; i++) + b[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + for (size_t i = 0; i < N * N; i++) + A[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + + time_reference = omp_get_wtime(); + matvec_reference(ref, (double (*)[N])A, b); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + matvec_kernel(c, (double (*)[N])A, b); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + for (size_t i = 0; i < N; i++) { + //if (abs(ref[i] - c[i]) > ERROR) { + if (ref[i] != c[i]) { + printf("Bad results :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(A); + free(b); + free(c); + free(ref); + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_5_matvec.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c b/Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c new file mode 100644 index 0000000..1d2bcbc --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c @@ -0,0 +1,81 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 51200000 + +// Reference computation kernel (do not touch) +void stencil1D_reference(double a[N], double b[N]) { + for (size_t i = 1; i < N; i++) { + a[i] = (a[i] + a[i - 1]) / 2; + b[i] = (b[i] + b[i - 1]) / 2; + } +} + +void stencil1D_kernel(double a[N], double b[N]) { + #pragma omp parallel sections + { + #pragma omp section + for (size_t i = 1; i < N; i++) { + a[i] = (a[i] + a[i - 1]) / 2; + } + #pragma omp section + for (size_t i = 1; i < N; i++) { + b[i] = (b[i] + b[i - 1]) / 2; + } + } +} + + +int main() { + double* a = malloc(N * sizeof(double)); + double* b = malloc(N * sizeof(double)); + double* ref_a = malloc(N * sizeof(double)); + double* ref_b = malloc(N * sizeof(double)); + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N; i++) { + a[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + b[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + ref_a[i] = a[i]; + ref_b[i] = b[i]; + } + + time_reference = omp_get_wtime(); + stencil1D_reference(a, b); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + stencil1D_kernel(ref_a, ref_b); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + for (size_t i = 0; i < N; i++) { + //if ((abs(ref_a[i] - a[i]) > ERROR) || (abs(ref_b[i] - b[i]) > ERROR) { + if ((ref_a[i] != a[i]) || (ref_b[i] != b[i])) { + printf("Bad results :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(a); + free(b); + free(ref_a); + free(ref_b); + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_6_stencil1d.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c b/Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c new file mode 100644 index 0000000..d07a684 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c @@ -0,0 +1,92 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix size (5120: UHD TV) +#define N 5120 + +// Reference computation kernel (do not touch) +/** + * reduction_reinit function: + * this function returns the sum of all the elements of a square matrix + * and sets the matrix elements to 0. + * \param[in,out] A The matrix to use (reset to 0 by the function). + * \param[out] sum The sum of the elements of the input matrix. + */ +void reduction_reinit_reference(double A[N][N], double* sum) { + *sum = 0.; + + for (size_t i = 0; i < N; i++) { + for (size_t j = 0; j < N; j++) { + *sum += A[i][j]; + A[i][j] = 0.; + } + } +} + +// Computation kernel (to parallelize) +void reduction_reinit_kernel(double A[N][N], double* sum) { + *sum = 0.; + double copie_sum = 0 ; + size_t i , j ; + #pragma omp parallel for reduction(+: copie_sum) private(j) + for ( i = 0; i < N; i++) { + for ( j = 0; j < N; j++) { + copie_sum += A[i][j]; + A[i][j] = 0.; + } + } + + *sum = copie_sum; + +} + +int main() { + double* AR = malloc(N * N * sizeof(double)); + double* AK = malloc(N * N * sizeof(double)); + double sum_ref, sum_ker; + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N * N; i++) + AR[i] = AK[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + + time_reference = omp_get_wtime(); + reduction_reinit_reference((double (*)[N])AR, &sum_ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + reduction_reinit_kernel((double (*)[N])AK, &sum_ker); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + if (abs(sum_ref - sum_ker) > ERROR) { + printf("Bad results :-(((\n"); + exit(1); + } + for (size_t i = 0; i < N; i++) { + for (size_t j = 0; j < N; j++) { + if (AR[i * N + j] != AK[i * N + j]) { + printf("Bad results :-(((\n"); + exit(1); + } + } + } + printf("OK results :-)\n"); + + free(AK); + free(AR); + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_7_reductionreinit.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c b/Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c new file mode 100644 index 0000000..ade72b3 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c @@ -0,0 +1,87 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define max(x,y) ((x) > (y)? (x) : (y)) +#define min(x,y) ((x) < (y)? (x) : (y)) +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 5120 + +// Reference computation kernel (do not touch) +/** + * polynomial_multiply function: + * this function computes the polynomial multiply c = a * b, + * each polynomial is represented using an array, the value stored + * in the n^th cell corresponds to the coefficient of x^n. E.g.: + * a = (3.x^2 + 2.x + 1) is represented by [3, 2, 1], + * b = (2.x^2 + 3.x) is represented by [2, 3, 0] and the result of + * a * b = 6.x^4 + 13.x^3 + 6.x^2 + 3.x is [6, 13, 6, 3, 0]. + * \param c is the target polynomial, must be initialized to 0 + * \param a is the first polynomial + * \param b is the second polynomial + */ +void polynomial_multiply_reference(double c[2*N-1], double a[N], double b[N]) { + for (size_t i = 0; i < N; i++) + for (size_t j = 0; j < N; j++) + c[i+j] += a[i] * b[j]; +} + +// Computation kernel (to parallelize) +void polynomial_multiply_kernel(double c[2*N-1], double a[N], double b[N]) { + for (size_t i = 0; i < N; i++) + for (size_t j = 0; j < N; j++) + c[i+j] += a[i] * b[j]; +} + +int main() { + double* a = malloc(N * sizeof(double)); + double* b = malloc(N * sizeof(double)); + double* c_ref = malloc((2*N - 1) * sizeof(double)); + double* c_ker = malloc((2*N - 1) * sizeof(double)); + double time_reference, time_kernel, speedup, efficiency; + + // Initialization of a and b by random values, and c by 0 + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N; i++) { + a[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + b[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + } + for (size_t i = 0; i < 2*N - 1; i++) { + c_ref[i] = c_ker[i] = 0.; + } + + time_reference = omp_get_wtime(); + polynomial_multiply_reference(c_ref, a, b); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + polynomial_multiply_kernel(c_ker, a, b); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + for (size_t i = 0; i < 2*N - 1; i++) { + //if (abs(c_ref[i] - c_ker[i]) > ERROR) { + if (c_ref[i] != c_ker[i]) { + printf("Bad results :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(a); + free(b); + free(c_ref); + free(c_ker); + return 0; +} diff --git a/Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c:Zone.Identifier b/Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c:Zone.Identifier new file mode 100644 index 0000000..08a05d7 --- /dev/null +++ b/Mec_discord/annales/tp1_openmp_codes/tp1_8_polynomial.c:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=C:\Users\33788\Downloads\tp1_openmp_codes(1).tgz diff --git a/Mec_discord/annales/tp2_parallelisation_codes/._tp2_1_matmat.c b/Mec_discord/annales/tp2_parallelisation_codes/._tp2_1_matmat.c new file mode 100644 index 0000000000000000000000000000000000000000..3c409add6877b07f497e6e454e178d61131c9275 GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c<USdH(PO4r`VsS}nacW9RVo9oUKrl#gr;Az~h<@0hr30b?P;wN( literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp2_parallelisation_codes/._tp2_3_enumeration_sort.c b/Mec_discord/annales/tp2_parallelisation_codes/._tp2_3_enumeration_sort.c new file mode 100644 index 0000000000000000000000000000000000000000..0e8871833bbe28e2429271d930f56a3d2a01fdd9 GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c<USdH(PO4r`VsS}nacW9RVo9oUKrl!#i=A2=i01M+FAAaoLk|<V literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp2_parallelisation_codes/bubble b/Mec_discord/annales/tp2_parallelisation_codes/bubble new file mode 100644 index 0000000000000000000000000000000000000000..76f63f930478ada7d677c1480f4546bb710393f3 GIT binary patch literal 17760 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 Kb!#eM#eV>0?GGIQ literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp2_parallelisation_codes/enum b/Mec_discord/annales/tp2_parallelisation_codes/enum new file mode 100644 index 0000000000000000000000000000000000000000..7b16f1c1b2ae402d6139fa595b46ff1b0c44330f GIT binary patch literal 17824 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp2_parallelisation_codes/tp2_1_matmat.c b/Mec_discord/annales/tp2_parallelisation_codes/tp2_1_matmat.c new file mode 100644 index 0000000..f0ce7a1 --- /dev/null +++ b/Mec_discord/annales/tp2_parallelisation_codes/tp2_1_matmat.c @@ -0,0 +1,82 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes +#define N 1000 + +// Reference computation kernel (do not touch) +void matmat_reference(double C[N][N], double A[N][N], double B[N][N]) { + size_t i, j, k; + + for (i = 0; i < N; i++) { + for (j = 0; j < N; j++) { + C[i][j] = 0.; + for (k = 0; k < N; k++) { + C[i][j] += A[i][k] * B[k][j]; + } + } + } +} + +// Computation kernel (to parallelize) +void matmat_kernel(double C[N][N], double A[N][N], double B[N][N]) { + size_t i, j, k; + #pragma omp parallel for private(j,k) //schedule(dynamic,10) //collapse(2) + for (i = 0; i < N; i++) { + for (j = 0; j < N; j++) { + C[i][j] = 0.; + for (k = 0; k < N; k++) { + C[i][j] += A[i][k] * B[k][j]; + } + } + } +} + +int main() { + double* A = malloc(N * N * sizeof(double)); + double* B = malloc(N * N * sizeof(double)); + double* C = malloc(N * N * sizeof(double)); + double* ref = malloc(N * N * sizeof(double)); + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N * N; i++) { + A[i] = (double)rand()/(double)(RAND_MAX/MAX_VAL); + B[i] = (double)rand()/(double)(RAND_MAX/MAX_VAL); + } + time_reference = omp_get_wtime(); + matmat_reference((double (*)[N])ref, (double (*)[N])A, (double (*)[N])B); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + matmat_kernel((double (*)[N])C, (double (*)[N])A, (double (*)[N])B); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + for (size_t i = 0; i < N*N; i++) { + if (ref[i] != C[i]) { + printf("Bad results :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(A); + free(B); + free(C); + free(ref); + return 0; +} diff --git a/Mec_discord/annales/tp2_parallelisation_codes/tp2_2_pi.c b/Mec_discord/annales/tp2_parallelisation_codes/tp2_2_pi.c new file mode 100644 index 0000000..c482557 --- /dev/null +++ b/Mec_discord/annales/tp2_parallelisation_codes/tp2_2_pi.c @@ -0,0 +1,76 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <math.h> +#include <omp.h> +#define PI "3.141592653589793238462" +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-10 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 51200000 + +// Reference computation kernel (do not touch) +void pi_reference(size_t nb_steps, double* pi) { + double term; + double sum = 0.; + double step = 1./(double)nb_steps; + + for (size_t i = 0; i < nb_steps; i++) { + term = (i + 0.5) * step; + sum += 4. / (1. + term * term); + } + + *pi = step * sum; +} + +// Computation kernel (to parallelize) +void pi_kernel(size_t nb_steps, double* pi) { + double term; + double sum = 0.; + double step = 1./(double)nb_steps; + + #pragma omp parallel for private(term) reduction(+: sum) + for (size_t i = 0; i < nb_steps; i++) { + term = (i + 0.5) * step; + sum += 4. / (1. + term * term); + } + + + *pi = step * sum; + +} + +int main() { + double pi, pi_ref; + double time_reference, time_kernel, speedup, efficiency; + + time_reference = omp_get_wtime(); + pi_reference(N, &pi_ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + pi_kernel(N, &pi); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + printf("\nPi (textbook) : %s\n", PI); + printf("Pi reference - : %.22g\n", pi_ref); + printf("Pi parallel -- : %.22g\n\n", pi); + + // Check if the result differs from the reference + if (fabs(pi_ref - pi) > ERROR) { + printf("Bad results :-(((\n"); + exit(1); + } + printf("OK results :-)\n"); + + return 0; +} diff --git a/Mec_discord/annales/tp2_parallelisation_codes/tp2_3_enumeration_sort.c b/Mec_discord/annales/tp2_parallelisation_codes/tp2_3_enumeration_sort.c new file mode 100644 index 0000000..af2f8ff --- /dev/null +++ b/Mec_discord/annales/tp2_parallelisation_codes/tp2_3_enumeration_sort.c @@ -0,0 +1,122 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 10240 + +// Reference computation kernel (do not touch) +void enumeration_sort_reference(double tab[N]) { + size_t i, j; + size_t* position = malloc(N * sizeof(size_t)); + double* copy = malloc(N * sizeof(size_t)); + + for (i = 0; i < N; i++) { + position[i] = 0; + copy[i] = tab[i]; + } + + for (j = 0; j < N; j++) { + for (i = 0; i < N; i++) { + if ((tab[j] < tab[i]) || ((tab[i] == tab[j]) && (i < j))) { + position[i]++; + } + } + } + + for (i = 0; i < N; i++) + tab[position[i]] = copy[i]; + + free(position); + free(copy); +} + +// Computation kernel (to parallelize) +void enumeration_sort_kernel(double tab[N]) { + size_t i, j; + size_t* position = malloc(N * sizeof(size_t)); + double* copy = malloc(N * sizeof(size_t)); + + for (i = 0; i < N; i++) { + position[i] = 0; + copy[i] = tab[i]; + } + + #pragma omp parallel for private(j) + for (i = 0; i < N; i++) { + for (j = 0; j < N; j++) { + if ((tab[j] < tab[i]) || ((tab[i] == tab[j]) && (i < j))) { + position[i]++; + } + } + } + + + for (i = 0; i < N; i++) + tab[position[i]] = copy[i]; + + free(position); + free(copy); +} + +void print_sample(double tab[], size_t size, size_t sample_length) { + if (size <= 2 * sample_length) { + for (size_t i = 0; i < size; i++) + printf("%g ", tab[i]); + } else { + for (size_t i = 0; (i < size) && (i < sample_length); i++) + printf("%g ", tab[i]); + printf("... "); + for (size_t i = size - sample_length; i < size; i++) + printf("%g ", tab[i]); + } + printf("\n"); +} + +int main() { + double* a = malloc(N * sizeof(double)); + double* ref = malloc(N * sizeof(double)); + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N; i++) { + a[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + ref[i] = a[i]; + } + + time_reference = omp_get_wtime(); + enumeration_sort_reference(ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + enumeration_sort_kernel(a); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + print_sample(ref, N, 5); + print_sample(a, N, 5); + + // Check if the result differs from the reference + for (size_t i = 0; i < N; i++) { + if (ref[i] != a[i]) { + printf("Bad results :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(a); + free(ref); + return 0; +} diff --git a/Mec_discord/annales/tp2_parallelisation_codes/tp2_4_bubble_sort.c b/Mec_discord/annales/tp2_parallelisation_codes/tp2_4_bubble_sort.c new file mode 100644 index 0000000..2b84989 --- /dev/null +++ b/Mec_discord/annales/tp2_parallelisation_codes/tp2_4_bubble_sort.c @@ -0,0 +1,119 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 500 // Random values are [0, MAX_VAL] + +// Matrix and vector sizes (5120: UHD TV) +#define N 25600 + +// Reference computation kernel (do not touch) +void bubble_sort_reference(double tab[N]) { + size_t i, j; + double temp; + + for (i = 0; i < N ; i++) { + for (j = 0; j < N - i - 1; j++) { + if (tab[j] > tab[j + 1]) { + temp = tab[j + 1]; + tab[j + 1] = tab[j]; + tab[j] = temp; + } + } + } +} + +// Computation kernel (to parallelize) +void bubble_sort_kernel(double tab[N]) { + size_t i, j; + size_t num = N; + double temp; + + + for(size_t phase = 0 ; phase < num ; phase++) + { + if(phase% 2 == 0){ + #pragma omp parallel for private(temp) + for(i = 0 ; i < N-1 ; i +=2) + { + if (tab[i]>tab[i+1]) + { + temp = tab[i] ; + tab[i] = tab[i+1]; + tab[i+1] = temp ; + } + } + } + else + { + #pragma omp parallel for private(temp) + for(i = 1 ; i < N-1 ; i+=2) + { + if(tab[i]> tab[i+1]) + { + temp = tab[i] ; + tab[i] = tab[i+1]; + tab[i+1] = temp ; + } + } + } + } +} + +void print_sample(double tab[], size_t size, size_t sample_length) { + if (size <= 2 * sample_length) { + for (size_t i = 0; i < size; i++) + printf("%g ", tab[i]); + } else { + for (size_t i = 0; (i < size) && (i < sample_length); i++) + printf("%g ", tab[i]); + printf("... "); + for (size_t i = size - sample_length; i < size; i++) + printf("%g ", tab[i]); + } + printf("\n"); +} + +int main() { + double* a = malloc(N * sizeof(double)); + double* ref = malloc(N * sizeof(double)); + double time_reference, time_kernel, speedup, efficiency; + + // Initialization by random values + srand((unsigned int)time(NULL)); + for (size_t i = 0; i < N; i++) + ref[i] = a[i] = (float)rand()/(float)(RAND_MAX/MAX_VAL); + + time_reference = omp_get_wtime(); + bubble_sort_reference(ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + bubble_sort_kernel(a); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + print_sample(ref, N, 5); + print_sample(a, N, 5); + + // Check if the result differs from the reference + for (size_t i = 0; i < N; i++) { + if (ref[i] != a[i]) { + printf("bad results :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(a); + free(ref); + return 0; +} diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/._tp3_1_nb_threads.c b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/._tp3_1_nb_threads.c new file mode 100644 index 0000000000000000000000000000000000000000..d71db6817efc9667509656b701e8b0da43744119 GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw y#Rz090AirHRC0c<USdH(PO4r`VsS}nacW9RVo9oUKrmRbi&`9r*2|o$2ciK)WfS87 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/._tp3_4_fibonacci.c b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/._tp3_4_fibonacci.c new file mode 100644 index 0000000000000000000000000000000000000000..cbfc5527e8b5573558be607feaf00b95c3df8799 GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c<USdH(PO4r`VsS}nacW9RVo9oUKrl%0Mt8M15UqD*g&Bwj08;rC A6#xJL literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex1 b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex1 new file mode 100644 index 0000000000000000000000000000000000000000..1a704398cf343e9a324bab54c64d14a8d310564e GIT binary patch literal 17128 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 F{tdt*>@ffU literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex2 b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex2 new file mode 100644 index 0000000000000000000000000000000000000000..b1dd4f3b9aab764071e442ac24c43ab374666ecb GIT binary patch literal 17816 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex3 b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex3 new file mode 100644 index 0000000000000000000000000000000000000000..9f653c98f068353bfaeb3cf2b4a5378815eb8ed9 GIT binary patch literal 17936 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex4 b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/ex4 new file mode 100644 index 0000000000000000000000000000000000000000..424a1e8385cb567102f9ae0bf52213adaeb5db54 GIT binary patch literal 17792 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/mandel.c b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/mandel.c new file mode 100644 index 0000000..cded68a --- /dev/null +++ b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/mandel.c @@ -0,0 +1,227 @@ +/* + * @UFR@ + * @MODULE@ + * Université Pierre et Marie Curie + * Calcul de l'ensemble de Mandelbrot, Version séquentielle + * compilation, exécution : voir fichier Makefile + * + * $Id: mandel.c,v 1.3 2004/03/02 22:04:59 bereziat Exp $ + */ + +#include <stdlib.h> +#include <stdio.h> +#include <time.h> /* chronometrage */ + +#include "rasterfile.h" + + +char info[] = "\ +Usage:\n\ + mandel dimx dimy xmin ymin xmax ymax prof\n\ +\n\ + dimx,dimy : dimensions de l'image a generer\n\ + xmin,ymin,xmax,ymax : domaine a calculer dans le plan complexe\n\ + prof : nombre maximale d'iteration\n\ +\n\ +Quelques exemples d'execution\n\ + mandel 800 800 0.35 0.355 0.353 0.358 200\n\ + mandel 800 800 -0.736 -0.184 -0.735 -0.183 500\n\ + mandel 800 800 -0.736 -0.184 -0.735 -0.183 300\n\ + mandel 800 800 -1.48478 0.00006 -1.48440 0.00044 100\n\ + mandel 800 800 -1.5 -0.1 -1.3 0.1 10000\n\ +"; + + +/** + * Convertion entier (4 octets) LINUX en un entier SUN + * @param i entier à convertir + * @return entier converti + */ + +int swap(int i) { + int init = i; + int conv; + unsigned char *o, *d; + + o = ( (unsigned char *) &init) + 3; + d = (unsigned char *) &conv; + + *d++ = *o--; + *d++ = *o--; + *d++ = *o--; + *d++ = *o--; + + return conv; +} + +/** + * Sauvegarde le tableau de données au format rasterfile + * 8 bits avec une palette de 256 niveaux de gris du blanc (valeur 0) + * vers le noir (255) + * @param nom Nom de l'image + * @param largeur largeur de l'image + * @param hauteur hauteur de l'image + * @param p pointeur vers tampon contenant l'image + */ + +void sauver_rasterfile( char *nom, int largeur, int hauteur, unsigned char *p) { + FILE *fd; + struct rasterfile ras; + int i; + unsigned char o; + + if ( (fd=fopen(nom, "w")) == NULL ) { + printf("erreur dans la creation du fichier %s \n",nom); + exit(1); + } + + ras.ras_magic = swap(RAS_MAGIC); + ras.ras_width = swap(largeur); /* largeur en pixels de l'image */ + ras.ras_height = swap(hauteur); /* hauteur en pixels de l'image */ + ras.ras_depth = swap(8); /* profondeur de chaque pixel (1, 8 ou 24 ) */ + ras.ras_length = swap(largeur*hauteur); /* taille de l'image en nb de bytes */ + ras.ras_type = swap(RT_STANDARD); /* type de fichier */ + ras.ras_maptype = swap(RMT_EQUAL_RGB); + ras.ras_maplength = swap(256*3); + + fwrite(&ras, sizeof(struct rasterfile), 1, fd); + + /* Palette de couleurs : composante rouge */ + i = 256; + while( i--) { + o= i/2; + fwrite( &o, sizeof(unsigned char), 1, fd); + } + + /* Palette de couleurs : composante verte */ + i = 256; + while( i--) { + o=(i%190); + fwrite( &o, sizeof(unsigned char), 1, fd); + } + + /* Palette de couleurs : composante bleu */ + i = 256; + while( i--) { + unsigned char o=(i%120) * 2; + fwrite( &o, sizeof(unsigned char), 1, fd); + } + + fwrite( p, largeur*hauteur, sizeof(unsigned char), fd); + fclose( fd); +} + +/** + * Étant donnée les coordonnées d'un point \f$c=a+ib\f$ dans le plan + * complexe, la fonction retourne la couleur correspondante estimant + * à quelle distance de l'ensemble de mandelbrot le point est. + * Soit la suite complexe défini par: + * \f[ + * \left\{\begin{array}{l} + * z_0 = 0 \\ + * z_{n+1} = z_n^2 - c + * \end{array}\right. + * \f] + * le nombre d'itérations que la suite met pour diverger est le + * nombre \f$ n \f$ pour lequel \f$ |z_n| > 2 \f$. + * Ce nombre est ramené à une valeur entre 0 et 255 correspond ainsi a + * une couleur dans la palette des couleurs. + */ + +unsigned char xy2color(double a, double b, int prof) { + double x, y, temp, x2, y2; + int i; + + x = y = 0.; + for( i=0; i<prof; i++) { + /* garder la valeur précédente de x qui va etre ecrase */ + temp = x; + /* nouvelles valeurs de x et y */ + x2 = x*x; + y2 = y*y; + x = x2 - y2 + a; + y = 2*temp*y + b; + if( x2 + y2 >= 4.0) break; + } + // return i*255/prof; + return (i==prof)?255:(int)((i%255)); +} + +/* + * Partie principale: en chaque point de la grille, appliquer xy2color + */ + +int main(int argc, char *argv[]) { + /* Domaine de calcul dans le plan complexe */ + double xmin, ymin; + double xmax, ymax; + /* Dimension de l'image */ + int w,h; + /* Pas d'incrementation */ + double xinc, yinc; + /* Profondeur d'iteration */ + int prof; + /* Image resultat */ + unsigned char *grid, *pgrid; + /* Variables intermediaires */ + int i, j; + double x, y; + /* Chronometrage */ + clock_t debut, fin; + + /* debut du chronometrage */ + debut = clock(); + + if( argc == 1) fprintf( stderr, "%s\n", info); + + /* Valeurs par defaut de la fractale */ + xmin = -2; ymin = -2; + xmax = 2; ymax = 2; + w = h = 800; + prof = 200; + + /* Recuperation des parametres */ + if( argc > 1) w = atoi(argv[1]); + if( argc > 2) h = atoi(argv[2]); + if( argc > 3) xmin = atof(argv[3]); + if( argc > 4) ymin = atof(argv[4]); + if( argc > 5) xmax = atof(argv[5]); + if( argc > 6) ymax = atof(argv[6]); + if( argc > 7) prof = atoi(argv[7]); + + /* Calcul des pas d'incrementation */ + xinc = (xmax - xmin) / (w-1); + yinc = (ymax - ymin) / (h-1); + + /* affichage parametres pour verificatrion */ + fprintf( stderr, "Domaine: {[%lg,%lg]x[%lg,%lg]}\n", xmin, ymin, xmax, ymax); + fprintf( stderr, "Increment : %lg %lg\n", xinc, yinc); + fprintf( stderr, "Prof: %d\n", prof); + fprintf( stderr, "Dim image: %dx%d\n", w, h); + + /* Allocation memoire du tableau resultat */ + pgrid = grid = (unsigned char *)malloc( w*h*sizeof(unsigned char)); + + if( grid == NULL) { + fprintf( stderr, "Erreur allocation mémoire du tableau \n"); + return 0; + } + + /* Traitement de la grille point par point */ + for ( y = ymin, i = 0; i < h; y += yinc, i++) { + for ( x = xmin, j = 0; j < w; x += xinc, j++) { + *pgrid++ = xy2color( x, y, prof); + } + } + + /* Sauvegarde de la grille dans le fichier resultat "mandel.ras" */ + sauver_rasterfile( "mandel.ras", w, h, grid); + + /* fin du chronometrage */ + fin = clock(); + fprintf( stderr, "Temps total de calcul : %g sec\n", + (double) (fin - debut) / CLOCKS_PER_SEC); + fprintf( stdout, "%g\n", (double) (fin - debut) / CLOCKS_PER_SEC); + + return 0; +} diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/rasterfile.h b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/rasterfile.h new file mode 100644 index 0000000..184f827 --- /dev/null +++ b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/rasterfile.h @@ -0,0 +1,50 @@ +/* @(#)rasterfile.h 1.11 89/08/21 SMI */ + +/* + * Description of header for files containing raster images + */ + +#ifndef _rasterfile_h +#define _rasterfile_h + +struct rasterfile { + int ras_magic; /* magic number */ + int ras_width; /* width (pixels) of image */ + int ras_height; /* height (pixels) of image */ + int ras_depth; /* depth (1, 8, or 24 bits) of pixel */ + int ras_length; /* length (bytes) of image */ + int ras_type; /* type of file; see RT_* below */ + int ras_maptype; /* type of colormap; see RMT_* below */ + int ras_maplength; /* length (bytes) of following map */ + /* color map follows for ras_maplength bytes, followed by image */ +}; +#define RAS_MAGIC 0x59a66a95 + + /* Sun supported ras_type's */ +#define RT_OLD 0 /* Raw pixrect image in 68000 byte order */ +#define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */ +#define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */ +#define RT_FORMAT_RGB 3 /* XRGB or RGB instead of XBGR or BGR */ +#define RT_FORMAT_TIFF 4 /* tiff <-> standard rasterfile */ +#define RT_FORMAT_IFF 5 /* iff (TAAC format) <-> standard rasterfile */ +#define RT_EXPERIMENTAL 0xffff /* Reserved for testing */ + + /* Sun registered ras_maptype's */ +#define RMT_RAW 2 + /* Sun supported ras_maptype's */ +#define RMT_NONE 0 /* ras_maplength is expected to be 0 */ +#define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */ + +/* + * NOTES: + * Each line of the image is rounded out to a multiple of 16 bits. + * This corresponds to the rounding convention used by the memory pixrect + * package (/usr/include/pixrect/memvar.h) of the SunWindows system. + * The ras_encoding field (always set to 0 by Sun's supported software) + * was renamed to ras_length in release 2.0. As a result, rasterfiles + * of type 0 generated by the old software claim to have 0 length; for + * compatibility, code reading rasterfiles must be prepared to compute the + * true length from the width, height, and depth fields. + */ + +#endif /*!_rasterfile_h*/ diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_1_nb_threads.c b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_1_nb_threads.c new file mode 100644 index 0000000..961ccc7 --- /dev/null +++ b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_1_nb_threads.c @@ -0,0 +1,16 @@ +#include <stdio.h> + +void nb_thread_kernel() { + size_t nb_threads = 0; + #pragma omp parallel + { + #pragma omp critical + nb_threads++; + } + printf("nb_threads = %zu\n", nb_threads); +} + +int main() { + nb_thread_kernel(); + return 0; +} diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_2_primes.c b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_2_primes.c new file mode 100644 index 0000000..b7d2608 --- /dev/null +++ b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_2_primes.c @@ -0,0 +1,123 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <unistd.h> +#include <stdbool.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define ERROR 1.e-20 // Acceptable precision +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +#define PRIME_MIN 3 +#define PRIME_MAX 100000 + +// Reference computation kernel (do not touch) +void prime_reference(size_t primes[], size_t* ptr_nb_primes) { + size_t nb_primes = 0; + size_t divisor; + bool is_prime; + + for (size_t i = PRIME_MIN; i < PRIME_MAX; i+=2) { + is_prime = true; + divisor = PRIME_MIN; + + while ((divisor < i) && is_prime) { + if ((i % divisor) == 0) + is_prime = false; + divisor += 2; + } + + if (is_prime) { + primes[nb_primes] = i; + nb_primes++; + } + } + + *ptr_nb_primes = nb_primes; +} + +// Computation kernel (to parallelize) +void prime_kernel(size_t primes[], size_t* ptr_nb_primes) { + size_t nb_primes = 0; + size_t divisor; + bool is_prime; + + #pragma omp parallel for schedule(dynamic) ordered private(divisor,is_prime) + for (size_t i = PRIME_MIN; i < PRIME_MAX; i+=2) { + is_prime = true; + divisor = PRIME_MIN; + + while ((divisor < i) && is_prime) { + + if ((i % divisor) == 0) + is_prime = false; + divisor += 2; + + } + + if (is_prime) { + #pragma omp ordered + primes[nb_primes] = i; + nb_primes++; + } + } + + *ptr_nb_primes = nb_primes; +} + +void print_sample(size_t tab[], size_t size, size_t sample_length) { + if (size <= 2 * sample_length) { + for (size_t i = 0; i < size; i++) + printf("%zu ", tab[i]); + } else { + for (size_t i = 0; (i < size) && (i < sample_length); i++) + printf("%zu ", tab[i]); + printf("... "); + for (size_t i = size - sample_length; i < size; i++) + printf("%zu ", tab[i]); + } + printf("\n"); +} + +int main() { + size_t* primes_ref = malloc(PRIME_MAX/2 * sizeof(size_t)); + size_t* primes = malloc(PRIME_MAX/2 * sizeof(size_t)); + size_t nb_primes_ref; + size_t nb_primes; + double time_reference, time_kernel, speedup, efficiency; + + time_reference = omp_get_wtime(); + prime_reference(primes_ref, &nb_primes_ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + prime_kernel(primes, &nb_primes); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + print_sample(primes_ref, nb_primes_ref, 5); + print_sample(primes, nb_primes, 5); + + // Check if the result differs from the reference + if (nb_primes_ref != nb_primes) { + printf("Bad results (wrong number of prime numbers) :-(((\n"); + exit(1); + } + for (size_t i = 0; i < nb_primes; i++) { + if (primes_ref[i] != primes[i]) { + printf("Bad results (prime numbers do not correspond) :-(((\n"); + exit(1); + } + } + printf("OK results :-)\n"); + + free(primes_ref); + free(primes); + return 0; +} diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_3_dag.c b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_3_dag.c new file mode 100644 index 0000000..fe0444b --- /dev/null +++ b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_3_dag.c @@ -0,0 +1,109 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise +#define MAX_VAL 5 // Random values are [0, MAX_VAL] + +double f(double x, double y, unsigned int time) { + sleep(time); + return x + 2 * y; +} + +// Reference computation kernel (do not touch) +void dag_reference(double r1, double r2, double r3, double* r) { + double d1, d2, d3, d4, d5, d6; + + d1 = f(r1, r2, 1); + d2 = f(r2, r3, 1); + d3 = f(d1, d2, 1); + d4 = f(r1, r3, 2); + d5 = f(r2, d2, 1); + d6 = f(d5, d4+d3, 1); + + *r = d6; +} + +// Computation kernel (to parallelize) +void dag_kernel(double r1, double r2, double r3, double* r) { + double d1, d2, d3, d4, d5, d6; + + #pragma omp parallel + { + #pragma omp single + { + #pragma omp task depend(out: d1) + { + d1 = f(r1,r2,1) ; + } + + #pragma omp task depend(out: d2) + { + d2 = f(r2,r3,1); + } + + + + #pragma omp task depend(in: d1,d2) depend(out:d3) + { + d3 = f(d1,d2,1); + } + + #pragma omp task depend(out:d4) + { + d4 = f(r1,r3,2); + } + + #pragma omp task depend(in: d2) depend(out: d5) + { + d5 = f(r2,d2,1); + } + + + + #pragma omp task depend(in:d5,d4,d3) + { + d6 = f(d5, d4+d3, 1); + } + + + } + } + *r = d6; + +} + +int main() { + double val_ref, val_ker; + double time_reference, time_kernel, speedup, efficiency; + // Initialization by random values + srand((unsigned int)time(NULL)); + double val1 = (double)rand()/(double)(RAND_MAX/MAX_VAL); + double val2 = (double)rand()/(double)(RAND_MAX/MAX_VAL); + double val3 = (double)rand()/(double)(RAND_MAX/MAX_VAL); + + time_reference = omp_get_wtime(); + dag_reference(val1, val2, val3, &val_ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + dag_kernel(val1, val2, val3, &val_ker); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + if (val_ref != val_ker) { + printf("Bad results :-(((\n"); + exit(1); + } + printf("OK results :-)\n"); + + return 0; +} diff --git a/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_4_fibonacci.c b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_4_fibonacci.c new file mode 100644 index 0000000..868ea23 --- /dev/null +++ b/Mec_discord/annales/tp3_synchronisation_et_taches_codes/tp3_4_fibonacci.c @@ -0,0 +1,92 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <omp.h> +#define HYPERTHREADING 1 // 1 if hyperthreading is on, 0 otherwise + +// ------------------------------------------------------- +// Reference computation part (do not touch) + +int fibor(int n) { + if (n < 2) + return n; + + return fibor(n-1) + fibor(n-2); +} + +void fibonacci_reference(int n, int* fibo) { + *fibo = fibor(n); +} + +// ------------------------------------------------------- +// Computation kernel (to parallelize) + +int fibok(int n) { + if (n < 2) + return n; + + int x , y ; + #pragma omp task shared(x) + { + x = fibok(n-1) ; + } + + #pragma omp task shared(y) + { + y = fibok(n-2); + } + + #pragma omp taskwait + return x+y; +} + +void fibonacci_kernel(int n, int* fibo) { + #pragma omp parallel + { + #pragma omp single + { + *fibo = fibok(n); + } + } +} + +// ------------------------------------------------------- + +int main(int argc, char* argv[]) { + double time_reference, time_kernel, speedup, efficiency; + int n, fibo_ref, fibo_ker; + + if (argc != 2) { + fprintf(stderr, "usage: %s number\n", argv[0]); + exit(1); + } + n = atoi(argv[1]); + + time_reference = omp_get_wtime(); + fibonacci_reference(n, &fibo_ref); + time_reference = omp_get_wtime() - time_reference; + printf("Reference time : %3.5lf s\n", time_reference); + + time_kernel = omp_get_wtime(); + fibonacci_kernel(n, &fibo_ker); + time_kernel = omp_get_wtime() - time_kernel; + printf("Kernel time -- : %3.5lf s\n", time_kernel); + + speedup = time_reference / time_kernel; + efficiency = speedup / (omp_get_num_procs() / (1 + HYPERTHREADING)); + printf("Speedup ------ : %3.5lf\n", speedup); + printf("Efficiency --- : %3.5lf\n", efficiency); + + // Check if the result differs from the reference + if (fibo_ref != fibo_ker) { + printf("Bad results :-(((\n"); + printf("Reference: fibo(%d) = %d\n", n, fibo_ref); + printf("Kernel: fibo(%d) = %d\n", n, fibo_ker); + exit(1); + } + printf("fibo(%d) = %d\n", n, fibo_ref); + printf("OK results :-)\n"); + + return 0; +} diff --git a/Mec_discord/annales/tpMPI/annale b/Mec_discord/annales/tpMPI/annale new file mode 100644 index 0000000000000000000000000000000000000000..2a1145fd87b53e700f99da3dac38b73ce8608bee GIT binary patch literal 18136 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 Tbh}ovKflb>xWZ;&W7&TK1H=_e literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tpMPI/annale.c b/Mec_discord/annales/tpMPI/annale.c new file mode 100644 index 0000000..a93f753 --- /dev/null +++ b/Mec_discord/annales/tpMPI/annale.c @@ -0,0 +1,373 @@ +// TRI QSORT/FUSION EN PARALLÈLE + +// Le but de ce TP est d'obtenir un programme de tri parallèle distribué sur +// un cluster de noeuds (en MPI) et d'utiliser tous les coeurs de chaque noeud +// grâce à une fonction qsort multi-threads (en OpenMP). + +// Vous pouvez faire des tests de performance sur une machine unique en +// lançant m processus MPI et t threads OpenMP, avec des valeurs de m et t +// contrôlées au moment de l'exécution. + +// Le sujet comporte 3 questions, notées QUESTION 1 (ligne 109), QUESTION 2 +// (ligne 156) et QUESTION 3 (ligne 207) de ce programme original. +// Déposez un seul fichier sur moodle avant la fin du temps indiqué. + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <sys/types.h> +#include <unistd.h> +#include <mpi.h> +#include <omp.h> + +// Taille du tableau à trier +//#define N 100000000 +// Pour faire de tous petits tests, on peut utiliser : + #define N 48 + + +/* INITIALISATIONS VARIABLES ET FONCTIONS GLOBALES, NE PAS MODIFIER */ +// fonction d'initialisation de la vérification (à appeler sur tableau initial) +void verif_init(int *); +// fonction de vérification : le tableau passé en argument est le tableau de +// verif_init() trié. +// (renvoie 0 si succès, 1 si échec + message sur stderr) +int verif(int *); + +// variables globales pour éviter les stack overflow. +int tab_init[N], res_init[N]; +int *tab = tab_init, *res = res_init; + + +/* FONCTION DONNÉE, NE PAS MODIFIER. */ +// fonction qui fait la fusion de deux parties de tableau triées tab1 et tab2 +// et remplit le tableau res avec le résultat de la fusion +void fusion(int *restrict res, int *restrict tab1, int len1, + int *restrict tab2, int len2) +{ + int is=0, js=0, r=0; + + while(is<len1 && js<len2) + { + if(tab2[js] < tab1[is]) + res[r++] = tab2[js++]; + else + res[r++] = tab1[is++]; + } + while(is<len1) + res[r++] = tab1[is++]; + while(js<len2) + res[r++] = tab2[js++]; +} + + +/* FONCTION DONNÉE, NE PAS MODIFIER. */ +// échange les valeurs de tab[i] et tab[j] +void echange(int *tab, int i, int j) +{ + int tmp = tab[j]; + tab[j] = tab[i]; + tab[i] = tmp; +} + + +/* FONCTION DONNÉE, NE PAS MODIFIER. */ +// sépare le tableau tab entre debut et fin, éléments inférieurs à un pivot au +// début et éléments supérieurs au pivot à la fin. +int separe(int *tab, int deb, int fin) +{ + // prend le pivot au début + int pivot = tab[deb]; + + // place tous les éléments inférieurs au pivot au début de tab + // (en position ind_plus_petit, un entier qui croît) après le pivot + int ind_plus_petit = deb; + for(int i=deb+1 ; i<fin ; i++) + { + if(tab[i] < pivot) + { + ind_plus_petit++; + // échange tab[i] et [ind_plus_petit] + echange(tab, i, ind_plus_petit); + } + } + + // puis place le pivot (mis au début) en position ind_plus_petit + echange(tab, ind_plus_petit, deb); + + // et retourne sa position dans tab + return(ind_plus_petit); +} + + +/* LA MÊME FONCTION, À PARALLÉLISER */ +/* RÉPONDRE AUX QUESTIONS CI-DESSOUS : +QUESTION 1 : +Paralléliser la boucle principale de cette fonction à l'aide d'OpenMP, en +protégeant les variables partagées 'tab' et 'ind_plus_petit' contre les accès +concurrents. + + +- est-ce que cette parallélisation est correcte ? pourquoi ? +non :( +>>> + + + +- que faudrait-il faire pour la rendre correcte ? +>>> + + +- pourquoi est-ce que la parallélisation de cette boucle ne peut pas rendre + ce programme parallèle efficace ? +>>> + +>>> + +*/ +// sépare le tableau tab entre debut et fin, éléments inférieurs à un pivot au +// début et éléments supérieurs à la fin. +int separe_openmp(int *tab, int deb, int fin) +{ + // prend le pivot au début + int pivot = tab[deb]; + + // place tous les éléments inférieurs au pivot au début de tab + // (en position ind_plus_petit, un entier qui croît) après le pivot + int ind_plus_petit = deb; + + #pragma omp parallel for reduction(+:ind_plus_petit) + for(int i=deb+1 ; i<fin ; i++) + { + if(tab[i] < pivot) + { + + + #pragma omp parallel critical + { + ind_plus_petit++; + // échange tab[i] et [ind_plus_petit] + + echange(tab, i, ind_plus_petit); + } + } + } + + // puis place le pivot (mis au début) en position ind_plus_petit + echange(tab, ind_plus_petit, deb); + + // et retourne sa position dans tab + return(ind_plus_petit); +} + + + +/* FONCTION À PARALLÉLISER */ +/* RÉPONDRE AUX QUESTIONS CI-DESSOUS : +QUESTION 2: +Paralléliser cette fonction en utilisant des tâches OpenMP. Vous ferez en +sorte de limiter le nombre de threads OpenMP créés. +Remarque 1 : vous pouvez modifier l'appel de cette fonction depuis la fonction +tri() (en-dessous) pour utiliser OpenMP efficacement. +Remarque 2 : utilisez la fonction separe() (en commentaire ci-dessous), au +lieu de la fonction separe_openmp() que vous avez modifiée. + + +- pour obtenir de bonnes performances, il faut arrêter de créer des threads + OpenMP à partir d'une certaine taille limite. Pourquoi ? +>>> + + +- La performance est améliorée si on augmente le nombre de threads OpenMP au + delà du nombre de coeurs d'une machine. Quelle pourrait être une raison + possible à cela ? +>>> + + +*/ +// quicksort parallèle du tableau tab +// données en entrée : tab[deb] à tab[(fin-1)] +void monsort_q(int *tab, int deb, int fin) +{ + // condition d'arrêt : si 2 éléments ou moins à trier + if(fin-deb <= 2) + { + // si 2 éléments exactement et qu'ils sont dans le désordre + if(fin-deb == 2 && tab[deb] > tab[fin-1]) + { + // échange tab[deb] et [fin-1] puis termine + echange(tab, deb, fin-1); + } + return; + } + + int pos_pivot; + // UTILISER LA VERSION ORIGINALE (NON PARALLÉLISÉE) POUR LES QUESTIONS 2 ET 3 + // pos_pivot = separe(tab, deb, fin); + pos_pivot = separe(tab, deb, fin); + + // appels récursifs + #pragma omp task shared(tab) if (fin - deb > 100) + { + monsort_q(tab, deb, pos_pivot); + } + #pragma omp task shared(tab) if (fin - deb > 100) + { + monsort_q(tab, pos_pivot+1, fin); + } + #pragma omp taskwait +} + + + +/* FONCTION À PARALLÉLISER EN UTILISANT MPI */ +/* RÉPONDRE AUX QUESTIONS CI-DESSOUS : +QUESTION 3: +Paralléliser cette fonction en utilisant MPI. Vous devrez également modifier +le programme principal (main()) ci-dessous. Le processus de rang 0 doit faire +l'initialisation du tableau et la vérification. +Le nombre de processus MPI est arbitraire, mais vous pouvez supposer que c'est +une puissance de 2. Vous pouvez supposer que le nombre de processus divise N. +Chaque processus MPI devra faire le tri d'une partie de tableau, puis tous les +processus devront collaborer pour faire des fusions de sous-tableaux deux à +deux selon un arbre binaire. + + +- Quel est l'intérêt d'effectuer les fusions deux à deux selon un arbre + binaire, au lieu d'envoyer toutes les données directement sur le processus 0 + immédiatement après l'appel à qsort ? +>>> + + +- Que faudrait-il faire pour pouvoir considérer un nombre de processus MPI qui + n'est pas une puissance de 2 et une taille de tableau non divisible par le + nombre de processus MPI ? +>>> + + +*/ +// trie le tableau global tab (utilise le tableau res) +void tri(int rank , int size,int part_size) +{ + // trie deux moitiés de tableaux (première et deuxième moitié de tab) + + monsort_q(tab, 0, part_size); + + // fusionne les deux parties + + for(int i = 1 ; i < size ; i*=2) + { + if ((rank %(2*i)) != 0) + { + MPI_Send(tab,part_size*i, MPI_INT,rank-i,0,MPI_COMM_WORLD); + MPI_Finalize(); + return(0); + } + else + { + MPI_Recv(tab + (part_size*i), part_size*i, MPI_INT, rank +i , 0 ,MPI_COMM_WORLD, MPI_STATUS_IGNORE); + fusion(res,tab,part_size*i,tab+ part_size*i,part_size*i); + int *tmp = tab; + tab= res ; + res = tmp ; + } + } +} + + +/* PROGRAMME PRINCIPAL */ +/* À MODIFIER POUR ÉCRIRE LA VERSION MPI (QUESTION 3) */ +int main(int argc, char **argv) +{ + double t1=0, t2; // pour la mesure du temps d'exécution + int rank,size; + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + if (rank == 0 ){ + // initialisation du tableau et de la vérification + srand(time(0)+getpid()); + for(int i=0 ; i<N ; i++) + { + tab[i] = rand()%N; + } + verif_init(tab); + // fin initialisation + } + // mesure du temps début du calcul + t1 = MPI_Wtime(); + + + int part_size = N / size; + MPI_Scatter(tab, part_size, MPI_INT, tab, part_size, MPI_INT, 0, MPI_COMM_WORLD); + /* le tri */ + tri(rank , size, part_size) + + + // mesure le temps d'exécution du tri + t2 = MPI_Wtime(); + fprintf(stderr, "temps d'exécution : %lgs\n", t2-t1); + + MPÃ_Finalize(); + // vérifie que le tableau tab est trié et renvoie un code d'erreur + return(verif(tab)); +} + + + +/* NE PAS MODIFIER LE RESTE DU PROGRAMME CI-DESSOUS */ +// fonctions de vérification du tri +static int compte[N]; +void verif_init(int *t) +{ + for(int i=0 ; i<N ; i++) + compte[i]=0; + for(int i=0 ; i<N ; i++) + compte[t[i]]++; +} +int verif(int *t) +{ + fprintf(stderr, "result:"); + for(int i=0 ; i<5&&i<N ; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, " ..."); + for(int i=N-5>0?N-5:0 ; i<N ; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, "\n"); + + /* vérification que le tableau t est bien le tableau trié : */ + /* vérifie que les éléments sont dans l'ordre, et que le nombre */ + /* d'occurrences de chaque valeur correspond au tableau compte. */ + int nb = 1; + for(int i=1 ; i<N ; i++) + { + if(t[i-1] == t[i]) + { + nb++; + } + else if(t[i-1] > t[i]) + { + fprintf(stderr, "Error (%d > %d at index %d-%d)\n", t[i-1], t[i], i-1, i); + return(1); + } + else + { + // vérifie le nombre d'occurrences de la valeur précédente + if(compte[t[i-1]] != nb) + { + fprintf(stderr, "Error (bad count of %d: %d occurences, should be %d)\n", t[i-1], nb, compte[t[i-1]]); + return(1); + } + nb = 1; + } + } + // vérifie le nombre d'occurrences de la dernière valeur + if(compte[t[N-1]] != nb) + { + fprintf(stderr, "Error (bad count of %d: %d occurences, should be %d)\n", t[N-1], nb, compte[t[N-1]]); + return(1); + } + fprintf(stderr, "Result OK!\n"); + return(0); +} diff --git a/Mec_discord/annales/tpMPI/hello b/Mec_discord/annales/tpMPI/hello new file mode 100644 index 0000000000000000000000000000000000000000..a767f0662dea926449077d71e171bf1e9c1b2c57 GIT binary patch literal 17128 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 literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tpMPI/hello.c b/Mec_discord/annales/tpMPI/hello.c new file mode 100644 index 0000000..df99308 --- /dev/null +++ b/Mec_discord/annales/tpMPI/hello.c @@ -0,0 +1,22 @@ +#include <stdio.h> +#include <mpi.h> +#include <stdlib.h> +#include <unistd.h> + +int main(int argc, char **argv) +{ + int rang, size; + char hn[100]; + gethostname(hn,100) ; + + if (MPI_Init(&argc,&argv)) + { + fprintf(stderr,"Erreur MPI_Init\n"); + exit(1); + } + MPI_Comm_rank(MPI_COMM_WORLD,&rang); + MPI_Comm_size(MPI_COMM_WORLD,&size) ; + printf("Je suis le processus numéro %d, sur %d(sur la machine %s) \n",rang,size,hn); + MPI_Finalize(); + return 0; +} \ No newline at end of file diff --git a/Mec_discord/annales/tpMPI/ping.c b/Mec_discord/annales/tpMPI/ping.c new file mode 100644 index 0000000..1d0dc45 --- /dev/null +++ b/Mec_discord/annales/tpMPI/ping.c @@ -0,0 +1,59 @@ +#include <mpi.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +int main(int argc, char** argv) +{ + double start,end; + int my_rank , num_procs; + int tag =0 ; + MPI_Status status; + + //Init MPI + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD,&my_rank) ; + MPI_Comm_size(MPI_COMM_WORLD,&num_procs); + int message_size = atoi(argv[1]); + int num_messages = atoi(argv[2]); + char *msg = malloc(message_size*sizeof(char)); + + for(int i = 0; i < message_size ; i++) + msg[i] = 'a' ; + start = MPI_Wtime(); + for (int i = 0; i < num_messages; i++) + { + if (my_rank == 0) + { + MPI_Ssend(msg,message_size,MPI_CHAR,1,tag,MPI_COMM_WORLD); + MPI_Recv(msg,message_size,MPI_CHAR,1,tag,MPI_COMM_WORLD,&status); + } + else + { + MPI_Recv(msg,message_size,MPI_CHAR,0,tag,MPI_COMM_WORLD,&status) ; + MPI_Ssend(msg,message_size,MPI_CHAR,0,tag,MPI_COMM_WORLD); + } + + } + + end = MPI_Wtime(); + if (my_rank == 0) + { + printf("Temps (process 0) : %f s\n",end-start); + } + if (my_rank == 1) + { + printf("Temps (process 1) : %f s\n", end-start); + } + if (my_rank == 0) + { + double temps_transmission = (end - start) / (num_messages * 2); + double debit = (message_size / temps_transmission) / (1024 * 1024 * 1024); + printf("%d pingpong effectués avec un message de taille %d\n",num_messages,message_size) ; + printf("Temps de transmission d'un message : %e s\n",temps_transmission); + printf("Débit : %f Goctets/s\n",debit); + } + free(msg); + MPI_Finalize(); + return 0 ; +} \ No newline at end of file diff --git a/Mec_discord/annales/tpMPI/prodmat b/Mec_discord/annales/tpMPI/prodmat new file mode 100644 index 0000000000000000000000000000000000000000..895953339b167b82cd43e7381644f919d1597b39 GIT binary patch literal 17640 zcmeHPeQ;CPmA{f~Z~)690cuDSUJ{r!NiA$J)Ub7sjBTD;nNTpn34v$XlCc)sa-}C@ znv&WzZlW>DlFX!qPIt!H*`(=o+x4c?9hyxVJ6HtBb_+DK>z3`VlZ95w*V;})ObBSt zx$hqN=^<@*cK4so>N4`V=XcJzALo9(ci+8yz1Cf4HklX&3%j2oH}V+`aR@<4m52aw zuu4`4f0wg6*&N{WIHt)R8Ud*m#?9%pK;RajXjhDp4D_=a%!pD6k)mC;AkWt%M43(F z(JmjOf;ZB2w`h7qNuJ72(&WrQOGN#M>g~`s#ig2EvG5<!8M1pkp}9nq3t_Y?5q9Kv zqD<HkC4Zt%@K-7PX`~X!Fi89_V@A71VP~W@LZ2w+fnmpG)%!omZ=0|imUuGENGTtp zl;4-Z4*l}q4b;rrMSj`ZAujw$6x$oa>UMwg`ij-<-qLn|XSk=dr*eJi`U-m}U|+-K zST4*1`_z`LJFz)N5EE|XZLvu3D1Uuyvgwh^mWTi4^OH|si$4B$-|6}OR!Rf&L>&xh zPfbjGF+@;@*Wc97@*K>J*iux0aNhTi9VdDM=A-i)uWXneq#>gT4S%hW(5(gx*~M9K zE65~NFogGj&y>zvS@1Wr;N@BJt<Qo-vZOONi~b#;FTu|kHUJ<QLE!hmFH^l<&4NFg z1>cbczmf%iF$?~D7W}ta@O!iP;dfc|r?TMpLppbZ%oz3qu#hcdl0!&DXMLLR>U8`b zNQdj!XgJL~48~VSmmddIMHy3+eI0>LC8T<Ss-iH()ljc^eL>$oe@OKO8|pW=2ReNX zp5}I+Cd(+P-{w-PTRb6^VQh1tqeBV#zv^QF$Vb7SHxR}YQqrKOb3f-?oqlyztpzO) z1cL2eF5J=LQK1k#Ugz)hv}2l>#uks-1~^ot1*@?hYS9(+cdD&QOWS_t>wz>wkcF3Z zh1C#K{T)zvtYXW4R8U$y{&u#{r*`?hti#t4@~I$h)uj+p!39CqdLZameW-~^1X{hG zgP_>b<560vG>U?S5bo>n_&eDax2t-yvc_JKimlbf*Vxx#Yna7sgVfAt9nqMg32}Zx zE&8W%9EADE!p=gJ=GjGle<7|w3bZ$3>QX<fs21iIe0Ul1W)=n>1FeJ9ABJ#3gCL1@ zlJF*h7dW^$wQdnVzDdJzZlt*vkqI46X(1lh;o?yNVK%A57jQ)TGo!;rQMiEmKhFO& z52HX5{U7mV2#6qw{*U<W1Oj!4^yflcxQ0t*9j<ScZ8}_QA1$#)9gcZWXwu>6BMNOg z9P_5orNhM|5f}C7@Oh*Rv{#2i2S|k{bU3ad6prffA_9RP)8W*oP&}l=7wYt1(Bb;| zdRT|wrqe&6!*N}vFrvd36A1LQ4qu|f&*^aSh^&+5qB#%bJdpFiACCt<EV}a(x&OTa zc`*OXYR2S&5!IYLC-;vPoaB{AuA2w&baLf<AVtd=>bId}I`LLAnLNsQT)3ta=Tkf` zSksBo6pst@bmDJQJT6?*iDy$hE?Covr&2sFRMUyR6pstkbmA*19vAfKgeS%0LN%TE za*D?VYC7Re@wm`WC(2ViF7VTdyHY$ZT+@k#DIOQB>4Yi8<3cr^n7Tpr#RUrLpW<<0 zg8HX;T#%st#Dn*ucJv-R1E9ZvkHPD`o`1!_|HQ!m(7-=u;QzwFKV#sd27bW6A2RS^ z1K(lbeFlDyf!}H1>kWLZfv+;~>-4-k+OVQP?!PqQOa^Cm%8|>?UCsxcJDm;A?K_~S z_C{X$8Z?z0`AHX&sK!M(=amQZR+d0>$dTI9<s<RmK%2<X@Dp;h>Tc-J@%J_U2=KQe ze;xP}Bha6Ye|+ePfeS?g2cWOY(L+beuf(4MS<PVWk=lWgqQmQ<Pdi^mO?R~LpFf96 zg_C7S?l=Q&T@#tuAxD1kXFMHu<g9-ZRh^N^_(h)M;=ckDS7f~W%+Huj0jsJX56_t6 zPjca*A;|3>%q=pp_qc*387X@5M^KBJXcH8_>hZFv{PHXAXz62M<O1)Q>iw74R><9d z0ZIH@*ON(iG+*Hbs%ixF`e>B(qH-@PxJ+a2$eHphvFo-4pO>S3tat8pcjPq~-(znd zT56W_d1C#q6~wMT)XQE>CSxBpo|ZS94o}3cF9eJJQ<5B&CAsegDuz$E`bM}#-|I-~ zH;jdcVlxN8Z^KZNhoCSgv|1MaeDzd5IPCfRz{8q@pmyM&$SG%JBpv|G!TKYO4-cFv z8h8$7mDdM)ph<B!zl3uP)cDBX%$VKLssU&$cXZujkX+=MHqeRx7^~be5g7$n{8B2s zFnV>lYxF(IX&Q5memdW|>K|(Tm#__LR!uk~WAVe76}OB{?K&g3j7LUg|3zUakG?CJ zPL5uizv>PDMKoG9?rs@zwT#LB8LXf?a`H=2cZ|8B6`Neqmp366yJqWS--RYX-}H^L zN)wA+UGfxn9*R!iNCMx-mL!v7|9+_WH50hDZX)(!<LTJd#peK8I%0~w+ju^9t??`% zBPfwKd>sCs>>t4*xJ)BseW6G4PQ_*#@_!31iCtZte+p>P<D0=Z;O=A;omDjOF7zDi zy59j<9;|&q9^82%c5c`Ea&%oC+Fi3P{uWSquzu)O^s2n-HTk~UV`Fdq^4_zcJB$&? ze(za%)mizz`lHDI`UKADv1@xTK)K#PWE2WJ67RSMuAhNFkkM(cyjB}*MFYDr@2Kxw z`N(eP!_G&Xdz^cn${ts=dFEs}^h`eg#ciMBs682P1pDY0iec#d=!Y-}&H(F<{s6mc zZTXefR(sL%!;m>nm<|?y1EjI>U6*1Pp^(@1=KnqTX6)HV7v`;v4;w^7DCz@Ig{%Km zflGAOSLD8v*kG={G2WIN-VGm1lw(l_3#~Biyi^ET{fs*%S~UYpjXN^X1dfeeTNuTj z2A+<u$081LSdK2XK|bJBE|mwX&cM*FiM+*=;BJF5*z%x*kH@W_B$MSA65DZ@4;BuA z;!9RtZpR?E_^&}HQ3D$BA&9|f--GC-tH~s9t@t|-i-$p!T0hF)cSX+cl_PJ%967nI z0S0~@cYon8AZ<wC1SlsLPyY#Hzds7>QkW0rX#TB8Hq5AtVd?)@km1sQOLC%Uc`sP8 zlY)YN0)^3aZzEZCLyk<!qaSRNM`tXu>6Co_hPnt6cupixkeq1c<sy4r?|Q3Vf$`45 z_wAJXtG)r6FdJW17l5n22~7M~Gf*Kf6!BF4GoWYM1GcIB(LQkigrYpiJ9ohhuzLl} zrw_U!|K!~1ihKlXLFCh&a<tS9@DBH?>-bC)U;Z&TaP+!GU0!}s*t;Xs?#Kr<k>5F! zi~ddSKWUOT{3iSkKJV<_L;dumuFqk9_#}jsKPRQ0i~!7qoCk6q$ax^=ft&~aNIhVJ zJ$d-b;0p((E>B4E`n&xhKYS&*OJdc|8fkm&j-Bp?9nxLwf&Eg@7YetlA!*~Pc?>_9 zNE@Y<?X98DN${-&zH#^j56_mc4_?ykX%G8$uk`N0pHwBS+$V+F0^xSA)a(NW(h%YJ z@#8;re)|2X3-!(0`0i@&VY`!ru<~R0I`O94Eq_`A%v|_&{YNs{19W&YnH&N-0`vsX z$*E-W98eo9|4l#{JYW>V6Hyn?CVa4iKzqQZuWo0i9-Ha*1#=6If(&u|fcnCfWD?#n z;7M*SzU?!3tY8)JoBSY|bYL1*Tb;G|i$(Jf6!fx9%QoJ-cE#O*a{EVs7C>3JA%YMv zT@@pMmx(eUi*-2yzhWr!?YIx(S}>2fZF9`s?2AQ~?#4N`B6D|-&1&xMvK5-U+iVNW z-A%PNi@AH7WymrQl<T47&iR<moA8@}a{GX?I;-u^%`R*4la^Ym6wRx(mK@2iv6g*v zj%=;$pS#8C=(JWktz}MYNwrm~wiZ`gZPnHS{_W<oP`(229Tq1SavsQeAm@Rc2XY?B zc_8P3oCk6q`2XMmI*&x>kLZ!zNY4sqEFh<dhko2d#!w;-2hkZJI`>3pfM9Qz2RbW6 z=b!K$1Ov%Gx{(YZKZM^>A<(mVk2usrXM4tloZhbbM1k=WC<Z#iq(AF|xG-ZS;(QC8 zIXW%u@%;q@zIS1uvoF1{_l<$@9#LQ_cY&}MYN`D1)XY-#gAH|FKTzkUu>Z~ZN|6w} z1CpFu!fO=gKM@(jra0%R9wPbwGm<)gZAh_9w6{ahZGtul+9hbOphpEA5_DM55kb!h zIw9z!pm2zi2b-Xhpk;zO1l=a6p_qS=EpTWmTQ+arD3$DN4tJ_yX@kAOURGKj=3Mz> zYs&0p74|i&H2e=H34O|xI^VC?#?yv$K0O_`Fgkypj_0wjWoTFni~<@D>H2dRje~T2 zE~D|1ju$ZMN9p)2jQU?XK95m9Psiso8V~6>%nsC!I)MdlQAinaD{IQojuuwLx-#N6 zHl#lUC-SgBr=j^rmo2mlC`)=oi(A-jsq^@HsRec~W-{t8PMzaS*I$x4$C-|QhGiN@ z7MK-i-bvSoS<|6Mw75lo{#Ylrq@AqP1UUWVv8kj^jYn}l%!K1vKQlDeBu#L_5a&(A zC7M75jvuxVZ!+Lcz)euj65N>KagA={@tgf~0B}ra$dFDy*T31%*~<TyTz?VMcB6pN zg-rDw=JK1{{UqQpdT(l%Uvd4#H?{9O0;lzjv+(CS{7kS~7~B16SYXWT=5etaa0yS; zIw%E=&Vh!^(8bv@jzhbE2?kmh*FrkCf<NgV(`rr3vYn5wg>)pLqbChn@@>t6_hiAJ z&VsK%+<fym{p&3HZ)CyW%!0=O&s48G@XtcsJdh_UeH-_`-UC{^6mVOHcG(E{-8ZYV z2LaF2Ub|o($NK;dF)r{cKbm{t??UrZW^<$`)|DllM}<DETV(YF*SE1@F^>3NC<u>b zN#}XMZBQO#zAt9ce>n?2o&~?01)l<(`(aG0Kl$OqEc$bV-z4%6=wY}FKP<mvOxz>m zC}T@Vzghr7|6am{|LHmHe!w%e*YCkD6TThvu|F97_E45|_H%r8o#K1lP&9n5)cV7e zHgrXQU|qq0x5J~_TUbj_4XI)HCf~wl?}R97hth(#LPBsE!W&TbwFjC#?TS|o1Vf4^ z+{54&M_0Q~^?B`;W$Vi`E8z_azv2l7JqHzEry4xST7#YrpW+R7bl@cm9jAb%nx?8K zb=#fwwMy;Q8oaWizzr^?Ru-UKvz;kh+z(Vc-O2-XbvtSslm=(DyA~DGQu3w){00nD zY989^taoh|_d*;Fy3T<YH^gO+mQa`%A9&rRky%x|?_s!BgZEHo6)-Klq>_&4@372D zFfsiFlv#<cMB42gynd1{#=A23xky}gNf-XtSA8CUJ1t&+rxFhNz)^TBDC5l^=m8$p zquqajO6%{&r015p`ok{<DGJ;y678qE&;zN30!ka)+`;Qc+SMBLHntnT_`|Oj@ykPs z(i{qjd@%*>`jPRL&ukegZoWlC*Nd99%R;ld=vm{{r4+BbqoiFEO1IPQ45ed=51qvC zA*BoWg&}4S9qdp&%|O+lM%yR`cba^`E@tlxs6P9?&afTEW|uFh9@Ih2VL#lJgsV)N zmb2Pbs(SV@uHNPewK2Q*U?*guQ8lPZx_!ZrKhT-RC?E^^+C69>VqNVjvvc>`A!^?j z02U)5UkkIVz8+w4B!hN<*U|246Jxi{3#k#OrJ)UC&4S{Pm8ZiGiD~B0sLYNohDkw8 zpZ{Be@B6S6!!wT-ieWy)K$PD1HB{53IMRFIhp)P1Un%T~N+8n*n%4<i4-vh6qp&Bs zf)oX%=K+FU277uRBPx-ipho*$fWxQB0F|HK+lW>OJKD!Emfr(%eC8$laZ!GvLqdRc zL_d=~Jx==pLld&6_duewPXa1DU>f@H6<}}=g6!#ik!Yn*rt*^>(Z@iJdm6;kdnHka zus4=pz$^+8^eNfX`zKM_XQBL!_5Zf8uNDc?dn!@d=Rte)nbH1Pz|bd@J}mxP5R~?_ z1j@@wairgcpWa>)c0?TphZ~Y--!s@ZiT7Zlq>p)FAfD(jVEX*&J({Tgn|vnwpBn6k z#6uC$fs|v=dNzNJW9(Ik=<}!da-y_fNczU{6BG8-{!9{@f@1yjf$B}z&mn^Oll`!y zNr={HZ0fHu|BE2e+s{avDp8~VsQ*xc_?(JIUB$3X?Hka&e4{?`M5n;ENM}#`q*5t> z5J*qsW_iN#JrtXW@~8Jv`hOP4F*yD(kRAE)2Y_MyQ}$w?v_!mEj-!z-kUdd+f7RPF zhfprlDCI**kR9<0z!)*gUvg*?o3NJ-r$7HonmF}$p~zpTr*N{zeGGlTvSQFv>N}c5 z`|A)1Hi`n@0k9o@RDPO&asQXfu32h-kBN!1%OIqDNf(E^L4}J7zMyH~K7c+LSoWV` C&DSIV literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tpMPI/prodmat.c b/Mec_discord/annales/tpMPI/prodmat.c new file mode 100644 index 0000000..40a7d2a --- /dev/null +++ b/Mec_discord/annales/tpMPI/prodmat.c @@ -0,0 +1,107 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <sys/time.h> +#include <math.h> +#include <mpi.h> + + +/* matrix size */ +#define N 2496 + +// Random values are [0, MAX_VAL] +#define MAX_VAL 5 + +// Nomber of checks +#define NBCHECKS 10 +// acceptable error (in check) +#define ERROR 1.e-3 + +#define DIFFTEMPS(a,b) (((b).tv_sec - (a).tv_sec) + ((b).tv_usec - (a).tv_usec)/1000000.) + +/* global to avoid stack overflow */ +double a[N][N],b[N][N],c[N][N]; + +int main(int argc, char** argv) +{ + int size,rank ; + MPI_Init(&argc,&argv); + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank) ; + if (N%size != 0) + { + MPI_Finalize(); + printf("erreur pas divisible! \n"); + exit(1); + } + + struct timeval tv_init, tv_begin, tv_end; + gettimeofday(&tv_init, NULL); + + /***************************************************************************/ + // initialization + if (rank == 0 ) + { + srand((unsigned int)time(NULL)+getpid()); + for (int i=0;i<N;i++) + for (int j=0;j<N;j++) + { + b[i][j]=(double)rand()/(double)(RAND_MAX/MAX_VAL); + a[i][j]=(double)rand()/(double)(RAND_MAX/MAX_VAL); + } + + } + MPI_Scatter(a, (N/size)*N,MPI_DOUBLE,a,(N/size) *N, MPI_DOUBLE,0,MPI_COMM_WORLD) ; + MPI_Bcast(b,N*N, MPI_DOUBLE,0 ,MPI_COMM_WORLD); + + + /***************************************************************************/ + // compute + + gettimeofday(&tv_begin, NULL); + + for(int i=0;i<N/size;i++) + for(int j=0;j<N;j++) + c[i][j] = 0.; + for(int i=0 ; i<N/size ; i++) + for(int j=0 ; j<N ; j++) + for(int k=0 ; k<N ; k++) + c[i][j] += a[i][k] * b[k][j]; + + + gettimeofday(&tv_end, NULL); + + + /***************************************************************************/ + // check some arbitrary values + MPI_Gather(c, N*N/size,MPI_DOUBLE,c, N*N/size,MPI_DOUBLE,0,MPI_COMM_WORLD); + if (rank == 0){ + int check_ok = 1; + for(int checks=0 ; checks<NBCHECKS ; checks++) + { + int i = rand()%N; + int j = rand()%N; + double val = 0.; + for(int k=0 ; k<N ; k++) + val += a[i][k] * b[k][j]; + if(fabs(val - c[i][j]) > ERROR) + { + fprintf(stderr, "BAD RESULTS !"); + fprintf(stderr, " (value[%d][%d] = %g should be %g)\n", + i, j, c[i][j], val); + check_ok = 0; + } + } + if(check_ok) + fprintf(stderr, "Ok results :)\n"); + + /***************************************************************************/ + /* execution times */ + printf("Init : %lfs, Compute : %lfs\n", + DIFFTEMPS(tv_init,tv_begin), + DIFFTEMPS(tv_begin,tv_end)); + } + MPI_Finalize(); + return(0); +} \ No newline at end of file diff --git a/Mec_discord/annales/tpMPI/tri b/Mec_discord/annales/tpMPI/tri new file mode 100644 index 0000000000000000000000000000000000000000..7efd1c755987566016dc4107966ce49dfe9d7e8f GIT binary patch literal 17728 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 LSZFh_vEqLKE?(lo literal 0 HcmV?d00001 diff --git a/Mec_discord/annales/tpMPI/tri_qs_fusion.c b/Mec_discord/annales/tpMPI/tri_qs_fusion.c new file mode 100644 index 0000000..b8ac43d --- /dev/null +++ b/Mec_discord/annales/tpMPI/tri_qs_fusion.c @@ -0,0 +1,148 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <sys/types.h> +#include <unistd.h> +#include <mpi.h> + +//#define N 10000000 +#define N 1000 +// pour qsort +int compare(const void *p1, const void *p2) +{ + int v1=*(int *)p1, v2=*(int *)p2; + if(v1<v2) + return(-1); + else if(v2<v1) + return(1); + else + return(0); +} + +// pour fusionner deux parties de tableau triées tab1 et tab2 +// remplit res avec la fusion +void fusion(int *restrict res, int *restrict tab1, int len1, int *restrict tab2, int len2) +{ + int is=0, js=0, r=0; + + while(is<len1 && js<len2) + { + if(tab2[js] < tab1[is]) + res[r++] = tab2[js++]; + else + res[r++] = tab1[is++]; + } + while(is<len1) + res[r++] = tab1[is++]; + while(js<len2) + res[r++] = tab2[js++]; + +} + +// fonction d'initialisation de la vérification +void verif_init(int *); +// fonction de vérification : le tableau passé en argument est le tableau de verif_init() trié +// (renvoie 0 si succès, 1 si échec + message sur stderr) +int verif(int *); + +int tabi[N], resi[N]; + +int main(int argc, char **argv) { + int rank, size; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int *res = resi; + int *tab = tabi; + + if (rank == 0) { + srand(time(0) + getpid()); + for (int i = 0; i < N; i++) { + tab[i] = rand() % N; + } + verif_init(tab); + } + + int part_size = N / size; + + MPI_Scatter(tab, part_size, MPI_INT, tab, part_size, MPI_INT, 0, MPI_COMM_WORLD); + + qsort(tab, part_size, sizeof(int), compare); + + for(int i = 1 ; i < size ; i*=2) + { + if ((rank %(2*i)) != 0) + { + MPI_Send(tab,part_size*i, MPI_INT,rank-i,0,MPI_COMM_WORLD); + MPI_Finalize(); + return(0); + } + else + { + MPI_Recv(tab + (part_size*i), part_size*i, MPI_INT, rank +i , 0 ,MPI_COMM_WORLD, MPI_STATUS_IGNORE); + fusion(res,tab,part_size*i,tab+ part_size*i,part_size*i); + int *tmp = tab; + tab= res ; + res = tmp ; + } + } + MPI_Finalize(); + return verif(tab); +} + +static int compte[N]; +void verif_init(int *t) +{ + for(int i=0 ; i<N ; i++) + compte[i]=0; + for(int i=0 ; i<N ; i++) + compte[t[i]]++; +} +int verif(int *t) +{ + fprintf(stderr, "result:"); + for(int i=0 ; i<5&&i<N ; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, " ..."); + for(int i=N-5>0?N-5:0 ; i<N ; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, "\n"); + + /* vérification que le tableau t est bien le tableau trié : */ + /* vérifie que les éléments sont dans l'ordre, et que le nombre */ + /* d'occurrences de chaque valeur correspond au tableau compte. */ + int nb = 1; + for(int i=1 ; i<N ; i++) + { + if(t[i-1] == t[i]) + { + nb++; + } + else if(t[i-1] > t[i]) + { + fprintf(stderr, "Error (%d > %d at index %d-%d)\n", t[i-1], t[i], i-1, i); + return(1); + } + else + { + // vérifie le nombre d'occurrences de la valeur précédente + if(compte[t[i-1]] != nb) + { + fprintf(stderr, "Error (bad count of %d: %d occurences, should be %d)\n", t[i-1], nb, compte[t[i-1]]); + return(1); + } + nb = 1; + } + } + // vérifie le nombre d'occurrences de la dernière valeur + if(compte[t[N-1]] != nb) + { + fprintf(stderr, "Error (bad count of %d: %d occurences, should be %d)\n", t[N-1], nb, compte[t[N-1]]); + return(1); + } + fprintf(stderr, "Result OK!\n"); + + + return(0); +} diff --git a/Mec_discord/annales/tri_fusion_first_try.c b/Mec_discord/annales/tri_fusion_first_try.c new file mode 100644 index 0000000..f5c35d2 --- /dev/null +++ b/Mec_discord/annales/tri_fusion_first_try.c @@ -0,0 +1,420 @@ +// TRI QSORT/FUSION EN PARALLÈLE + +// Le but de ce TP est d'obtenir un programme de tri parallèle distribué sur +// un cluster de noeuds (en MPI) et d'utiliser tous les coeurs de chaque noeud +// grâce à une fonction qsort multi-threads (en OpenMP). + +// Vous pouvez faire des tests de performance sur une machine unique en +// lançant m processus MPI et t threads OpenMP, avec des valeurs de m et t +// contrôlées au moment de l'exécution. + +// Le sujet comporte 3 questions, notées QUESTION 1 (ligne 109), QUESTION 2 +// (ligne 156) et QUESTION 3 (ligne 207) de ce programme original. +// Déposez un seul fichier sur moodle avant la fin du temps indiqué. + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <sys/types.h> +#include <unistd.h> +#include <mpi.h> +#include <omp.h> + +// Taille du tableau à trier +#define N 100000000 +// Pour faire de tous petits tests, on peut utiliser : +// #define N 48 + + +/* INITIALISATIONS VARIABLES ET FONCTIONS GLOBALES, NE PAS MODIFIER */ +// fonction d'initialisation de la vérification (à appeler sur tableau initial) +void verif_init(int *); +// fonction de vérification : le tableau passé en argument est le tableau de +// verif_init() trié. +// (renvoie 0 si succès, 1 si échec + message sur stderr) +int verif(int *); + +// variables globales pour éviter les stack overflow. +int tab_init[N], res_init[N]; +int *tab = tab_init, *res = res_init; + + +/* FONCTION DONNÉE, NE PAS MODIFIER. */ +// fonction qui fait la fusion de deux parties de tableau triées tab1 et tab2 +// et remplit le tableau res avec le résultat de la fusion +void fusion(int *restrict res, int *restrict tab1, int len1, + int *restrict tab2, int len2) +{ + int is=0, js=0, r=0; + + while(is<len1 && js<len2) + { + if(tab2[js] < tab1[is]) + res[r++] = tab2[js++]; + else + res[r++] = tab1[is++]; + } + while(is<len1) + res[r++] = tab1[is++]; + while(js<len2) + res[r++] = tab2[js++]; +} + + +/* FONCTION DONNÉE, NE PAS MODIFIER. */ +// échange les valeurs de tab[i] et tab[j] +void echange(int *tab, int i, int j) +{ + int tmp = tab[j]; + tab[j] = tab[i]; + tab[i] = tmp; +} + + +/* FONCTION DONNÉE, NE PAS MODIFIER. */ +// sépare le tableau tab entre debut et fin, éléments inférieurs à un pivot au +// début et éléments supérieurs au pivot à la fin. +int separe(int *tab, int deb, int fin) +{ + // prend le pivot au début + int pivot = tab[deb]; + + // place tous les éléments inférieurs au pivot au début de tab + // (en position ind_plus_petit, un entier qui croît) après le pivot + int ind_plus_petit = deb; + for(int i=deb+1 ; i<fin ; i++) + { + if(tab[i] < pivot) + { + ind_plus_petit++; + // échange tab[i] et [ind_plus_petit] + echange(tab, i, ind_plus_petit); + } + } + + // puis place le pivot (mis au début) en position ind_plus_petit + echange(tab, ind_plus_petit, deb); + + // et retourne sa position dans tab + return(ind_plus_petit); +} + + +/* LA MÊME FONCTION, À PARALLÉLISER */ +/* RÉPONDRE AUX QUESTIONS CI-DESSOUS : +QUESTION 1 : +Paralléliser la boucle principale de cette fonction à l'aide d'OpenMP, en +protégeant les variables partagées 'tab' et 'ind_plus_petit' contre les accès +concurrents. + + +- est-ce que cette parallélisation est correcte ? pourquoi ? +>>> + + L'ordre dans lequel les éléments sont échangés dépend de + l'ordonnancement des threads. Et comme l'echange se fait + en se basant sur ind_plus_petit qui est partagé, même si on + protège notre boucle des accès concurrents, les échanges ne + seront pas dans la bon ordre. + +- que faudrait-il faire pour la rendre correcte ? +>>> + + + + +- pourquoi est-ce que la parallélisation de cette boucle ne peut pas rendre + ce programme parallèle efficace ? + L'utilisation de la clause critical dans la boucle où chaque thread peut potentiellement entrer en compétition pour accéder à cette section critique rend l'exécution largement séquentielle, + car les threads doivent attendre leur tour pour effectuer l'échange. Cela crée un goulot d'étranglement significatif qui réduit les bénéfices de la parallélisation, puisque les threads sont + souvent bloqués en attente de l'accès à la section critique. +>>> + + +*/ +// sépare le tableau tab entre debut et fin, éléments inférieurs à un pivot au +// début et éléments supérieurs à la fin. +int separe_openmp(int *tab, int deb, int fin) +{ + // prend le pivot au début + int pivot = tab[deb]; + + // place tous les éléments inférieurs au pivot au début de tab + // (en position ind_plus_petit, un entier qui croît) après le pivot + int ind_plus_petit = deb; + + #pragma omp parallel for reduction(+:ind_plus_petit) + for(int i=deb+1 ; i<fin ; i++) + { + if(tab[i] < pivot) + { + #pragma omp critical + { + ind_plus_petit++; + // échange tab[i] et [ind_plus_petit] + echange(tab, i, ind_plus_petit); + } + } + } + + // puis place le pivot (mis au début) en position ind_plus_petit + + echange(tab, ind_plus_petit, deb); + + // et retourne sa position dans tab + return(ind_plus_petit); +} + + + +/* FONCTION À PARALLÉLISER */ +/* RÉPONDRE AUX QUESTIONS CI-DESSOUS : +QUESTION 2: +Paralléliser cette fonction en utilisant des tâches OpenMP. Vous ferez en +sorte de limiter le nombre de threads OpenMP créés. +Remarque 1 : vous pouvez modifier l'appel de cette fonction depuis la fonction +tri() (en-dessous) pour utiliser OpenMP efficacement. +Remarque 2 : utilisez la fonction separe() (en commentaire ci-dessous), au +lieu de la fonction separe_openmp() que vous avez modifiée. + + +- pour obtenir de bonnes performances, il faut arrêter de créer des threads + OpenMP à partir d'une certaine taille limite. Pourquoi ? +>>> +La création de threads OpenMP entraîne un certain coût en termes de temps et de +ressources. Lorsque la taille des données à traiter devient petite par rapport à ce coût, +le bénéfice de la parallélisation diminue et peut même devenir négligeable voire négatif. +Pour des données très petites, il est possible que le temps de création et de gestion des +threads soit plus important que le temps nécessaire pour effectuer le travail réel. + +- La performance est améliorée si on augmente le nombre de threads OpenMP au + delà du nombre de coeurs d'une machine. Quelle pourrait être une raison + possible à cela ?on +>>> + +L'augmentation du nombre de threads OpenMP au-delà du nombre de cÅ“urs physiques d'une +machine peut parfois améliorer les performances en raison de l'exploitation des unités +d'exécution simultanée (SMT, Simultaneous Multi-Threading) ou de l'hyper-threading. +Ces technologies permettent à chaque cÅ“ur physique de traiter plusieurs threads +simultanément, en fournissant des ressources supplémentaires pour exécuter les threads +supplémentaires, même si les ressources matérielles sont déjà utilisées à pleine capacité +par les threads existants. + +*/ +// quicksort parallèle du tableau tab +// données en entrée : tab[deb] à tab[(fin-1)] +void monsort_q(int *tab, int deb, int fin) +{ + + // condition d'arrêt : si 2 éléments ou moins à trier + if(fin-deb <= 2) + { + // si 2 éléments exactement et qu'ils sont dans le désordre + if(fin-deb == 2 && tab[deb] > tab[fin-1]) + { + // échange tab[deb] et [fin-1] puis termine + echange(tab, deb, fin-1); + } + return; + } + + int pos_pivot; + // UTILISER LA VERSION ORIGINALE (NON PARALLÉLISÉE) POUR LES QUESTIONS 2 ET 3 + //pos_pivot = separe(tab, deb, fin); + //monsort_q(tab, deb, pos_pivot); + // monsort_q(tab, pos_pivot + 1, fin); + //pos_pivot = separe_openmp(tab, deb, fin); + + // Utilisation de tâches OpenMP pour paralléliser les appels récursifs + + pos_pivot = separe(tab, deb, fin); + + // Appels récursifs parallélisés + #pragma omp task shared(tab) if (fin - deb > 100) // Utilisation d'une condition pour limiter la création de tâches + { + monsort_q(tab, deb, pos_pivot); + } + + #pragma omp task shared(tab) if (fin - deb > 100) // Utilisation d'une condition pour limiter la création de tâches + { + monsort_q(tab, pos_pivot + 1, fin); + } + + // Synchronisation des tâches avant de terminer + #pragma omp taskwait + +} + + + +/* FONCTION À PARALLÉLISER EN UTILISANT MPI */ +/* RÉPONDRE AUX QUESTIONS CI-DESSOUS : +QUESTION 3: +Paralléliser cette fonction en utilisant MPI. Vous devrez également modifier +le programme principal (main()) ci-dessous. Le processus de rang 0 doit faire +l'initialisation du tableau et la vérification. +Le nombre de processus MPI est arbitraire, mais vous pouvez supposer que c'est +une puissance de 2. Vous pouvez supposer que le nombre de processus divise N. +Chaque processus MPI devra faire le tri d'une partie de tableau, puis tous les +processus devront collaborer pour faire des fusions de sous-tableaux deux à +deux selon un arbre binaire. + + +- Quel est l'intérêt d'effectuer les fusions deux à deux selon un arbre + binaire, au lieu d'envoyer toutes les données directement sur le processus 0 + immédiatement après l'appel à qsort ? +>>> +L'intérêt d'effectuer les fusions deux à deux selon un arbre binaire réside dans la réduction de la communication entre les processus MPI. +Plutôt que d'envoyer toutes les données directement au processus 0, ce qui peut entraîner des goulets d'étranglement +et une charge disproportionnée sur ce processus, la fusion deux à deux permet de distribuer la charge de manière équilibrée entre les processus. + De plus, cela peut réduire le temps de communication global, car chaque processus fusionne localement avec un autre processus, + ce qui peut être plus efficace en termes de bande passante et de latence. + + +- Que faudrait-il faire pour pouvoir considérer un nombre de processus MPI qui + n'est pas une puissance de 2 et une taille de tableau non divisible par le + nombre de processus MPI ? + Oui, vous avez raison. Une autre approche possible consiste à distribuer le travail entre les processus pairs et impairs. Cela peut être une solution plus simple et efficace, surtout si la taille du tableau n'est pas nécessairement divisible par le nombre de processus MPI. + +Voici comment cela pourrait être mis en Å“uvre : + + Nombre de processus MPI non une puissance de 2 : + Divisez le tableau en deux parties : une pour les processus pairs et une pour les processus impairs. + Distribuez les parties du tableau aux processus de manière équilibrée, en attribuant à chaque processus une quantité de travail similaire. + + Taille de tableau non divisible par le nombre de processus MPI : + Si la taille du tableau n'est pas divisible par le nombre de processus, vous pouvez attribuer équitablement les éléments du tableau à partir du premier élément jusqu'à ce que tous les éléments soient attribués. + Les processus impairs peuvent traiter un élément supplémentaire si nécessaire. + +Cela garantit que chaque processus MPI a une charge de travail équilibrée, et la gestion de la distribution des éléments du tableau est plus simple. +>>> + + +*/ +// trie le tableau global tab (utilise le tableau res) +// trie le tableau global tab (utilise le tableau res) +void tri(int rank , int size,int part_size) +{ + // trie deux moitiés de tableaux (première et deuxième moitié de tab) + + monsort_q(tab, 0, part_size); + + // fusionne les deux parties + + for(int i = 1 ; i < size ; i*=2) + { + if ((rank %(2*i)) != 0) + { + MPI_Send(tab,part_size*i, MPI_INT,rank-i,0,MPI_COMM_WORLD); + MPI_Finalize(); + return(0); + } + else + { + MPI_Recv(tab + (part_size*i), part_size*i, MPI_INT, rank +i , 0 ,MPI_COMM_WORLD, MPI_STATUS_IGNORE); + fusion(res,tab,part_size*i,tab+ part_size*i,part_size*i); + int *tmp = tab; + tab= res ; + res = tmp ; + } + } +} + + +/* PROGRAMME PRINCIPAL */ +/* À MODIFIER POUR ÉCRIRE LA VERSION MPI (QUESTION 3) */ +int main(int argc, char **argv) +{ + double t1=0, t2; // pour la mesure du temps d'exécution + int rank,size; + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD,&size); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + if (rank == 0 ){ + // initialisation du tableau et de la vérification + srand(time(0)+getpid()); + for(int i=0 ; i<N ; i++) + { + tab[i] = rand()%N; + } + verif_init(tab); + // fin initialisation + } + // mesure du temps début du calcul + t1 = MPI_Wtime(); + + + int part_size = N / size; + MPI_Scatter(tab, part_size, MPI_INT, tab, part_size, MPI_INT, 0, MPI_COMM_WORLD); + /* le tri */ + tri(rank , size, part_size) + + + // mesure le temps d'exécution du tri + t2 = MPI_Wtime(); + fprintf(stderr, "temps d'exécution : %lgs\n", t2-t1); + + MPÃ_Finalize(); + // vérifie que le tableau tab est trié et renvoie un code d'erreur + return(verif(tab)); +} + + + + +/* NE PAS MODIFIER LE RESTE DU PROGRAMME CI-DESSOUS */ +// fonctions de vérification du tri +static int compte[N]; +void verif_init(int *t) +{ + for(int i=0 ; i<N ; i++) + compte[i]=0; + for(int i=0 ; i<N ; i++) + compte[t[i]]++; +} +int verif(int *t) +{ + fprintf(stderr, "result:"); + for(int i=0 ; i<5&&i<N ; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, " ..."); + for(int i=N-5>0?N-5:0 ; i<N ; i++) + fprintf(stderr, " %d", t[i]); + fprintf(stderr, "\n"); + + /* vérification que le tableau t est bien le tableau trié : */ + /* vérifie que les éléments sont dans l'ordre, et que le nombre */ + /* d'occurrences de chaque valeur correspond au tableau compte. */ + int nb = 1; + for(int i=1 ; i<N ; i++) + { + if(t[i-1] == t[i]) + { + nb++; + } + else if(t[i-1] > t[i]) + { + fprintf(stderr, "Error (%d > %d at index %d-%d)\n", t[i-1], t[i], i-1, i); + return(1); + } + else + { + // vérifie le nombre d'occurrences de la valeur précédente + if(compte[t[i-1]] != nb) + { + fprintf(stderr, "Error (bad count of %d: %d occurences, should be %d)\n", t[i-1], nb, compte[t[i-1]]); + return(1); + } + nb = 1; + } + } + // vérifie le nombre d'occurrences de la dernière valeur + if(compte[t[N-1]] != nb) + { + fprintf(stderr, "Error (bad count of %d: %d occurences, should be %d)\n", t[N-1], nb, compte[t[N-1]]); + return(1); + } + fprintf(stderr, "Result OK!\n"); + return(0); +} -- GitLab