diff --git a/TDs/TD2/CORRECTION/Makefile b/TDs/TD2/CORRECTION/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..b51970c246b010e4eff4e06c30f78f7212bc8cc7
--- /dev/null
+++ b/TDs/TD2/CORRECTION/Makefile
@@ -0,0 +1,54 @@
+CC=gcc
+CUDA_CC=nvcc
+CFLAGS_OMP=-O3 -Wall -fopenmp -DUSE_OMP
+CFLAGS=-O3 -Wall
+EXE1=pi.exe
+EXE2=pi_omp.exe
+# EXE3=pi_task.exe
+#EXE3=pi_cuda.exe
+#EXE4=pi_cuda_shared.exe
+#EXE5=pi_cuda_shared_2.exe
+#EXE6=pi_cuda_shared_3.exe
+#EXE7=pi_cuda_shared_4.exe
+
+all : $(EXE1) $(EXE2) 
+#$(EXE3) $(EXE4) $(EXE5) $(EXE6) $(EXE7) 
+
+$(EXE1) : pi_sequentiel.o
+	$(CC) $(CFLAGS) -o $@ $<
+
+$(EXE2) : pi_omp.o
+	$(CC) $(CFLAGS_OMP) -o $@ $<
+
+# $(EXE3) : pi_task.o
+#   $(CC) $(CFLAGS_OMP) -o $@ $<
+
+$(EXE3) : pi_cuda.cu
+	$(CUDA_CC) -O3 -o $@ $<
+
+$(EXE4) : pi_cuda_shared.cu
+	$(CUDA_CC) -O3 -o $@ $<
+
+$(EXE5) : pi_cuda_shared_2.cu
+	$(CUDA_CC) -O3 -o $@ $<
+
+$(EXE6) : pi_cuda_shared_3.cu
+	$(CUDA_CC) -O3 -o $@ $<
+
+$(EXE7) : pi_cuda_shared_4.cu
+	$(CUDA_CC) -O3 -o $@ $<
+
+%_omp.o : %_omp.c
+	$(CC) $(CFLAGS_OMP) -c -o $@ $<
+
+%_task.o : %_task.c
+	$(CC) $(CFLAGS_OMP) -c -o $@ $<
+
+%.o : %.c
+	$(CC) $(CFLAGS) -c -o $@ $<
+
+clean :
+	rm -f *.o $(EXE1) $(EXE2) $(EXE3) $(EXE4) $(EXE5) $(EXE6) $(EXE7) 
+
+proper :
+	rm -f *.o
diff --git a/TDs/TD2/CORRECTION/pi_omp.c b/TDs/TD2/CORRECTION/pi_omp.c
new file mode 100755
index 0000000000000000000000000000000000000000..70c5537e61b7710af9cde1ed96cb7e05f9a8e8f5
--- /dev/null
+++ b/TDs/TD2/CORRECTION/pi_omp.c
@@ -0,0 +1,69 @@
+#include <inttypes.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "omp.h"
+
+#define TRIALS_PER_THREAD 10E7
+
+#define gettime(t) clock_gettime(CLOCK_MONOTONIC_RAW, t)
+#define get_sub_seconde(t) (1e-9 * (double)t.tv_nsec)
+/** return time in second
+ */
+double get_elapsedtime(void) {
+    struct timespec st;
+    int err = gettime(&st);
+    if (err != 0) return 0;
+    return (double)st.tv_sec + get_sub_seconde(st);
+}
+
+int main(int argc, char** argv) {
+    uint64_t const n_test = TRIALS_PER_THREAD;
+    uint64_t i;
+    double x = 0., y = 0.;
+    double pi = 0.;
+    double t0 = 0., t1 = 0., duration = 0.;
+
+    int nb_threads = 0;
+#pragma omp parallel shared(nb_threads)
+#pragma omp master
+    nb_threads = omp_get_num_threads();
+    fprintf(stdout, "Nb threads: %d\n", nb_threads);
+
+    uint64_t* result = (uint64_t*)malloc(sizeof(uint64_t) * nb_threads);
+    for (i = 0; i < nb_threads; ++i) {
+        result[i] = 0;
+    }
+
+    srand(2023);
+    t0 = get_elapsedtime();
+#pragma omp parallel shared(result) firstprivate(n_test, x, y)
+    {
+        uint64_t local_res = 0;
+        unsigned int seed = time(NULL) ^ omp_get_thread_num() ^ getpid();
+#pragma omp for schedule(static)
+        for (i = 0; i < n_test; ++i) {
+            x = rand_r(&seed) / (double)RAND_MAX;
+            y = rand_r(&seed) / (double)RAND_MAX;
+            local_res += (((x * x) + (y * y)) <= 1);
+        }
+        int tid = omp_get_thread_num();
+        result[tid] = local_res;
+    }
+
+    for (i = 0; i < nb_threads; ++i) {
+        pi += result[i];
+    }
+    t1 = get_elapsedtime();
+    duration = (t1 - t0);
+    fprintf(stdout, "%ld of %ld throws are in the circle ! (Time: %lf s)\n",
+            (uint64_t)pi, n_test, duration);
+    pi *= 4;
+    pi /= (double)n_test;
+    fprintf(stdout, "Pi ~= %lf\n", pi);
+
+    return 0;
+}
diff --git a/TDs/TD2/CORRECTION/pi_sequentiel.c b/TDs/TD2/CORRECTION/pi_sequentiel.c
new file mode 100755
index 0000000000000000000000000000000000000000..342031f53aa201d220da300b09b3447136c501b3
--- /dev/null
+++ b/TDs/TD2/CORRECTION/pi_sequentiel.c
@@ -0,0 +1,26 @@
+#include <inttypes.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char** argv) {
+    uint64_t n_test = 10E7;
+    uint64_t i;
+    uint64_t count = 0;
+    double x = 0., y = 0.;
+    double pi = 0.;
+
+    srand(2023);
+    for (i = 0; i < n_test; ++i) {
+        x = rand() / (double)RAND_MAX;
+        y = rand() / (double)RAND_MAX;
+
+        count += (((x * x) + (y * y)) <= 1);
+    }
+
+    fprintf(stdout, "%ld of %ld throws are in the circle !\n", count, n_test);
+    pi = (count * 4) / (double)n_test;
+    fprintf(stdout, "Pi ~= %lf\n", pi);
+
+    return 0;
+}