码迷,mamicode.com
首页 > 其他好文 > 详细

GPU内存分配器笔记

时间:2016-06-14 13:38:28      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

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。

 

GPU内存分配器笔记

标签:

原文地址:http://www.cnblogs.com/shrimp-can/p/5574507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!