From efd2eda83ac63fc9b0b9696adae727c239a86f7a Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <pedro.gonnet@durham.ac.uk>
Date: Wed, 5 Jun 2013 08:34:50 +0000
Subject: [PATCH] don't trust openmp to get the dynamic scheduling right.

Former-commit-id: 552defa8304bc560e60c8b4a94087abc26bb663b
---
 src/space.c | 34 ++++++++++++++++++++++++++--------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/src/space.c b/src/space.c
index ba49a64c95..e2f1760454 100644
--- a/src/space.c
+++ b/src/space.c
@@ -697,7 +697,7 @@ void space_map_mkghosts ( struct cell *c , void *data ) {
  
 void space_map_parts ( struct space *s , void (*fun)( struct part *p , struct cell *c , void *data ) , void *data ) {
 
-    int i;
+    int i, cid = 0;
 
     void rec_map ( struct cell *c ) {
     
@@ -717,9 +717,18 @@ void space_map_parts ( struct space *s , void (*fun)( struct part *p , struct ce
         }
         
     /* Call the recursive function on all higher-level cells. */
-    #pragma omp parallel for schedule(dynamic,1)
-    for ( i = 0 ; i < s->nr_cells ; i++ )
-        rec_map( &s->cells[i] );
+    #pragma omp parallel shared(cid)
+    {
+        int mycid;
+        while ( 1 ) {
+            #pragma omp critical
+            mycid = cid++;
+            if ( mycid < s->nr_cells )
+                rec_map( &s->cells[i] );
+            else
+                break;
+            }
+        }
 
     }
 
@@ -735,7 +744,7 @@ void space_map_parts ( struct space *s , void (*fun)( struct part *p , struct ce
  
 void space_map_cells_post ( struct space *s , int full , void (*fun)( struct cell *c , void *data ) , void *data ) {
 
-    int i;
+    int i, cid;
 
     void rec_map ( struct cell *c ) {
     
@@ -754,9 +763,18 @@ void space_map_cells_post ( struct space *s , int full , void (*fun)( struct cel
         }
         
     /* Call the recursive function on all higher-level cells. */
-    #pragma omp parallel for schedule(dynamic,1)
-    for ( i = 0 ; i < s->nr_cells ; i++ )
-        rec_map( &s->cells[i] );
+    #pragma omp parallel shared(cid)
+    {
+        int mycid;
+        while ( 1 ) {
+            #pragma omp critical
+            mycid = cid++;
+            if ( mycid < s->nr_cells )
+                rec_map( &s->cells[i] );
+            else
+                break;
+            }
+        }
 
     }
 
-- 
GitLab