面向fhe编译器的确定性的内存规划
空
rmm(RAPIDS Memory Manager)的内存分配策略
介绍:
RMM是NVIDIA为GPU内存管理设计的一个高性能内存管理库,旨在优化GPU内存的分配和释放过程,提高内存使用效率,减少内存碎片化问题。RMM主要用于数据科学和机器学习等需要大量GPU内存的应用中。它主要是作为一个运行时的内存管理器,提供高效的内存分配和释放功能,支持多线程和异步操作。
内存分配策略
1. 预分配内存池
RMM在初始化时会预分配一块较大的GPU内存池,这样可以减少频繁的内存分配和释放操作,提高性能。应用程序在需要内存时,从这个预分配的内存池中分配内存,而不是每次都向操作系统请求内存。
具体算法-指数退避扩展策略: 比如在执行一个cudamalloc操作时,会有一个需要分配的内存大小,记作min_size。rmm并不直接分配一个min_size大小的内存块,而是会分配一个大于它的内存块,大小记为try_size。每次尝试分配try_size大小的内存块,如果分配失败,则将try_size缩小一倍,直到成功或者try_size小于min_size为止(报错)。这样可以避免频繁向上层驱动请求分配内存,而是由rmm直接管理一大块内存。
2. 合并最佳适配算法的碎片优化
GPU内存分配面临严重的碎片化问题:频繁的分配和释放会产生大量不连续的小内存块,导致”有内存但无法分配”的窘境。传统方法要么忽略碎片(浪费内存),要么定期整理(性能开销大)。RMM的合并最佳适配算法通过实时智能合并解决这个问题:每当内存块释放时立即检查并合并相邻块,同时使用最佳适配策略选择最合适的块,最大化内存利用率,减少碎片化。
具体算法-智能合并算法: 当释放一个内存块时,RMM会检查该块的前后是否有空闲块来判断是向前合并还是向后合并,抑或是三块合并。 最佳适配策略:每次rmm要分配内存时,从free list(空闲内存块列表)中选择一个最小但能满足需求的内存块进行分配,避免过大的内存块被占用,减少碎片化。
3. 流有序的内存重用
传统的内存分配存在大量的cudaMalloc和cudaFree调用,并且这些操作都是同步执行的,导致性能瓶颈。RMM的流有序内存分配解决了这个问题:它允许在同一CUDA流上立即重用刚刚释放的内存,无需任何同步开销,同时仍能安全地支持跨流的内存共享。
具体算法:上面说到了如何选择内存块进行内存分配,如果在同一个流内找到了满足条件的就可以直接启用,否则要做跨流的内存分配。若目标块足够大,就等待目标块释放后分配。否则可以将多个流个空闲目标块合并再分配。
4.arena内存资源的并发优化策略
在优化一中提到了,一次分配try_size大小的内存块,这个内存块就是arena。RMM通过引入分层架构(多arena机制)来提升并发性能:每个CUDA流或线程拥有独立的arena,允许多个流同时进行内存分配和释放操作,减少锁竞争和等待时间,让小分配在各自arena中进行,大分配共享全局资源,既减少碎片又提高并发性能。
具体算法:采用渐进式的分配逻辑,每次先尝试同步分配,即在当前流的arena中分配,若失败则先做defragment,上锁并同步所有操作,清理所有arena的空闲块并整理后再尝试分配。
mlir的bufferization
###