Patchwork [gomp,4.0] Handle OMP_DISPLAY_ENV

login
register
mail settings
Submitter Tobias Burnus
Date March 19, 2013, 3:24 p.m.
Message ID <51488314.6090308@net-b.de>
Download mbox | patch
Permalink /patch/229097/
State New
Headers show

Comments

Tobias Burnus - March 19, 2013, 3:24 p.m.
Attached is a first shot for OMP_DISPLAY_ENV. One could think about how 
to handle GOMP_CPU_AFFINITY and OMP_WAIT_POLICY. I currently print an 
empty list for affinity (although using GOMP_CPU_AFFINITY='' leads to a 
warning that the list is empty) and for OMP_WAIT_POLICY, an unset 
variable is handled as something between ACTIVE and PASSIVE; the patch 
prints PASSIVE in that case.

Build and regtested on x86-64-gnu-linux.
OK for the gomp-4_0-branch - after is has been created?

Tobias
Jakub Jelinek - March 19, 2013, 4:50 p.m.
On Tue, Mar 19, 2013 at 04:24:04PM +0100, Tobias Burnus wrote:
> 2013-03-19  Tobias Burnus  <burnus@net-b.de>
> 
> 	* env.c (handle_omp_display_env): New function.
> 	(initialize_env): Use it.
> 
> diff --git a/libgomp/env.c b/libgomp/env.c
> index 65cbba8..e228bd9 100644
> --- a/libgomp/env.c
> +++ b/libgomp/env.c
> @@ -29,6 +29,8 @@
>  #include "libgomp_f.h"
>  #include <ctype.h>
>  #include <stdlib.h>
> +#include <stdio.h>
> +#include <inttypes.h>	/* For PRIu64.  */

stdio.h is fine, but inttypes.h needs to be
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
for portability (libgomp/configure already checks for that).

Guess this then needs to be guarded with
#ifdef HAVE_INTTYPES_H

> +      fprintf (stderr, "  GOMP_SPINCOUNT = '%"PRIu64"'\n",
> +	       (uint64_t) gomp_spin_count_var);

and if not defined, use %ld with (unsigned long) cast instead.

	Jakub

Patch

2013-03-19  Tobias Burnus  <burnus@net-b.de>

	* env.c (handle_omp_display_env): New function.
	(initialize_env): Use it.

diff --git a/libgomp/env.c b/libgomp/env.c
index 65cbba8..e228bd9 100644
--- a/libgomp/env.c
+++ b/libgomp/env.c
@@ -29,6 +29,8 @@ 
 #include "libgomp_f.h"
 #include <ctype.h>
 #include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>	/* For PRIu64.  */
 #ifdef STRING_WITH_STRINGS
 # include <string.h>
 # include <strings.h>
@@ -565,6 +567,117 @@  parse_affinity (void)
   return false;
 }
 
+
+static void
+handle_omp_display_env (bool proc_bind, unsigned long stacksize,
+			int wait_policy)
+{
+  const char *env;
+  bool display = false;
+  bool verbose = false;
+  int i;
+
+  env = getenv ("OMP_DISPLAY_ENV");
+  if (env == NULL)
+    return;
+
+  while (isspace ((unsigned char) *env))
+    ++env;
+  if (strncasecmp (env, "true", 4) == 0)
+    {
+      env += 4;
+    }
+  else if (strncasecmp (env, "false", 5) == 0)
+    {
+      display = false;
+      env += 5;
+    }
+  else if (strncasecmp (env, "verbose", 7) == 0)
+    {
+      display = true;
+      verbose = true;
+      env += 7;
+    }
+  else
+    env = "X";
+  while (isspace ((unsigned char) *env))
+    ++env;
+  if (*env != '\0')
+    gomp_error ("Invalid value for environment variable OMP_DISPLAY_ENV");
+
+  if (!display)
+    return;
+
+  fputs ("\nOPENMP DISPLAY ENVIRONMENT BEGIN\n", stderr);
+
+  fputs ("  _OPENMP = '201107'\n", stderr);
+  fprintf (stderr, "  OMP_DYNAMIC = '%s'\n",
+	   gomp_global_icv.dyn_var ? "TRUE" : "FALSE");
+  fprintf (stderr, "  OMP_NESTED = '%s'\n",
+	   gomp_global_icv.nest_var ? "TRUE" : "FALSE");
+
+  fprintf (stderr, "  OMP_NUM_THREADS = '%lu", gomp_global_icv.nthreads_var);
+  for (i = 1; i < gomp_nthreads_var_list_len; i++)
+    fprintf (stderr, ",%lu", gomp_nthreads_var_list[i]);
+  fputs ("'\n", stderr);
+
+  fprintf (stderr, "  OMP_SCHEDULE = '");
+  switch (gomp_global_icv.run_sched_var)
+    {
+    case GFS_RUNTIME:
+      fputs ("RUNTIME", stderr);
+      break;
+    case GFS_STATIC:
+      fputs ("STATIC", stderr);
+      break;
+    case GFS_DYNAMIC:
+      fputs ("DYNAMIC", stderr);
+      break;
+    case GFS_GUIDED:
+      fputs ("GUIDED", stderr);
+      break;
+    case GFS_AUTO:
+      fputs ("AUTO", stderr);
+      break;
+    }
+  fputs ("'\n", stderr);
+
+  fprintf (stderr, "  OMP_PROC_BIND = '%s'\n",
+	   proc_bind ? "TRUE" : "FALSE");
+  fprintf (stderr, "  OMP_STACKSIZE = '%lu'\n", stacksize);
+
+  /* GOMP's default value is actually neither active nor passive.  */
+  fprintf (stderr, "  OMP_WAIT_POLICY = '%s'\n",
+	   wait_policy > 0 ? "ACTIVE" : "PASSIVE");
+  fprintf (stderr, "  OMP_THREAD_LIMIT = '%lu'\n",
+	   gomp_thread_limit_var);
+  fprintf (stderr, "  OMP_MAX_ACTIVE_LEVELS = '%lu'\n",
+	   gomp_max_active_levels_var);
+
+/* FIXME: Unimplemented OpenMP 4.0 environment variables.
+  fprintf (stderr, "  OMP_PLACES = ''\n");
+  fprintf (stderr, "  OMP_CANCELLATION = ''\n");
+  fprintf (stderr, "  OMP_DEFAULT_DEVICE = ''\n"); */
+
+  if (verbose)
+    {
+      fputs ("  GOMP_CPU_AFFINITY = '", stderr);
+      if (gomp_cpu_affinity_len)
+	{
+	  fprintf (stderr, "%d", gomp_cpu_affinity[0]);
+	  for (i = 1; i < gomp_cpu_affinity_len; i++)
+	    fprintf (stderr, " %d", gomp_cpu_affinity[i]);
+	}
+      fputs ("'\n", stderr);
+      fprintf (stderr, "  GOMP_STACKSIZE = '%lu'\n", stacksize);
+      fprintf (stderr, "  GOMP_SPINCOUNT = '%"PRIu64"'\n",
+	       (uint64_t) gomp_spin_count_var);
+    }
+
+  fputs ("OPENMP DISPLAY ENVIRONMENT END\n", stderr);
+}
+
+
 static void __attribute__((constructor))
 initialize_env (void)
 {
@@ -645,6 +758,8 @@  initialize_env (void)
       if (err != 0)
 	gomp_error ("Stack size change failed: %s", strerror (err));
     }
+
+  handle_omp_display_env (bind_var, stacksize, wait_policy);
 }