zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    LInq 与lambda表达式
    Java内存模型-jsr133规范介绍(转)
    Java多线程之Lock的使用(转)
    有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)
    CountDownLatch
    CyclicBarrier
    java设计模式演示样例
    2012毕业找工作记录点滴
    Objective-C语法之代码块(block)的使用
    权限表设计之代码解析
  • 原文地址:https://www.cnblogs.com/shrimp-can/p/5574507.html
Copyright © 2011-2022 走看看