diff --git a/Benchmark/particles_starpu/particles-simu-starpu.cpp b/Benchmark/particles_starpu/particles-simu-starpu.cpp
index 28e5645e0728d942a8f2119ce0836f4fd3a22f79..e8c34e6d45c78a04f762a1b90dc42a167f704e76 100644
--- a/Benchmark/particles_starpu/particles-simu-starpu.cpp
+++ b/Benchmark/particles_starpu/particles-simu-starpu.cpp
@@ -43,14 +43,12 @@ public:
 
 private:
     std::size_t nbParticles;
-    std::vector<double> values[NB_VALUE_TYPES];
+    std::vector<double> values;
 
 public:
     explicit ParticlesGroup(const std::size_t inNbParticles = 0)
         : nbParticles(inNbParticles){
-        for(std::size_t idxValueType = 0 ; idxValueType < NB_VALUE_TYPES ; ++idxValueType){
-            values[idxValueType].resize(nbParticles, 0);
-        }
+        values.resize(nbParticles*NB_VALUE_TYPES, 0);
     }
 
     ParticlesGroup(const ParticlesGroup&) = default;
@@ -62,14 +60,14 @@ public:
                            const std::array<double, NB_VALUE_TYPES>& inValues){
         assert(inIdxParticle < nbParticles);
         for(std::size_t idxValueType = 0 ; idxValueType < NB_VALUE_TYPES ; ++idxValueType){
-            values[idxValueType][inIdxParticle] = inValues[idxValueType];
+            values[idxValueType*nbParticles + inIdxParticle] = inValues[idxValueType];
         }
     }
 
     auto getParticle(const std::size_t inIdxParticle) const {
         std::array<double, NB_VALUE_TYPES> valuesPart;
         for(std::size_t idxValueType = 0 ; idxValueType < NB_VALUE_TYPES ; ++idxValueType){
-            valuesPart[idxValueType] = values[idxValueType][inIdxParticle];
+            valuesPart[idxValueType] = values[idxValueType*nbParticles + inIdxParticle];
         }
         return valuesPart;
     }
@@ -81,8 +79,8 @@ public:
 
     /////////////////////////////////////////////////////////////
 
-    void* getRawPtr(){
-        return values;
+    double* getRawPtr(){
+        return values.data();
     }
 
     size_t getRawSize() const{
@@ -91,7 +89,7 @@ public:
 };
 
 
-void computeSelf(double* values[ParticlesGroup::NB_VALUE_TYPES], const std::size_t nbParticles){
+void computeSelf(std::array<double*,ParticlesGroup::NB_VALUE_TYPES> values, const std::size_t nbParticles){
     for(std::size_t idxTarget = 0 ; idxTarget < nbParticles ; ++idxTarget){
         const double tx = double(values[ParticlesGroup::X][idxTarget]);
         const double ty = double(values[ParticlesGroup::Y][idxTarget]);
@@ -376,7 +374,7 @@ const int NbThreadsPerBlock = 256;
 
 static void p2p_inner_cpu_starpu_starpu(void *buffers[], void *cl_arg)
 {
-    double* values[ParticlesGroup::NB_VALUE_TYPES];
+    std::array<double*,ParticlesGroup::NB_VALUE_TYPES> values;
     values[0] = reinterpret_cast<double*>(STARPU_VECTOR_GET_PTR(buffers[0]));
     const std::size_t nbParticles = STARPU_VECTOR_GET_NX(buffers[0]);
 
@@ -557,7 +555,7 @@ auto BenchCore( const int NbLoops, const int MinPartsPerGroup, const int MaxPart
         std::vector<starpu_data_handle_t> handles;
         for(auto& group : particleGroups){
             starpu_data_handle_t handle;
-            starpu_vector_data_register(&handle, 0, reinterpret_cast<uintptr_t>(group.getRawPtr()), group.getRawSize(), 1);
+            starpu_vector_data_register(&handle, 0, reinterpret_cast<uintptr_t>(group.getRawPtr()), group.getNbParticles(), sizeof(double));
             handles.push_back(handle);
         }
 
@@ -582,10 +580,15 @@ auto BenchCore( const int NbLoops, const int MinPartsPerGroup, const int MaxPart
 
         // Wait for all tasks to be done
         starpu_task_wait_for_all();
-
         timer.stop();
+
         starpu_shutdown();
 
+        for(auto& handle : handles){
+            starpu_data_unregister(handle);
+        }
+
+
         minMaxAvg[0] = std::min(minMaxAvg[0], timer.getElapsed());
         minMaxAvg[1] = std::max(minMaxAvg[1], timer.getElapsed());
         minMaxAvg[2] += timer.getElapsed();