]> https://gitweb.dealii.org/ - dealii.git/commitdiff
update affinity test and error message 1487/head
authorTimo Heister <timo.heister@gmail.com>
Mon, 31 Aug 2015 13:25:11 +0000 (09:25 -0400)
committerTimo Heister <timo.heister@gmail.com>
Mon, 31 Aug 2015 13:35:32 +0000 (09:35 -0400)
Report DEAL_II_NUM_THREADS and don't error out if it is set to some
value. This was the reason we removed it in 384d5c6.

tests/quick_tests/affinity.cc
tests/quick_tests/run.cmake

index 24bb167541f4cb6580823f069661a29d29ecb801..ad433a3d7bc479aa8e03334e407f0c1a69a2c178 100644 (file)
 //
 // ---------------------------------------------------------------------
 
+/*
+  Test that OpenMP is not messing with thread affinity, which will stop TBB
+  from creating threads.
+ */
+
+
 #include <deal.II/grid/tria.h>
 #include <deal.II/base/multithread_info.h>
+#include <deal.II/base/utilities.h>
 #include <stdio.h>
 
 #if defined(__linux__)
@@ -50,6 +57,26 @@ bool getaffinity(unsigned int &bits_set,unsigned int &mask)
   return true;
 }
 
+int get_num_thread_env()
+{
+  const char *penv = getenv ("DEAL_II_NUM_THREADS");
+  if (penv!=NULL)
+    {
+      int max_threads_env = -1;
+      try
+       {
+         max_threads_env = dealii::Utilities::string_to_int(std::string(penv));
+       }
+      catch (...)
+       {
+         return -1;
+       }
+      return max_threads_env;
+    }
+
+  return -1;
+}
+
 
 int main ()
 {
@@ -62,14 +89,20 @@ int main ()
 
   unsigned int nprocs = dealii::MultithreadInfo::n_cores();
   unsigned int tbbprocs = dealii::MultithreadInfo::n_threads();
-  printf("aff_ncpus=%d, mask=%08X, nprocs=%d, tbb_threads=%d\n",
-        bits_set, mask, nprocs, tbbprocs );
+  int env = get_num_thread_env();
+  printf("aff_ncpus=%d, mask=%08X, nprocs=%d, tbb_threads=%d, DEAL_II_NUM_THREADS=%d\n",
+        bits_set, mask, nprocs, tbbprocs, env );
 
   if (bits_set !=0  && bits_set!=nprocs)
     {
       printf("Warning: sched_getaffinity() returns that we can only use %d out of %d CPUs.\n",bits_set, nprocs);
       return 2;
     }
+  if (env != -1 && nprocs != tbbprocs)
+    {
+      printf("Warning: number of threads is set to %d in envirnoment using DEAL_II_NUM_THREADS.\n", env);
+      return 0; // do not return an error!
+    }
   if (nprocs != tbbprocs)
     {
       printf("Warning: for some reason TBB only wants to use %d out of %d CPUs.\n",
index e941ff0b6582eb80d757326c84e7be7896a74d42..bededcaf2d444473fb88f94077ccce1a0e838183 100644 (file)
@@ -39,7 +39,8 @@ to the mailing list linked at http://www.dealii.org\n"
 The affinity test can fail when you are linking in a library like BLAS
 which uses OpenMP. Even without calling any BLAS functions, OpenMP messes
 with the thread affinity which causes TBB to run single-threaded only. You
-can fix this by exporting OMP_NUM_THREADS=1.\n"
+can fix this by exporting OMP_NUM_THREADS=1. Also see GOMP_CPU_AFFINITY 
+and OMP_PROC_BIND.\n"
         )
     ENDIF()
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.