diff --git a/TPs/TP2/CODE/Makefile b/TPs/TP2/CODE/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..087df5f56444cbbc05026aa03a653f3c60a18cac
--- /dev/null
+++ b/TPs/TP2/CODE/Makefile
@@ -0,0 +1,21 @@
+CC=gcc
+CFLAGS=-O3 -Wall
+LDFLAGS=-lm
+EXE=tp2.exe
+
+all : $(EXE)
+
+$(EXE) : tp2.o
+	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) 
+
+%.o : %.c
+	$(CC) $(CFLAGS) -c -o $@ $<
+
+run : $(EXE)
+	./$< 10240
+
+proper : 
+	rm -f *.o
+
+clean :
+	rm -f *.o $(EXE)
diff --git a/TPs/TP2/CODE/tp2.c b/TPs/TP2/CODE/tp2.c
new file mode 100755
index 0000000000000000000000000000000000000000..52054e51c1b1364f90d2335a6d2e58276c663ab5
--- /dev/null
+++ b/TPs/TP2/CODE/tp2.c
@@ -0,0 +1,64 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#define NSTREAMS 4
+
+void verif(float *out, int sz)
+{
+  float err = 0.;
+
+  for(int i = 0 ; i < sz ; i++)
+  {
+    err += abs(out[i] - exp( - abs(sin(i * 1.0)) ));
+  }
+
+  if (err/sz < 1.e-4)
+  {
+	  fprintf(stdout, "TEST PASSED (error %3.f < 1.e-4)\n", err/sz);
+  }
+  else
+  {
+	  fprintf(stderr, "TEST FAILED (error %3.f > 1.e-4)\n", err/sz);
+  }
+}
+
+void func(float *out, int size)
+{
+  for(int i = 0; i < size; ++i)
+  {
+    out[i] = exp( - abs(out[i]) );
+  }
+}
+
+int main(int argc, char** argv)
+{
+  int size = 1024;
+  if (argc == 2)
+  {
+	  size = atoi(argv[1]);
+  }
+
+  size *= NSTREAMS;
+
+  float *tab = NULL;
+  tab = (float*) malloc(sizeof(float) * size);
+
+  if(tab == NULL)
+  {
+    fprintf(stderr, "Bad allocation\n");
+    return -1;
+  }
+
+  for(int i = 0; i < size; ++i)
+  {
+    tab[i] = sin(i * 1.);
+  }
+
+  func(tab, size);
+
+  verif(tab, size);
+
+  free(tab);
+  return 0;
+}
diff --git a/TPs/TP2/CODE/tp2.cu b/TPs/TP2/CODE/tp2.cu
new file mode 100755
index 0000000000000000000000000000000000000000..137cfc16847247bc16b5c8ec7f30d6ebb6adaa07
--- /dev/null
+++ b/TPs/TP2/CODE/tp2.cu
@@ -0,0 +1,67 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#define NSTREAMS 4
+
+void verif(float *out, int sz)
+{
+  float err = 0.;
+
+  for(int i = 0 ; i < sz ; i++)
+  {
+    err += abs(out[i] - exp( - abs(sin(i * 1.0)) ));
+  }
+
+  if (err/sz < 1.e-4)
+  {
+	  fprintf(stdout, "TEST PASSED (error %3.f < 1.e-4)\n", err/sz);
+  }
+  else
+  {
+	  fprintf(stderr, "TEST FAILED (error %3.f > 1.e-4)\n", err/sz);
+  }
+}
+
+void func(float *out, int size)
+{
+  for(int i = 0; i < size; ++i)
+  {
+    out[i] = exp( - abs(out[i]) );
+  }
+}
+
+int main(int argc, char** argv)
+{
+  int size = 1024;
+  if (argc == 2)
+  {
+	  size = atoi(argv[1]);
+  }
+
+  size *= NSTREAMS;
+
+  float *tab = NULL;
+  tab = (float*) malloc(sizeof(float) * size);
+
+  float d_tab;
+  cudaMalloc(
+
+  if(tab == NULL)
+  {
+    fprintf(stderr, "Bad allocation\n");
+    return -1;
+  }
+
+  for(int i = 0; i < size; ++i)
+  {
+    tab[i] = sin(i * 1.);
+  }
+
+  func(tab, size);
+
+  verif(tab, size);
+
+  free(tab);
+  return 0;
+}
diff --git a/TPs/TP2/DOCS/StreamsAndConcurrencyWebinar.pdf b/TPs/TP2/DOCS/StreamsAndConcurrencyWebinar.pdf
new file mode 100755
index 0000000000000000000000000000000000000000..fa2d3b5f6e36b0f6a8ca43db3bc754d7f8de9c0b
Binary files /dev/null and b/TPs/TP2/DOCS/StreamsAndConcurrencyWebinar.pdf differ
diff --git a/TPs/TP2/SUJET/tp2.pdf b/TPs/TP2/SUJET/tp2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..5a3f0a389860d388f9b37b3cedb1793103510415
Binary files /dev/null and b/TPs/TP2/SUJET/tp2.pdf differ