use super::logger::{LogLevel, LoggerConfig};
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Default)]
#[serde(deny_unknown_fields)]
pub struct MemoryConfig {
#[serde(default)]
pub logger: LoggerConfig<MemoryLogLevel>,
#[serde(default)]
pub persistent_memory: PersistentMemory,
#[serde(default)]
pub cuda: CudaMemoryConfig,
}
#[derive(Clone, Debug, Default, serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CudaMemoryConfig {
#[serde(default)]
pub allocator: CudaAllocator,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum CudaAllocator {
#[default]
Sync,
Async,
}
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Default)]
pub enum PersistentMemory {
#[default]
#[serde(rename = "enabled")]
Enabled,
#[serde(rename = "size-match")]
SizeMatch,
#[serde(rename = "disabled")]
Disabled,
#[serde(rename = "enforced")]
Enforced,
}
#[derive(Default, Clone, Copy, Debug, serde::Serialize, serde::Deserialize)]
pub enum MemoryLogLevel {
#[default]
#[serde(rename = "disabled")]
Disabled,
#[serde(rename = "basic")]
Basic,
#[serde(rename = "full")]
Full,
}
impl LogLevel for MemoryLogLevel {}
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
#[test]
fn cuda_allocator_config() {
use crate::config::CubeClRuntimeConfig;
let config: CubeClRuntimeConfig = toml::from_str("").unwrap();
assert_eq!(config.memory.cuda.allocator, CudaAllocator::Sync);
let config: CubeClRuntimeConfig =
toml::from_str("[memory.cuda]\nallocator = \"async\"").unwrap();
assert_eq!(config.memory.cuda.allocator, CudaAllocator::Async);
}
#[test]
fn pools_rejected_in_config_files() {
assert!(toml::from_str::<MemoryConfig>("pools = \"sub-slices\"").is_err());
assert!(
toml::from_str::<MemoryConfig>("[[pools]]\ntype = \"sliced\"\npage_size = \"1MiB\"\n")
.is_err()
);
}
}