support for Non-Uniform Memory Access of separate CPU nodes;
authorwenzelm
Sun, 16 Oct 2016 20:19:10 +0200
changeset 64264 42138702d6ec
parent 64263 d389a83b8d55
child 64265 8eb6365f5916
support for Non-Uniform Memory Access of separate CPU nodes;
src/Pure/System/numa.scala
src/Pure/build-jars
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Pure/System/numa.scala	Sun Oct 16 20:19:10 2016 +0200
@@ -0,0 +1,41 @@
+/*  Title:      Pure/System/numa.scala
+    Author:     Makarius
+
+Support for Non-Uniform Memory Access of separate CPU nodes.
+*/
+
+package isabelle
+
+
+object NUMA
+{
+  /* available nodes */
+
+  def nodes(): List[Int] =
+  {
+    val numa_nodes_linux = Path.explode("/sys/devices/system/node/online")
+
+    val Single = """^(\d+)$""".r
+    val Multiple = """^(\d+)-(\d+)$""".r
+
+    def read(s: String): List[Int] =
+      s match {
+        case Single(Value.Int(i)) => List(i)
+        case Multiple(Value.Int(i), Value.Int(j)) => (i to j).toList
+        case _ => error("Cannot parse CPU node specification: " + quote(s))
+      }
+
+    if (numa_nodes_linux.is_file) {
+      Library.space_explode(',', Library.trim_line(File.read(numa_nodes_linux))).flatMap(read(_))
+    }
+    else Nil
+  }
+
+
+  /* CPU policy via numactl tool */
+
+  lazy val numactl_available: Boolean = Isabelle_System.bash("numactl --hardware").ok
+
+  def policy(node: Int): String =
+    if (numactl_available) "numactl -m" + node + " -N" + node else ""
+}
--- a/src/Pure/build-jars	Sun Oct 16 20:08:23 2016 +0200
+++ b/src/Pure/build-jars	Sun Oct 16 20:19:10 2016 +0200
@@ -104,6 +104,7 @@
   System/isabelle_process.scala
   System/isabelle_system.scala
   System/isabelle_tool.scala
+  System/numa.scala
   System/options.scala
   System/platform.scala
   System/posix_interrupt.scala