FDG内存分配器笔记
FDG:
大规模并行系统中的动态内存分配器由于需要全局同步(记账) ,导致性能急剧下降。
代码解析
1.superblock
类中包含两个变量,两个函数。默认superblock大小为2048
items[size]:存储
current:指向下一个未使用byte的索引
init(void):初始化superblock,将current=0,指向superblock第0byte
alloc(size,offset,workID,id):在superblock里面分配内存,分配成功,返回指针,否则返回0.size分配的大小(Byte),offset此线程的偏移,workID warp的工作线程ID,id 线程ID
2.List
类中包含三个变量,三个函数。默认大小为128
m_current:下一个空元素的索引
List<SIZE>* m_prevoid:指向前一个listvoid * m_items[SIZE]:存储指针
init(void):初始化List,m_previous=0,m_current=0.
append(void * ptr):如果list full,返回false,否则,增加一个指针在m_current处
List<SIZE>* freeList(freeList=true):调用FDG_FREE释放存储的每一个元素,返回前一个list的指针,释放list。
setPrevious (List<SIZE>* list):将此list设置为当前list的前一个list。
3.Warp
类中包含六个变量,十一个函数
m_peak:消耗的内存
m_count:参与的线程数
m_active:活跃的线程数
List_t* m_list:当前list
SiperBlock_t* m_superblock:当前superblock
m_request[FDG_WARPSIZE]:改变分配请求所使用的寄存器
init(count):初始化Warpheader。list、superblock=0,peak为warp大小,m_count、m_active=count,request数组全部赋0.参数count为参与的线程数
List_t* allocateList(void):分配一个list,并初始化,返回分配的list的指针
void* allocateSuperBlock(size):分配superblock,size大小的内存,返回分配的指针,消耗内存加上size,将新分配的内存添加到list后面
appendToList(void* ptr,bool performVoting=true):将ptr添加到list后面,如果list满了,新分配一个list,把当前list设置为新分配的前一个list,当前list设置为新分配的list,在添加到list后面。ptr superblock
void * exchangePointer(void* ptr, workerId,id):???????????????????
isWorkerThread(* workerId=0,*count=0):决定worker线程。count 参与的线程数,具体算法????????????
Warp* start(count=0):初始化变量,决定worker线程,分配warpheader并初始化,为其他线程改变warpheader?????????
void* alloc(size):分配size内存,返回分配的指针。(按线程号顺序分配,连续分配,chunk为单位)
end(void):释放分配的内存及list
tidyUp(void):释放分配的内存,但是warpheader还在
getPeak(void):返回当前分配的内存数量
3.params.cuh
定义了一些参数。
FDG_LIST_SIZE 126:list里面的条目数量
FDG_MIN_ALLOC_SIZE 16:分配的最小比特数,相当于chunk
FDG_SUPERBLOCK_SIZE 8188:superblock的大小
FDG_WARPSIZE 32:warp的大小,CUDA默认是32
总结:
FDG分配器是按照线程号连续分配的,以chunk为单位。把内存划分为superblock,superblock划分为chunk,chunk中没有任何header数据,superblcok中只有指向下一个未使用byte的指针,没有其他信息。superblock的指针存储在list中,list里面有header,list条目固定,可以使用多个list。
FDG内存分配器笔记的更多相关文章
- 内核早期内存分配器:memblock
内核早期内存分配器:memblockLinux内核使用伙伴系统管理内存,那么在伙伴系统工作前,如何管理内存?答案是memblock.memblock在系统启动阶段进行简单的内存管理,记录物理内存的使用 ...
- 14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器
14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器 当InnoDB 被开发时,内存分配提供了操作系统和 run-time ...
- Nah Lock: 一个无锁的内存分配器
概述 我实现了两个完全无锁的内存分配器:_nalloc 和 nalloc. 我用benchmark工具对它们进行了一组综合性测试,并比较了它们的指标值. 与libc(glibc malloc)相比, ...
- [转]STL的内存分配器
题记:内存管理一直是C/C++程序的红灯区.关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面 ...
- linux内存管理--伙伴系统和内存分配器
3.1页框的管理 所有的页框描述符都存放在mem_map数组中. 3.1.1page数据结构 struct page { page_flags_t flags; //标志 atomic_t _coun ...
- 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...
- CoreCLR源码探索(三) GC内存分配器的内部实现
在前一篇中我讲解了new是怎么工作的, 但是却一笔跳过了内存分配相关的部分. 在这一篇中我将详细讲解GC内存分配器的内部实现. 在看这一篇之前请必须先看完微软BOTR文档中的"Garbage ...
- [内存管理]连续内存分配器(CMA)概述
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 原文地址:http://lwn.net/Articles/396657/ 1 ...
- Mesh内存分配器的mmap小技巧
最近看了一篇内存分配器的论文,原理很简单,但是里面的数学论证还没看懂,这次先简单写一下原理和用到的API. 内存分配器是用于封装操作系统提供的底层API,给应用程序提供动态内存的.内存不断申请释放后, ...
随机推荐
- <C++Primer>第四版 阅读笔记 第一部分 “基本语言”
之前阅读时没有及时总结,现在慢慢补上. 第1章 快速入门 main 函数在很多方面都比较特别,其中最重要的是每个C++程序必须含有 main 函数,且 main 函数是(唯一)被操作系统显示调用的函数 ...
- 代码神器Atom,最常用的几大插件,你值得拥有。
作者:魔洁 atom常用插件 atom插件安装File>Settings>intall搜索框输入插件名,点击Packages搜索,搜索出来后点击intall安装,建议你先安装(simpli ...
- Java实现二叉树的前序、中序、后序遍历(递归方法)
在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了. 二叉树的遍历方法分为三种,分别为前序遍历.中序遍历.后序遍历.下图即为一个二叉 ...
- iOS 创建OpenGL 环境的思考
关于如何从头开始创建环境,可以参考大神的博文OpenGL ES 3.0 数据可视化 0:Hello world,本文只是补充一些我在实践中的一些思考. CAEAGLLayer If you plan ...
- poj1611
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 35918 Accepted: 17458 De ...
- 转载 JDK + Android-SDK + Python + MonkeyRunner 的安装
转载来自: 小海豚的博客 http://blog.sina.com.cn/u/1295334083 我只是搬运工... JDK + Android-SDK + Python + MonkeyRun ...
- 征服恐惧!用 Vim 写 iOS App
我们都知道 Vim 和 Emacs 都是文本编辑器中的上古神器,你也许用 ctags,cscopes 配合 Vim 完成过大型 C 或者 C++ 的开发,你也许配合过其他插件,完成过 JavaScri ...
- 对await(),notify()的理解
await(),notify()是java Object类的方法.在两个线程同时访问一个对象的时候可以利用这2个方法实现线程的通信.看下面的例子. public class Account { pri ...
- mysql数据库封装和 分页查询
1 之前我们学到了php连接mysql数据库的增删改查,中间要多次调用数据库, 而且以后用到的表比较多,上传中如果需要改数据的话会非常麻烦,但是如果 我们把数据库封装,到时就可以很轻松的把改掉一些数据 ...
- 2017-2-23 C#基础 for循环
循环语句主要有:for;while;foreach.最常用的是for循环.for循环的四要素:初始条件:循环条件:循环体:状态改变.for循环的顺序是:初始条件--循环条件--循环体--状态改变.br ...