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++ 构造函数和析构函数的调用顺序、虚析构函数的作用
构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...
- C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)
1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...
- java_JDBC(1)
Java连接Oracle步骤: 1.注册加载驱动 驱动名:DRIVER="oracle.jdbc.driver.OracleDriver";Class.forName(" ...
- CXF_Spring_Rest
一.接口类 <PRE class=java name="code">@Path("/rest_HelloWorld") public interfa ...
- gradient的几点认识转载
线性渐变(Linear Gradients)- 向下/向上/向左/向右/对角方向 径向渐变(Radial Gradients)- 由它们的中心定义 在这里主要讲线性渐变谷歌浏览器中:(1)backgr ...
- Swift 2.0 自定义cell和不同风格的cell
昨天我们写了使用系统的cell怎样创建tableView,今天我们再细分一下,就是不同风格的cell,我们怎写代码.先自己创建一个cell,继承于UItableviewcell 我们看看 cell 里 ...
- 【吐血整理】svn命令行,Subversion的正确使用姿势~
一.写在前面 前面一直博主一直用svn的桌面版本,但看项目经理一直都用的命令行方式,不为性能,还能直接装逼呀!在这里先感谢赵哥,也把它分享给感兴趣的你们~ 二.直接上干货 1. svn checkou ...
- docker - 容器里安装mysql
在docker中安装mysql ubuntu官方镜像是精简的ubuntu系统,很多软件和库没有安装,所以直接安装mysql的话依赖较多,建议直接从源码编译安装mysql 通过命令行安装 先启动一个容器 ...
- [hadoop] - Container [xxxx] is running beyond physical/virtual memory limits.
当运行mapreduce的时候,有时候会出现异常信息,提示物理内存或者虚拟内存超出限制,默认情况下:虚拟内存是物理内存的2.1倍.异常信息类似如下: Container [pid=13026,cont ...
- HashTable源码分析
本次分析代码为JDK1.8中HashTable代码. HashTable不允许null作为key和value. HashTable中的方法为同步的,所以HashTable是线程安全的. E ...