This crate provides proc macro attributes to improve in memory data access times.
Cuneiform's main macro can take various arguments at attribute position:
hermetic = true|false
(default istrue
when#[cuneiform]
)- Hermetic enables cuneiform to detect cache sizes from OSes which have API to fetch.
- Currently, hermetic argument works only Linux kernel 2.6.32 and above.
- If system is different than supported systems it falls back to
slab
s.
slab = "board_or_architecture_name
(e.g.#[cuneiform(slab = "powerpc_mpc8xx")]
)- Slabs are either embedded system boards or other specific architecture.
- Slab checking have two stages:
- First, it checks the given board/architecture if exist.
- If not slabs fall back to Rust supported architectures.
- Still architecture is not detected, it will fall back to default values.
force = u8
(e.g.#[cuneiform(force = 16)]
)- Forces a given cache alignment. Overrides all other systems mentioned above.
[dependencies]
cuneiform = "0.1"
Basic usage can be:
// Defaults to `hermetic = true`
#[cuneiform]
pub struct Varying {
data: u8,
data_2: u16,
}
Targeting specific architecture:
#[cuneiform(slab = "powerpc_mpc8xx")]
pub struct SlabBased {
data: u8,
data_2: u16,
}
Overriding the default cache alignment:
#[cuneiform(force = 16)]
pub struct Forced {
data: u8,
data_2: u16,
}
Check out cuneiform-fields for field level optimizations.
- Cuneiform doesn't have specific instruction or architecture specific code.
- Works with crates like
#![no_std]
. Ease your pain for cache optimizations. With allocator you can compile on the board too. - Not based on assumptions. Based on Linux tree, OS checks, provider manuals and related documentation.
- If it is big.LITTLE architecture, separate both parts in slabs. Apply the naming conventions.
- Check existing slabs before opening a PR. Please update it when you add one.
- If you come up with instructionless detection for hermetic alignment. Be sure that tests are included and not breaking existing platforms.
- powerpc_mpc8xx
- powerpc64bridge
- powerpc_e500mc
- power_7
- power_8
- power_9
- exynos_big
- exynos_LITTLE
- krait
- neoverse_n1