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,给应用程序提供动态内存的.内存不断申请释放后, ...
随机推荐
- .NET Core 最小化发布
.NET Core 应用最小化独立部署发布,.NET Core 默认应用独立发布,大概占用50m左右的空间,不同的系统大小有所区别. .NET Core 的发布之前我也有所介绍,.NET Core 跨 ...
- 自己开发轻量级ORM(三)
上一篇中简单分享了下ORM的设计思路.现在开始讲如何用代码来实现上篇的设计模型. 我们建2个类库来分别抽象数据库表结构关系映射和SQL增删改查操作. 打开VS2010,新建2个类库.分别起名为Mode ...
- 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器
九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...
- 动态样式语言—LESS
博客原文地址:Claiyre的个人博客 https://claiyre.github.io/ 博客园地址:http://www.cnblogs.com/nuannuan7362/ 如需转载,请在文章开 ...
- Yarn init 命令在 Git Bash 中打开时的错误
最近一直在学习一些新的知识,ES5.ES6.Vue等,当然,作为程序,英文的阅读和听写能力也是要去学习的. 最近慕课网上的qbaty大神出了两套视频,分别是webpack和yarn,本着不断学习的精神 ...
- [java多线程] - Thread&Runnable运用
负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...
- 在Eclipse上通过插件获取github上的spring源码
spring源码开始的时候是通过SVN来管理代码的,后来是转移到github上管理源码的,可以通过在github上直接下载spring的源码. 下面讲解如何通过在eclipse上的插件git来获取sp ...
- 百度网盘免费扩容 免费扩容到2048G
您可以用手机端扩容 http://yun.baidu.com/1t 免费扩容到2048G
- Git 基本工作流程
1. 用户信息配置(全局配置) $ git config --global user.name leo$ git config --global user.email hehe_xiao@qq.com ...
- iOS基础之顺传逆传传值(delegate、block)
写给iOS新手的福利! 在项目中经常会用到传值,根据传值的方向分为顺传(从根控制器到子控制器)和逆传(从子控制器到根控制器).在这里写了个Demo简单演示了效果,创建了两个控制器: 一个为根控制器,一 ...