Skip to main content

llama_cpp_bindings/
llama_backend_numa_strategy.rs

1/// NUMA (Non-Uniform Memory Access) thread affinity strategy for llama.cpp.
2#[derive(Debug, Eq, PartialEq, Copy, Clone)]
3pub enum NumaStrategy {
4    /// NUMA-aware scheduling is disabled. Threads are not pinned to specific nodes.
5    Disabled,
6    /// Distributes threads across NUMA nodes in a round-robin fashion.
7    Distribute,
8    /// Pins all threads to the current NUMA node to avoid cross-node memory access.
9    Isolate,
10    /// Respects the CPU affinity mask set externally by the `numactl` command.
11    Numactl,
12    /// Mirrors memory across NUMA nodes. Currently a no-op in llama.cpp.
13    Mirror,
14}
15
16/// An invalid numa strategy was provided.
17#[derive(Debug, Eq, PartialEq, Copy, Clone)]
18pub struct InvalidNumaStrategy(
19    /// The invalid numa strategy that was provided.
20    pub llama_cpp_bindings_sys::ggml_numa_strategy,
21);
22
23impl TryFrom<llama_cpp_bindings_sys::ggml_numa_strategy> for NumaStrategy {
24    type Error = InvalidNumaStrategy;
25
26    fn try_from(value: llama_cpp_bindings_sys::ggml_numa_strategy) -> Result<Self, Self::Error> {
27        match value {
28            llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_DISABLED => Ok(Self::Disabled),
29            llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_DISTRIBUTE => Ok(Self::Distribute),
30            llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_ISOLATE => Ok(Self::Isolate),
31            llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_NUMACTL => Ok(Self::Numactl),
32            llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_MIRROR => Ok(Self::Mirror),
33            value => Err(InvalidNumaStrategy(value)),
34        }
35    }
36}
37
38impl From<NumaStrategy> for llama_cpp_bindings_sys::ggml_numa_strategy {
39    fn from(value: NumaStrategy) -> Self {
40        match value {
41            NumaStrategy::Disabled => llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_DISABLED,
42            NumaStrategy::Distribute => llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_DISTRIBUTE,
43            NumaStrategy::Isolate => llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_ISOLATE,
44            NumaStrategy::Numactl => llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_NUMACTL,
45            NumaStrategy::Mirror => llama_cpp_bindings_sys::GGML_NUMA_STRATEGY_MIRROR,
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::{InvalidNumaStrategy, NumaStrategy};
53
54    #[test]
55    fn numa_from_and_to() {
56        let numas = [
57            NumaStrategy::Disabled,
58            NumaStrategy::Distribute,
59            NumaStrategy::Isolate,
60            NumaStrategy::Numactl,
61            NumaStrategy::Mirror,
62        ];
63
64        for numa in &numas {
65            let raw = llama_cpp_bindings_sys::ggml_numa_strategy::from(*numa);
66            let roundtripped =
67                NumaStrategy::try_from(raw).expect("Failed to roundtrip NumaStrategy");
68
69            assert_eq!(*numa, roundtripped);
70        }
71    }
72
73    #[test]
74    fn invalid_numa_strategy_returns_error() {
75        let invalid_value = 800;
76        let result = NumaStrategy::try_from(invalid_value);
77
78        assert_eq!(result, Err(InvalidNumaStrategy(invalid_value)));
79    }
80}