2个不稳定版本
0.2.0 | 2024年7月9日 |
---|---|
0.1.0 | 2024年5月1日 |
#57 in 内存管理
每月下载量 9,640
37KB
650 行
offset-allocator
概述
这是Sebastian Aaltonen的C++包OffsetAllocator
移植到100%安全的Rust。这是一个快速、简单、硬实时分配器。这对于管理GPU资源特别有用,目标是将其用于Bevy。
移植后的代码大致符合Rust的惯例,但基本上是逐行移植,保留了注释。这样,原始OffsetAllocator
的补丁应该可以轻松转移到这个Rust移植版本。
请注意,offset-allocator
不是一个符合GlobalAlloc
特质的Rust分配器。您不能将此crate用作系统分配器(如jemalloc
、wee_alloc
等)的直接替代品。此crate使用的通用算法可以修改以构建Rust分配器,但这超出了此特定实现的范围。这是有意为之,以便此分配器可以用来管理不仅仅是CPU内存的资源:特别是,您可以用它来管理GPU缓冲区内的分配。相比之下,Rust分配器是硬编码到CPU的,不能用来管理GPU资源。
描述
此分配器对其分配的内容完全无偏见:它只知道一个特定大小的连续内存块。这个大小不必是字节:当在固定大小的结构体中分配时,这特别有用。例如,如果使用此分配器来分割GPU索引缓冲区对象,可能会希望将分配的单位视为32位浮点数。
来源:原始README
快速硬实时O(1)偏移分配器,具有最小的碎片化。
使用256个桶,以8位浮点分布(3位尾数+5位指数)和两级位域来查找下一个可用的桶。使用2x LZCNT指令使所有操作O(1)。遵循浮点分布的桶大小确保了无论大小类别如何,内存开销百分比都有硬限制。Pow2桶会浪费高达+100%的内存(平均浪费50%)。我们的浮点桶浪费高达+12.5%(平均浪费6.25%)。
分配元数据存储在单独的数据结构中,这使得此分配器适用于子分配任何资源,例如GPU堆栈、缓冲区和数组。返回分配的连续范围的第一个元素的偏移量。
参考文献
再次参阅原始README
此分配器类似于两级隔离拟合(TLSF)算法。
比较论文显示,TLSF算法在性能和碎片化方面表现最佳:https://www.researchgate.net/profile/Alfons-Crespo/publication/234785757_A_comparison_of_memory_allocators_for_real-time_applications/links/5421d8550cf2a39f4af765f4/A-comparison-of-memory-allocators-for-real-time-applications.pdf
作者
C++版本:Sebastian Aaltonen
Rust版本:Patrick Walton,@pcwalton
许可证
在MIT许可证下授权。有关详细信息,请参阅LICENSE-MIT
。
行为准则
offset-allocator
遵循与Rust本身相同的代码准则。报告可提交给项目作者。
依赖项
~110KB