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,给应用程序提供动态内存的.内存不断申请释放后, ...
随机推荐
- 关于Task的一点思考和建议
前言 本打算继续写SQL Server系列,接下来应该是死锁了,但是在.NET Core项目中到处都是异步,最近在写一个爬虫用到异步,之前不是很频繁用到异步,当用到时就有点缩手缩尾,怕留下坑,还是小心 ...
- shell编程其实真的很简单(三)
通过前两篇文章,我们掌握了shell的一些基本写法和变量的使用,以及基本数据类型的运算.那么,本次就将要学习shell的结构化命令了,也就是我们其它编程语言中的条件选择语句及循环语句. 不过,在学习s ...
- 新生命组件XAgent使用心得
1.简单介绍 XAgent为大石头带领下的新生命团队自己开发的一个.Net下的常用的Windows服务管理组件利器,通过在控制台中简单的输入1,2,3,4,5等数字可以实现一步安装.卸载Windows ...
- CSS3知识点整理(四)----布局样式及其他
包括CSS3多列布局样式.Flexbox伸缩布局.盒子模型等.重点介绍了Flexbox伸缩布局的各种属性用法. 一.多列布局 为了能在Web页面中方便实现类似报纸.杂志那种多列排版的布局,W3C特意给 ...
- Python学习--20 Web开发
HTTP格式 HTTP协议是基于TCP和IP协议的.HTTP协议是一种文本协议. 每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的. HTTP ...
- 2.SQL语言进阶
0.实验数据 表1.course表 表2.student表 表3.sc表 1.SQL连接 内连接 select * from student,sc where student.sno=sc.sno;/ ...
- javascript名字由来
javascript是由web发展初期的网景(Netscape)公司创建的,javascript是Sun Microsystem 公司(Oracle)的注册商标,用来特指网景(现在的Mozilla)对 ...
- weex官方demo weex-hackernews代码解读(下)
weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android.而weex-hacknews则是weex官方出品的,首个使用 Weex 和 Vu ...
- Excel与XML相互转换 - C# 简单实现方案
Excel与XML相互转换 - C# 简单实现方案 在日常工作中,我需要将数据存储在Excel中进行数据分析和处理,然后再将数据转换为XML格式进行跨平台的数据交换.网上搜索Excel转换为XML的实 ...
- 2-23c#基础循环语句
循环语句 必须具备四要素:初始条件.循环条件.循环体.状态改变 for (初始条件; 循环条件; 状态改变) { 循环体} 简单举例 for(int i=1;i<=10;i++)//就是 ...