Fix illegal barrier in worksharing
authorRoland Schulz <roland@utk.edu>
Fri, 12 Oct 2012 04:54:02 +0000 (00:54 -0400)
committerRoland Schulz <roland@utk.edu>
Fri, 12 Oct 2012 04:54:02 +0000 (00:54 -0400)
According to section 2.10 of the OpenMP standard:
  A barrier region may not be closely nested inside a worksharing
  ... region.

Replaced parallel-for with parallel plus gmx_omp_get_thread_num.

Fixes #937

Change-Id: Ief31f2097fb084d405e5981913cce2c2bfee868c

src/mdlib/clincs.c
src/mdlib/pme.c

index d124eec7914c6e37642a34b3d73eb7f57c9bf030..e650ea6650ea8e40012006501ac85f0a98a40188 100644 (file)
@@ -53,6 +53,7 @@
 #include "mtop_util.h"
 #include "gmxfio.h"
 #include "gmx_omp_nthreads.h"
+#include "gmx_omp.h"
 
 typedef struct {
     int b0;           /* first constraint for this thread */
@@ -1522,18 +1523,14 @@ gmx_bool constrain_lincs(FILE *fplog,gmx_bool bLog,gmx_bool bEner,
         }
 
         /* The (only) OpenMP parallel region of constrain_lincs */
+#pragma omp parallel num_threads(lincsd->nth)
         {
-            int th;
-
-#pragma omp parallel for num_threads(lincsd->nth) schedule(static)
-            for(th=0; th<lincsd->nth; th++)
-            {
-                do_lincs(x,xprime,box,pbc,lincsd,th,
-                         md->invmass,cr,
-                         bCalcVir || (ir->efep != efepNO),
-                         ir->LincsWarnAngle,&warn,
-                         invdt,v,bCalcVir,rmdr);
-            }
+            int th=gmx_omp_get_thread_num();
+            do_lincs(x,xprime,box,pbc,lincsd,th,
+                     md->invmass,cr,
+                     bCalcVir || (ir->efep != efepNO),
+                     ir->LincsWarnAngle,&warn,
+                     invdt,v,bCalcVir,rmdr);
         }
         
         if (ir->efep != efepNO)
index a9fa5c1d07b2ae4cf7551916c5f61d997ace7a3f..5ff27d7e0ec73abcbda257ad4506557b0ed09682 100644 (file)
@@ -88,6 +88,7 @@
 #include "gmx_parallel_3dfft.h"
 #include "pdbio.h"
 #include "gmx_cyclecounter.h"
+#include "gmx_omp.h"
 
 /* Single precision, with SSE2 or higher available */
 #if defined(GMX_X86_SSE2) && !defined(GMX_DOUBLE)
@@ -4324,9 +4325,9 @@ int gmx_pme_do(gmx_pme_t pme,
         }
 
         /* Here we start a large thread parallel region */
-#pragma omp parallel for num_threads(pme->nthread) schedule(static)
-        for(thread=0; thread<pme->nthread; thread++)
+#pragma omp parallel num_threads(pme->nthread) private(thread)
         {
+            thread=gmx_omp_get_thread_num();
             if (flags & GMX_PME_SOLVE)
             {
                 int loop_count;