On Mon, 17 Oct 2016, Sebastian Andrzej Siewior wrote:

+#ifdef HAVE_LIBNUMA_SUPPORT
+#include <numa.h>
+#endif

In futex.h

+static int numa_node = -1;

In futex.h (perhaps rename to futexbench_numa_node?)

+#ifndef HAVE_LIBNUMA_SUPPORT
+static int numa_run_on_node(int node __maybe_unused) { return 0; }
+static int numa_node_of_cpu(int node __maybe_unused) { return 0; }
+static void *numa_alloc_local(size_t size) { return malloc(size); }
+static void numa_free(void *p, size_t size __maybe_unused) { return free(p); }
+#endif
+
+static bool cpu_is_local(int cpu)
+{
+       if (numa_node < 0)
+               return true;
+       if (numa_node_of_cpu(cpu) == numa_node)
+               return true;
+       return false;
+}

In futex.h

-       if (!nthreads) /* default to the number of CPUs */
-               nthreads = ncpus;
+       if (!nthreads) {
+               /* default to the number of CPUs per NUMA node */

This comment should go...

+               if (numa_node < 0) {
+                       nthreads = ncpus;
+               } else {

here.

+                       for (i = 0; i < ncpus; i++) {
+                               if (cpu_is_local(i))
+                                       nthreads++;
+                       }
+                       if (!nthreads)
+                               err(EXIT_FAILURE, "No online CPUs for this 
node");
+               }
+       } else {
+               int cpu_available = 0;

-       worker = calloc(nthreads, sizeof(*worker));
+               for (i = 0; i < ncpus && !cpu_available; i++) {
+                       if (cpu_is_local(i))
+                               cpu_available = 1;
+               }

Is this really necessary? If the user passes the number of threads, then we 
shouldn't
care about ncpus; we just run all the threads on the specified node. Wouldn't 
the
below numa_run_on_node() ensure that the node is not, for example, CPU-less?

+               if (!cpu_available)
+                       err(EXIT_FAILURE, "No online CPUs for this node");
+       }
+
+       if (numa_node >= 0) {
+               ret = numa_run_on_node(numa_node);
+               if (ret < 0)
+                       err(EXIT_FAILURE, "numa_run_on_node");


Thanks,
Davidlohr

Reply via email to