diff --git a/TDs/TD1/CORRECTION/Partie2/td1_p2.c b/TDs/TD1/CORRECTION/Partie2/td1_p2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2c935b1b9407042fa0d9f083a5bc696447728392
--- /dev/null
+++ b/TDs/TD1/CORRECTION/Partie2/td1_p2.c
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+
+void kernel(double *a, double *b, double *c, int N, int dimBlock, int blockId, int threadId)
+{
+
+  int i, j, k;
+ 	i = blockId * dimBlock + threadId;
+
+ 	if (i < N)
+ 	{
+ 		c[i] = a[i] + b[i];
+	}
+}
+
+int main(int argc, char **argv)
+{
+    int N = 1000;
+    int sz_in_bytes = N*sizeof(double);
+
+    double *h_a, *h_b, *h_c;
+    double *d_a, *d_b, *d_c;
+
+    h_a = (double*)malloc(sz_in_bytes);
+    h_b = (double*)malloc(sz_in_bytes);
+    h_c = (double*)malloc(sz_in_bytes);
+
+    // Initiate values on h_a and h_b
+    for(int i = 0 ; i < N ; i++)
+    {
+	h_a[i] = 1./(1.+i);
+	h_b[i] = (i-1.)/(i+1.);
+    }
+
+    // 3-arrays allocation on device 
+//    cudaMalloc((void**)&d_a, sz_in_bytes);
+//    cudaMalloc((void**)&d_b, sz_in_bytes);
+//    cudaMalloc((void**)&d_c, sz_in_bytes);
+    d_a = (double*)malloc(sz_in_bytes);
+    d_b = (double*)malloc(sz_in_bytes);
+    d_c = (double*)malloc(sz_in_bytes);
+
+
+    // copy on device values pointed on host by h_a and h_b
+    // (the new values are pointed by d_a et d_b on device)
+
+//    cudaMemcpy(d_a, h_a, sz_in_bytes, cudaMemcpyHostToDevice);
+//    cudaMemcpy(d_b, h_b, sz_in_bytes, cudaMemcpyHostToDevice);
+	memcpy(d_a, h_a, sz_in_bytes);
+	memcpy(d_b, h_b, sz_in_bytes);
+
+    //dim3  dimBlock(64, 1, 1);
+    //dim3  dimGrid((N + dimBlock.x - 1)/dimBlock.x, 1, 1);
+	int dimBlock = (64);
+	int dimGrid = ((N + 64 - 1)/64);
+
+  for(int blockId = 0; blockId < dimGrid; ++blockId)
+  {
+    for(int tid = 0; tid < dimBlock; ++tid)
+    {
+      kernel(d_a, d_b, d_c, N, dimBlock, blockId, tid);
+    }
+  }
+
+    // Result is pointed by d_c on device
+    // Copy this result on host (result pointed by h_c on host)
+//    cudaMemcpy(h_c, d_c, sz_in_bytes, cudaMemcpyDeviceToHost);
+	memcpy(h_c, d_c, sz_in_bytes);
+
+    // freeing on device 
+//    cudaFree(d_a);
+//    cudaFree(d_b);
+//    cudaFree(d_c);
+    free(d_a);
+    free(d_b);
+    free(d_c);
+
+    free(h_a);
+    free(h_b);
+    free(h_c);
+
+    return 0;
+}
diff --git a/TDs/TD1/CORRECTION/Partie2/td2.c b/TDs/TD1/CORRECTION/Partie2/td2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e331b0a3953c0d48b4306d14c782c93ae101dfe0
--- /dev/null
+++ b/TDs/TD1/CORRECTION/Partie2/td2.c
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+
+void kernel(double *a, double *b, double *c, int N, int dimGrid, int dimBlock)
+{
+
+  int i, j, k;
+
+  for(j=0; j<dimGrid; j++)
+  {
+  	for(k=0; k<dimBlock; k++)
+    {
+  		i = j * dimBlock + k;
+  		if (i < N)
+  		{
+  			c[i] = a[i] + b[i];
+  		}
+  	}
+  }
+}
+
+int main(int argc, char **argv)
+{
+    int N = 1000;
+    int sz_in_bytes = N*sizeof(double);
+
+    double *h_a, *h_b, *h_c;
+    double *d_a, *d_b, *d_c;
+
+    h_a = (double*)malloc(sz_in_bytes);
+    h_b = (double*)malloc(sz_in_bytes);
+    h_c = (double*)malloc(sz_in_bytes);
+
+    // Initiate values on h_a and h_b
+    for(int i = 0 ; i < N ; i++)
+    {
+	h_a[i] = 1./(1.+i);
+	h_b[i] = (i-1.)/(i+1.);
+    }
+
+    // 3-arrays allocation on device 
+//    cudaMalloc((void**)&d_a, sz_in_bytes);
+//    cudaMalloc((void**)&d_b, sz_in_bytes);
+//    cudaMalloc((void**)&d_c, sz_in_bytes);
+    d_a = (double*)malloc(sz_in_bytes);
+    d_b = (double*)malloc(sz_in_bytes);
+    d_c = (double*)malloc(sz_in_bytes);
+
+
+    // copy on device values pointed on host by h_a and h_b
+    // (the new values are pointed by d_a et d_b on device)
+
+//    cudaMemcpy(d_a, h_a, sz_in_bytes, cudaMemcpyHostToDevice);
+//    cudaMemcpy(d_b, h_b, sz_in_bytes, cudaMemcpyHostToDevice);
+	memcpy(d_a, h_a, sz_in_bytes);
+	memcpy(d_b, h_b, sz_in_bytes);
+
+    dim3  dimBlock(64, 1, 1);
+    dim3  dimGrid((N + dimBlock.x - 1)/dimBlock.x, 1, 1);
+	int dimBlock = (64);
+	int dimGrid = ((N + 64 - 1)/64);
+
+    kernel(d_a, d_b, d_c, N, dimGrid, dimBlock);
+
+    // Result is pointed by d_c on device
+    // Copy this result on host (result pointed by h_c on host)
+//    cudaMemcpy(h_c, d_c, sz_in_bytes, cudaMemcpyDeviceToHost);
+	memcpy(h_c, d_c, sz_in_bytes);
+
+    // freeing on device 
+//    cudaFree(d_a);
+//    cudaFree(d_b);
+//    cudaFree(d_c);
+    free(d_a);
+    free(d_b);
+    free(d_c);
+
+
+    free(h_a);
+    free(h_b);
+    free(h_c);
+
+    return 0;
+}
diff --git a/TDs/TD1/SUJET/td1.pdf b/TDs/TD1/SUJET/td1.pdf
index 2b625b1e169022ff40e61423f10e8c6349033f7c..c409c6b0c0cc64db65c2a1de90c43fe94f2f4ceb 100644
Binary files a/TDs/TD1/SUJET/td1.pdf and b/TDs/TD1/SUJET/td1.pdf differ
diff --git a/TDs/TD1/SUJET/td1_slide.pdf b/TDs/TD1/SUJET/td1_slide.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a963410bce4d5231fb29f16344b9d865a35511d0
Binary files /dev/null and b/TDs/TD1/SUJET/td1_slide.pdf differ