#allocator #port #memory-allocator #offset #bin #allocation

offset-allocator

Sebastian Aaltonen的OffsetAllocator的Rust移植

2个不稳定版本

0.2.0 2024年7月9日
0.1.0 2024年5月1日

#57 in 内存管理

Download history 194/week @ 2024-04-29 19/week @ 2024-05-13 71/week @ 2024-05-20 10/week @ 2024-05-27 10/week @ 2024-06-03 13/week @ 2024-06-10 16/week @ 2024-06-17 308/week @ 2024-07-01 358/week @ 2024-07-08 1818/week @ 2024-07-15 2527/week @ 2024-07-22 2621/week @ 2024-07-29 2646/week @ 2024-08-05

每月下载量 9,640

MIT许可证

37KB
650

offset-allocator

概述

这是Sebastian Aaltonen的C++包OffsetAllocator移植到100%安全的Rust。这是一个快速、简单、硬实时分配器。这对于管理GPU资源特别有用,目标是将其用于Bevy

移植后的代码大致符合Rust的惯例,但基本上是逐行移植,保留了注释。这样,原始OffsetAllocator的补丁应该可以轻松转移到这个Rust移植版本。

请注意,offset-allocator不是一个符合GlobalAlloc特质的Rust分配器。您不能将此crate用作系统分配器(如jemallocwee_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