Serialize accesses to parallelized level3 functions from multiple callers
authorMartin Kroeker <martin@ruby.chemie.uni-freiburg.de>
Mon, 19 Nov 2018 13:02:50 +0000 (14:02 +0100)
committerGitHub <noreply@github.com>
Mon, 19 Nov 2018 13:02:50 +0000 (14:02 +0100)
for #1851

driver/level3/level3_thread.c

index aeb5e6e..15cad92 100644 (file)
@@ -514,6 +514,10 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
                       *range_n, FLOAT *sa, FLOAT *sb,
                        BLASLONG nthreads_m, BLASLONG nthreads_n) {
 
+#ifndef USE_OPENMP
+static pthread_mutex_t  level3_lock    = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
   blas_arg_t newarg;
 
 #ifndef USE_ALLOC_HEAP
@@ -554,6 +558,10 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
 #endif
 #endif
 
+#ifndef USE_OPENMP
+pthread_mutex_lock(&level3_lock);
+#endif
+
 #ifdef USE_ALLOC_HEAP
   /* Dynamically allocate workspace */
   job = (job_t*)malloc(MAX_CPU_NUMBER * sizeof(job_t));
@@ -671,6 +679,10 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
   free(job);
 #endif
 
+#ifndef USE_OPENMP
+  pthread_mutex_unlock(&level3_lock);
+#endif
+
   return 0;
 }