| author | wenzelm |
| Wed, 01 Mar 2023 13:30:35 +0100 | |
| changeset 77438 | 0030eabbe6c3 |
| parent 77329 | 1b7c5d4b97a8 |
| permissions | -rw-r--r-- |
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
1 |
/* Title: Pure/System/numa.scala |
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
2 |
Author: Makarius |
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
3 |
|
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
4 |
Support for Non-Uniform Memory Access of separate CPU nodes. |
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
5 |
*/ |
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
6 |
|
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
7 |
package isabelle |
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
8 |
|
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
9 |
|
| 75393 | 10 |
object NUMA {
|
| 77329 | 11 |
/* information about nodes */ |
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
12 |
|
| 77329 | 13 |
private val numa_info_linux: Path = Path.explode("/sys/devices/system/node/online")
|
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
14 |
|
| 77329 | 15 |
private val Info_Single = """^(\d+)$""".r |
16 |
private val Info_Multiple = """^(\d+)-(\d+)$""".r |
|
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
17 |
|
| 77329 | 18 |
private def parse_nodes(s: String): List[Int] = |
19 |
s match {
|
|
20 |
case Info_Single(Value.Int(i)) => List(i) |
|
21 |
case Info_Multiple(Value.Int(i), Value.Int(j)) => (i to j).toList |
|
22 |
case _ => error("Cannot parse CPU node specification: " + quote(s))
|
|
23 |
} |
|
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
24 |
|
| 77329 | 25 |
def nodes(enabled: Boolean = true, ssh: SSH.System = SSH.Local): List[Int] = {
|
26 |
val numa_info = if (ssh.isabelle_platform.is_linux) Some(numa_info_linux) else None |
|
27 |
for {
|
|
28 |
path <- numa_info.toList |
|
29 |
if enabled && ssh.is_file(path) |
|
30 |
s <- space_explode(',', ssh.read(path).trim)
|
|
31 |
n <- parse_nodes(s) |
|
32 |
} yield n |
|
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
33 |
} |
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
34 |
|
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
35 |
|
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
36 |
/* CPU policy via numactl tool */ |
|
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
37 |
|
|
77319
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
38 |
def numactl(node: Int): String = "numactl -m" + node + " -N" + node |
|
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
39 |
def numactl_ok(node: Int): Boolean = Isabelle_System.bash(numactl(node) + " true").ok |
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
40 |
|
|
77319
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
41 |
def policy(node: Int): String = if (numactl_ok(node)) numactl(node) else "" |
| 64265 | 42 |
|
| 77318 | 43 |
def policy_options(options: Options, numa_node: Option[Int]): Options = |
| 68953 | 44 |
numa_node match {
|
45 |
case None => options |
|
46 |
case Some(n) => options.string("ML_process_policy") = policy(n)
|
|
47 |
} |
|
48 |
||
| 77318 | 49 |
def perhaps_policy_options(options: Options): Options = {
|
50 |
val numa_node = |
|
51 |
try {
|
|
52 |
nodes() match {
|
|
|
77319
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
53 |
case ns if ns.length >= 2 && numactl_ok(ns.head) => Some(ns.head) |
| 77318 | 54 |
case _ => None |
55 |
} |
|
56 |
} |
|
57 |
catch { case ERROR(_) => None }
|
|
58 |
policy_options(options, numa_node) |
|
59 |
} |
|
60 |
||
| 64265 | 61 |
|
62 |
/* shuffling of CPU nodes */ |
|
63 |
||
| 77326 | 64 |
def check(progress: Progress, enabled: Boolean): Boolean = {
|
| 64265 | 65 |
def warning = |
|
77319
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
66 |
nodes() match {
|
|
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
67 |
case ns if ns.length < 2 => Some("no NUMA nodes available")
|
|
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
68 |
case ns if !numactl_ok(ns.head) => Some("bad numactl tool")
|
|
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
69 |
case _ => None |
|
87698fe320bb
clarified signature: more robust operations, without assumption about node 0;
wenzelm
parents:
77318
diff
changeset
|
70 |
} |
| 64265 | 71 |
|
72 |
enabled && |
|
73 |
(warning match {
|
|
| 65831 | 74 |
case Some(s) => progress.echo_warning("Shuffling of CPU nodes is disabled: " + s); false
|
| 64265 | 75 |
case _ => true |
76 |
}) |
|
77 |
} |
|
|
64264
42138702d6ec
support for Non-Uniform Memory Access of separate CPU nodes;
wenzelm
parents:
diff
changeset
|
78 |
} |