// include/strata/platform/memory.hpp - plan v0.3 P0.1/P1: keep a large host region resident. // // `cudaHostRegister` refuses the 31.6 GiB expert arena on Windows, and an unlocked arena is trimmed under memory // pressure (the CPU pool then swung 2x between runs). With the n-gram table out of RAM there is headroom to lock // it instead: raise the process's minimum working set by the region's size, then VirtualLock it (Windows needs // only SeIncreaseWorkingSetPrivilege, which ordinary accounts hold). Linux: mlock. #pragma once #include #include namespace strata::platform { struct LockResult { bool ok = false; uint64_t locked_bytes = 0; ///< may be less than requested; the rest stays pageable std::string note; ///< what was done or why it failed, for the startup print }; /// Lock [p, p + bytes) into physical memory. Partial success is reported, not hidden. LockResult lock_resident(void* p, uint64_t bytes); /// Undo lock_resident for the same region (best effort). void unlock_resident(void* p, uint64_t bytes); /// #243, Windows: the GPU's shared (non-local) memory budget and this process's use of it, from DXGI /// (IDXGIAdapter3::QueryVideoMemoryInfo, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL) for the adapter whose LUID is the /// 8 bytes at `luid` (cudaDeviceProp::luid). Page-locked host memory the GPU maps is charged there. False (and /// `why` says so) when the query is not possible - always elsewhere than Windows. bool gpu_shared_memory_budget(const void* luid, uint64_t& budget, uint64_t& usage, std::string& why); /// The machine's physical RAM in bytes (0 when unknown). uint64_t total_physical_memory(); } // namespace strata::platform