[Openmp-commits] [openmp] r318848 - Fix for OMP doacross implementation on Power

Jonas Hahnfeld via Openmp-commits openmp-commits at lists.llvm.org
Wed Nov 22 09:15:20 PST 2017


Author: hahnfeld
Date: Wed Nov 22 09:15:20 2017
New Revision: 318848

URL: http://llvm.org/viewvc/llvm-project?rev=318848&view=rev
Log:
Fix for OMP doacross implementation on Power

Power has a weak consistency model so we need memory barriers to
make writes (both from runtime and from user code) available for
all threads.

Differential Revision: https://reviews.llvm.org/D40175

Modified:
    openmp/trunk/runtime/src/kmp_csupport.cpp
    openmp/trunk/runtime/test/worksharing/for/kmp_doacross_check.c

Modified: openmp/trunk/runtime/src/kmp_csupport.cpp
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_csupport.cpp?rev=318848&r1=318847&r2=318848&view=diff
==============================================================================
--- openmp/trunk/runtime/src/kmp_csupport.cpp (original)
+++ openmp/trunk/runtime/src/kmp_csupport.cpp Wed Nov 22 09:15:20 2017
@@ -3815,7 +3815,9 @@ void __kmpc_doacross_init(ident_t *loc,
   if (flags == NULL) {
     // we are the first thread, allocate the array of flags
     size_t size = trace_count / 8 + 8; // in bytes, use single bit per iteration
-    sh_buf->doacross_flags = (kmp_uint32 *)__kmp_thread_calloc(th, size, 1);
+    flags = (kmp_uint32 *)__kmp_thread_calloc(th, size, 1);
+    KMP_MB();
+    sh_buf->doacross_flags = flags;
   } else if (flags == (kmp_uint32 *)1) {
 #if KMP_32_BIT_ARCH
     // initialization is still in progress, need to wait
@@ -3824,6 +3826,9 @@ void __kmpc_doacross_init(ident_t *loc,
     while (*(volatile kmp_int64 *)&sh_buf->doacross_flags == 1LL)
 #endif
       KMP_YIELD(TRUE);
+    KMP_MB();
+  } else {
+    KMP_MB();
   }
   KMP_DEBUG_ASSERT(sh_buf->doacross_flags > (kmp_uint32 *)1); // check ptr value
   pr_buf->th_doacross_flags =
@@ -3919,6 +3924,7 @@ void __kmpc_doacross_wait(ident_t *loc,
   while ((flag & pr_buf->th_doacross_flags[iter_number]) == 0) {
     KMP_YIELD(TRUE);
   }
+  KMP_MB();
   KA_TRACE(20,
            ("__kmpc_doacross_wait() exit: T#%d wait for iter %lld completed\n",
             gtid, (iter_number << 5) + shft));
@@ -3971,6 +3977,7 @@ void __kmpc_doacross_post(ident_t *loc,
   shft = iter_number % 32; // use 32-bit granularity
   iter_number >>= 5; // divided by 32
   flag = 1 << shft;
+  KMP_MB();
   if ((flag & pr_buf->th_doacross_flags[iter_number]) == 0)
     KMP_TEST_THEN_OR32(&pr_buf->th_doacross_flags[iter_number], flag);
   KA_TRACE(20, ("__kmpc_doacross_post() exit: T#%d iter %lld posted\n", gtid,

Modified: openmp/trunk/runtime/test/worksharing/for/kmp_doacross_check.c
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/test/worksharing/for/kmp_doacross_check.c?rev=318848&r1=318847&r2=318848&view=diff
==============================================================================
--- openmp/trunk/runtime/test/worksharing/for/kmp_doacross_check.c (original)
+++ openmp/trunk/runtime/test/worksharing/for/kmp_doacross_check.c Wed Nov 22 09:15:20 2017
@@ -24,7 +24,7 @@ int main()
   dims.lo = 1;
   dims.up = N-1;
   dims.st = 1;
-  #pragma omp parallel
+  #pragma omp parallel num_threads(4)
   {
     int i, gtid;
     long long vec;




More information about the Openmp-commits mailing list