对无用存储单元收集的GPU支持.pdf

上传人:111****112 文档编号:1487934 上传时间:2018-06-17 格式:PDF 页数:25 大小:1.89MB
返回 下载 相关 举报
摘要
申请专利号:

CN201180020912.X

申请日:

2011.02.22

公开号:

CN102985910A

公开日:

2013.03.20

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 12/02申请日:20110222|||公开

IPC分类号:

G06F12/02

主分类号:

G06F12/02

申请人:

超威半导体公司

发明人:

埃里克·R·卡斯波尔

地址:

美国加利福尼亚州

优先权:

2010.03.02 US 12/715,835

专利代理机构:

上海胜康律师事务所 31263

代理人:

李献忠

PDF下载: PDF下载
内容摘要

本发明公开了一种用于有效无用存储单元收集的系统和方法。通用中央处理单元(CPU)根据分代无用存储单元收集技术对分配的堆进行分区。代被分成固定大小的卡。所述CPU在应用程序执行期间标记自上一次无用存储单元收集以来的合格脏卡的指示。当所述CPU检测到下一次无用存储单元收集起始条件被满足时,所述CPU向专用处理单元(SPU)发送与一个或多个卡根地址的确定相对应的通知,每个卡根地址对应于所述标记指示之一。所述SPU具有单指令多数据(SIMD)并行架构,并且可为图形处理单元(GPU)。所述SPU可利用其SIMD核心的并行架构来同时计算多个卡根地址。然后,所述SPU将这些地址发送至所述CPU以供无用存储单元收集算法中使用。

权利要求书

权利要求书一种处理节点,其包括:
通用中央处理单元(CPU);
专用处理单元(SPU);以及
存储器;
其中所述CPU被配置成:
响应于检测到存储于所述存储器的一部分中的数据对象已被修改,存储对应于所述部分的指示;并且
响应于检测到无用存储单元收集起始条件被满足,向所述SPU发送通知;
其中响应于从所述CPU接收到所述通知,所述SPU被配置成执行对应于所述部分的无用存储单元收集预处理。
根据权利要求1所述的处理节点,
其中所述CPU还被配置成:
将所述存储器分成多个区域,每个区域均包括多个子区域,所述部分对应于所述子区域之一;并且
其中所述SPU还被配置成计算多个根地址,每个根地址均对应于所述存储的指示之一。
根据权利要求2所述的处理节点,其中所述SPU还被配置成将所述计算的根地址发送至所述CPU以供无用存储单元收集算法使用,以识别一个或多个预定可收集区域中的可获得的数据对象。
根据权利要求3所述的处理节点,其中所述CPU还被配置成响应于检测到存储于所述多个子区域中的子区域中的数据对象包含指向所述一个或多个预定可收集区域之一的指针值来存储与所述子区域相对应的指示。
根据权利要求3所述的处理节点,其中所述CPU还被配置成在所述通知中向所述SPU发送所述存储的指示和所述多个区域中的区域的基地址,所述多个区域包括与所述存储的指示相对应的一个或多个子区域。
根据权利要求5所述的处理节点,其中所述SPU还被配置成:
并行读取两个或更多个存储的指示,以定位两个或更多个相应子区域;并且
针对所述两个或更多个定位的子区域中的每一个,基于相应基地址并行计算一个根地址。
根据权利要求6所述的处理节点,其中所述SPU包括单指令多数据(SIMD)并行架构。
根据权利要求6所述的处理节点,其中所述SPU在不引起使所述CPU停止执行的暂停的情况下计算所述多个根地址。
一种用于无用存储单元收集的方法,所述方法包括:
通用中央处理单元CPU响应于检测到存储于存储器的一部分中的数据对象已被修改来存储对应于所述部分的指示;
响应于检测到无用存储单元收集起始条件被满足,从所述CPU向专用处理单元(SPU)发送通知;并且
所述SPU执行对应于所述部分的无用存储单元收集预处理。
根据权利要求9所述的方法,其还包括:
所述CPU将所述存储器分成多个区域,每个区域均包括多个子区域,所述部分对应于所述子区域之一;并且
所述SPU计算多个根地址,每个根地址均对应于所述存储的指示之一。
根据权利要求10所述的方法,其还包括将所述计算的根地址发送至所述CPU以供无用存储单元收集算法使用,以识别一个或多个预定可收集区域中的可获得的数据对象。
根据权利要求11所述的方法,其还包括响应于检测到存储于所述多个子区域中的子区域中的数据对象包含指向所述一个或多个预定可收集区域之一的指针值来存储与所述子区域相对应的指示。
根据权利要求11所述的方法,其还包括在所述通知中向所述SPU发送所述存储的指示和所述多个区域中的区域的基地址,所述多个区域包括与所述存储的指示相对应的一个或多个子区域。
根据权利要求13所述的方法,其还包括:
并行读取两个或更多个存储的指示,以定位两个或更多个相应子区域;并且
针对所述两个或更多个定位的子区域中的每一个,基于相应基地址并行计算一个根地址。
根据权利要求13所述的方法,其中所述多个区域中的每个区域均对应于相应存储数据对象的龄期,其中所述一个或多个预定可收集区域为所述多个区域中的最新区域。
根据权利要求15所述的方法,其中所述无用存储单元收集起始条件包括其中最新子区域具有小于预定阈值的空闲空间的条件。
一种计算系统,其包括:
第一处理节点,其包括通用中央处理单元(CPU);
存储器,其耦接至所述第一处理节点;以及
第二处理节点,其包括专用处理单元(SPU);
其中所述CPU被配置成:
响应于检测到存储于所述存储器的一部分中的数据对象已被修改,存储对应于所述部分的指示;并且
响应于检测到无用存储单元收集起始条件被满足,向所述SPU发送通知;
其中响应于从所述CPU接收到所述通知,所述SPU被配置成执行对应于所述部分的无用存储单元收集预处理。
根据权利要求17所述的计算系统,其中所述CPU还被配置成:
将所述存储器分成多个区域,每个区域均包括多个子区域,所述部分对应于所述子区域之一;并且
其中所述SPU还被配置成计算多个根地址,每个根地址均对应于所述存储的指示之一。
根据权利要求18所述的计算系统,其中所述CPU还被配置成响应于检测到存储于所述多个子区域中的子区域中的数据对象包含指向一个或多个预定可收集区域之一的指针值来存储与所述子区域相对应的指示。
根据权利要求18所述的计算系统,其中所述CPU还被配置成在所述通知中向所述SPU发送所述存储的指示和所述多个区域中的区域的基地址,所述多个区域包括与所述存储的指示相对应的一个或多个子区域。

说明书

说明书对无用存储单元收集的GPU支持
背景技术
技术领域
本发明涉及计算系统,并且更具体地涉及计算机无用存储单元收集机制。相关领域的描述
当软件程序员根据一种算法或方法编写应用程序以执行工作时,程序员通常会利用变量来引用临时数据和结果数据。可称为数据对象的此数据要求在计算机存储器中分配空间。在一个或多个应用程序的执行期间,可用于数据对象的分配的计算机存储器的未分配或空闲的量可减少至次优水平。空闲空间量的这种减少可使系统性能降低,并且最终可能不存在任何可用空闲空间。可在应用程序执行期间使用自动存储器管理技术,例如无用存储单元收集。无用存储单元收集维持足够的空闲空间,识别并移除内存泄漏,将可获得的数据对象中的一些或全部复制到新存储区中,根据需要更新对数据对象的引用等。
无用存储单元收集算法在带来益处的同时也有一些设计代价。例如,无用存储单元收集算法通常包括若干步骤,并且可能比较耗时。因此,当无用存储单元收集算法执行其任务时,计算系统可能会经历暂停。如果无用存储单元收集程序实时运行或在执行应用程序的同时运行,则无用存储单元收集暂停的时长可能是不可接受的。此外,该算法可能在其执行期间利用高速缓存空间。高速缓存空间的使用又可能导致有用信息被排除,一旦该算法完成就必须重新获取该信息。
对存储器的一部分而非整个存储器执行无用存储单元收集算法的步骤可减少与无用存储单元收集相关的暂停时间。此外,研究已表明在许多软件应用程序中大多数数据对象存活时间不长。因此,对于上述无用存储单元收集的问题的一个解决方案包括对具有最新数据对象的存储器的一部分执行无用存储单元收集算法。一种此类技术为分代无用存储单元收集。
在确定运行无用存储单元收集时,执行一些预处理步骤,然后才进行无用存储单元收集。例如,在此时计算指向较新数据对象的较旧数据对象的地址。无用存储单元收集算法随后使用这些地址以将所有可获得的数据对象定位。随着地址的数量和大小的增加,用于地址计算的时间也增加,并且可能减少分代无用存储单元收集技术的有益效果。
鉴于以上情况,需要用于进行计算机无用存储单元收集的有效方法和机制。
发明概述
考虑了用于进行有效无用存储单元收集的系统和方法。
在一个实施方案中,处理节点包括通用中央处理单元(CPU)、专用处理单元(SPU)和存储器。在一个实施方案中,SPU具有单指令多数据(SIMD)并行架构,并且可为图形处理单元(GPU)。CPU进行操作以将存储器内的分配的堆分成多个区域。在各个实施方案中,这些区域可按照龄期来排序或识别,并且可称为“代”。此外,每个区域均可包括多个子区域或“卡”。在一些实施方案中,每个卡均具有固定大小,例如128个字节、4KB虚拟页或其它大小。在应用程序执行期间,CPU响应于检测到对存储于卡中的数据对象的修改有资格作为潜在跨代引用来标记与特定卡相对应的指示。例如,在一个实施方案中,可修改存储于数据对象中的指针值以指向存储于另一代中的数据对象。在另一个实施方案中,当修改指针值以指向存储于最新代中的数据对象时,对相应指示进行标记。可能存在且可考虑其它资格条件。
在各个实施方案中,CPU可检测到无用存储单元收集起始条件被满足,例如最新代具有小于预定阈值的空闲存储空间。响应于确定无用存储单元收集起始条件被满足,CPU将指示SPU将执行预定无用存储单元收集相关任务的通知发送至SPU。在一个实施方案中,SPU可确定一个或多个卡根地址,每个卡根地址均对应于标记的指示之一。SPU可利用SIMD核心的并行架构来同时计算多个卡根地址。当SPU执行无用存储单元收集相关任务时,CPU可继续处理其它任务。因此,可在CPU不引起无用存储单元收集暂停的情况下确定这些卡根地址。另外,这些任务无需CPU的高速缓存子系统。因此,可提高总体系统性能。在各个实施方案中,第一处理节点的CPU可经由网络连接将上述通知发送至位于第二处理节点中的SPU。然后,如上所述,SPU可确定卡根地址,以便卸载CPU。
这些和其它实施方案将通过参考以下描述和附图来进一步理解。
附图简述
图1为包括具有并行架构的专用处理单元的示例性处理节点的一个实施方案的总体框图。
图2为进程地址空间的一个实施方案的总体框图。
图3为分区存储器的一个实施方案的总体框图。
图4为一种通过具有并行架构的专用处理单元来进行有效无用存储单元收集的方法的一个实施方案的流程图。
图5为一种用于计算卡根地址以供无用存储单元收集算法中使用的方法的一个实施方案的流程图。
图6为通用处理器核心的一个实施方案的总体框图。
图7为图形处理器核心的一个实施方案的总体框图。
图8为示出计算系统的一个实施方案的总体框图。
虽然本发明可具有各种修改和替代形式,但是具体实施方案以举例的方式在附图中示出,并且在本文中被详细描述。然而,应当理解,附图及其详细描述并不旨在使本发明受限于所公开的特定形式,而相反地,本发明应涵盖由所附权利要求所限定的本发明的精神和范围内的所有修改、等同形式和替代形式。
具体实施方式
在以下描述中,阐述了许多具体细节,以提供对本发明的充分理解。然而,本领域的普通技术人员应意识到,本发明可在无需这些具体细节的情况下实施。在某些情况下,未详细示出所熟知的电路、结构和技术,以避免使本发明难以理解。
参照图1,示出了带有具有并行架构的专用处理单元(SPU)的示例性处理节点110的一个实施方案。处理节点110可包括存储器控制器(MC)120;接口逻辑140;一个或多个处理单元115,其可包括一个或多个处理器核心112和相应高速缓冲存储器子系统114;包处理逻辑116;以及共享高速缓冲存储器子系统118。此外,处理节点110可包括一个或多个专用处理单元(SPU)170。SPU 170可包括具有并行架构的专用处理器核心172,例如单指令多数据(SIMD)核心。SIMD核心的示例包括图形处理单元(GPU)、数字信号处理(DSP)核心或其它。
在一个实施方案中,处理节点110可包括作为图形处理单元(GPU)来实施的SPU 170,以替代或补充到第二通用处理单元115(未示出)。GPU 170可包括一个或多个图形处理器核心172和数据存储缓冲器174。GPU可为用于个人计算机、工作站或视频游戏控制台的专用图形呈现装置。在一个实施方案中,处理节点110的所述功能包括在单个集成电路上。
处理器核心112包括用于根据预定义通用指令集来执行指令的电路。例如,可选择x86指令集架构。或者,可选择Alpha、PowerPC或任何其它通用指令集架构。一般来讲,处理器核心112分别为了数据和指令访问高速缓冲存储器子系统114。如果请求的块在高速缓冲存储器子系统114或共享高速缓冲存储器子系统118中未找到,则可生成读请求,并且将其传送至位于缺失块映射到的节点内的存储器控制器(MC)。
现代GPU 170在处理和显示计算机图形方面非常有效,并且对于一系列复杂算法而言,其高度并行的结构使其比通用中央处理单元(CPU)(例如处理单元115)更有效。GPU通常执行图形和视频所需的计算,而CPU执行不止图形的更多系统进程的计算。常规的GPU 170使用非常广泛的单指令多数据(SIMD)架构,以在图像渲染应用程序中实现高吞吐量。此类应用程序通常需要对大量对象(顶点或像素)执行相同的程序,例如顶点着色器或像素着色器。因为每个对象独立于其它对象被处理,但使用相同的操作序列,所以SIMD架构可提供可观的性能增强。
GPU 170中的发展包括对可编程着色器的支持,这些可编程着色器可操纵顶点和纹理、用于减少混叠的过采样和内插技术以及极高精度的色彩空间。这些计算中的很多涉及矩阵和矢量运算。因此,已考虑将GPU 119用于非图形计算中。
在一个实施方案中,为了管理存储器,CPU执行分代无用存储单元收集(GC)算法的步骤;见H.Lieberman等,A Real‑Time Garbage Collector Based on the Lifetime of Objects,Communications of the ACM 26(6),第419‑429页。CPU 115在执行分代无用存储单元收集算法之前可利用卡标记技术的预处理步骤,见P.Wilson等,A card‑marking scheme for controlling intergenerational references in generation‑based GC on stock hardware,SIGPLAN Notices 24(5),第87‑92页。为了减少无用存储单元收集暂停时间,算法可在存储器的一部分而非整个存储器上运行。在一个实施方案中,在存储器中的分配的堆可分成区域。这些区域可称为“代”。在一个实施方案中,每个代对应于其中所包含的数据对象的龄期。在一个实施方案中,无用存储单元收集算法可在仅一个或多个最新代上运行。此技术可减少无用存储单元收集期间的无用存储单元收集暂停时间和高速缓存的利用。
位于一个或多个较新代中的第一数据对象可被较旧代中的第二数据对象引用。该较旧代不包括在一个或多个较新代之内。因为仅对这一个或多个较新代执行无用存储单元收集,所以该引用可能丢失。如果发生这样的丢失,则可能错误地确定位于较新代中的第一数据对象为不可获得。经确定为不可获得的数据对象从存储器中被移除。因此,采取步骤以确定引用较新代中的数据对象的位于较旧代中的任何数据对象的地址。这些步骤作为分代无用存储单元收集技术的一部分来执行,并且随后被进一步描述。
在一个实施方案中,每个代被分成子区域。这些子区域可称为“卡”。在一个实施方案中,每个卡对应于其中所包含的数据对象的龄期。在一个实施方案中,无用存储单元收集算法可在位于较新代中的每个卡上运行。无用存储单元收集可仅在较旧代中的标记的卡上运行。在应用程序执行期间,在一个实施方案中,当确定卡包含指向位于一个或多个最新代中的另一个数据对象的数据对象时,可对该卡进行标记。在另一个实施方案中,当确定卡包含已修改的数据对象时,可对该卡进行标记。可能存在且可考虑其它卡标记条件。在一个实施方案中,在执行无用存储单元收集算法之前执行的预处理步骤可确定标记的卡的地址。随后,在算法中,执行步骤以确定引用较新代中的数据对象的位于较旧代中的任何数据对象的地址。
再参照图1,在一个实施方案中,当CPU 115检测到分代GC起始条件时,CPU 115可向GPU 170发送通知。响应于接收到该通知,GPU 170可计算地址。这些地址可对应于较旧代中的卡,这些代可能存储指向较新代中的卡的指针值。这些地址可称为根地址或卡根地址。
上述根地址的计算可为可高度并行化的任务。与CPU相比,GPU 170可更有效地执行可高度并行化的任务。此外,可执行GPU 170所执行的工作,同时CPU 115继续执行一个或多个软件应用程序。因此,执行用于获得根地址的计算步骤不会产生GC暂停。通过消除预处理步骤的GC暂停,可提高总体系统性能。下面将进一步描述用于执行这些预处理步骤的CPU 115与GPU 170之间的协议的更多细节。
在一个实施方案中,GPU 170可位于视频卡上。在另一个实施方案中,GPU170可集成于母板上。在又一个实施方案中,处理节点110的所述功能可包括在单个集成电路上。在该实施方案中,CPU 115和GPU 170可为来自不同设计中心的专有核心。另外,GPU 170现在可能能够经由来自处理节点110的存储器控制器120来直接访问本地存储器114和118以及主存储器,而非经由接口140在芯片外进行存储器访问。该实施方案可减少GPU 170的存储器访问的等待时间,这可转化成更高的性能。
继续描述图1中处理节点110的组件,高速缓存子系统114和118可包括被配置成存储数据块的高速缓存存储器。高速缓冲存储器子系统114可集成于相应处理器核心112内。或者,根据需要,高速缓冲存储器子系统114可耦接至后部高速缓存配置或内联配置中的处理器核心114。更进一步地,高速缓冲存储器子系统114可作为高速缓存的一个层次结构来实施。如果需要,更靠近处理器核心112(在层次结构内)定位的高速缓存可集成于处理器核心112中。在一个实施方案中,高速缓冲存储器子系统114各自均表示L2高速缓存结构,而共享高速缓存子系统118表示L3高速缓存结构。高速缓冲存储器子系统114和共享高速缓冲存储器子系统118均可包括耦接至相应高速缓存控制器的高速缓冲存储器。
一般来讲,包处理逻辑116被配置成对在处理节点110耦接到的链路上所接收的控制包作出响应、响应于处理器核心112和/或高速缓冲存储器子系统114来生成控制包、响应于存储器控制器120为服务所选择的事务来生成探测命令和响应包以及通过接口逻辑140将包路由到其它节点(对于这些包,节点110为中间节点)。接口逻辑140可包括用以接收包且使这些包与包处理逻辑116所使用的内部时钟同步的逻辑。
参照图2,示出了总体进程地址空间200的一个实施方案。现代计算系统使用虚拟存储器,以便在多个进程之间共享较少量的物理存储器。地址空间200可为相连虚拟地址空间,其中虚拟地址和物理地址之间的映射确定了值210‑250在物理存储器或磁盘中的位置。多处理器系统上可例如使处理节点110的资源的再现的操作系统可为软件应用程序分配存储器的区域。当编译软件应用程序时,应用程序可包括多个进程。在此实施方案中,每个进程均可在应用程序执行之前拥有其自身的资源,例如存储器的映像或者指令和数据的实例。另外,每个进程均可包含进程特定信息,例如处理代码、数据且可能处理堆和栈的地址空间;诸如栈指针、通用和浮点寄存器、程序计数器及其它等数据和控制寄存器中的变量;以及诸如stdin、stdout及其它等操作系统描述符,以及诸如处理器所有者和进程权限集合等安全属性。
一般而言,对于给定软件应用程序,操作系统的内核为该应用程序设置地址空间200,将该应用程序的代码210加载到存储器中,为该程序设置栈250,分支到应用程序代码210内的给定位置,并且开始应用程序代码210的执行。在一些实施方案中,并非所有代码210和数据220都需在开始执行之前存储于物理存储器中。软件应用程序如何使用指令集架构(ISA)受编译器与高级别语言的交互的影响。例如,对于软件应用程序的开发,需要知道如何分配变量和为其定址以及需要多少个寄存器来分配变量。在一个实施方案中,静态数据220、栈250和堆230确定数据分配。
静态数据220可用于分配静态声明的对象,例如全局变量和常量。大多数这些对象可为阵列。栈250可用于分配标量变量而非阵列,例如当前被调用的函数中的局部变量和参数。栈250可分别在过程调用或返回时增长和收缩。堆230可用于分配通过指针访问的动态对象,并且通常不为标量变量。堆230可用于通过在串/列表操作期间存储临时串或列表的内容来降低复制串和列表内容的频率。堆不受函数调用的返回的影响。
在源代码中示出栈250和堆230的使用的方法的一个简单示例如下:

以上示例具有称为Students的类,并且Students类包括两个公共字段:name(名字)和score(分数)。Students类通过Classroom方法来访问。在Classroom方法中,创建了属于类型Students的名为jeff的对象。该对象的名字和分数字段被初始化。在一个实施方案中,在执行该代码示例之后,栈250包含调入例如图2中的条目252j的Classroom方法。对象jeff的条目可包括在图2中的条目252k中。对象jeff可不指向某个值,而是其可引用堆230中的对象232h。对象232h可存储为一个类或引用类型的Students对象。对象232h的字段234a可存储name字段值,而字段234b可存储score字段值。
在Classroom方法已完成执行之后,栈250可使条目252j出栈,因为该条目仅包含关于正在执行或将要执行的代码的信息。因为该示例中未剩下要执行的内容(其可表示整个应用程序的仅一部分),所以栈250可具有被调整为当前指向条目252i而非条目252j的栈指针。另一方面,堆仍然可包含对象232h的字段234a和234b中的数据。
随后,可执行无用存储单元收集算法,以便从堆230中清除未被引用的(未使用)的数据。例如,可从对象232h中移除上述Students类,因为它将不再被使用。在一个实施方案中,无用存储单元收集算法包括以下操作中的一个或多个:扫描系统存储器、标记所有可获得的数据对象(这可能需要递归搜索)、删除经确定为不可用或不可获得的数据对象以及移动数据对象以占用存储器中的相连位置。该最后一个步骤可称为压缩。
虽然未在上述示例中使用,但在图2中示出了在堆230中对象232b被对象232g中的指针引用。当执行无用存储单元收集以清除未使用的数据时,通过无用存储单元收集程序算法使有用数据仍保持在存储器中。在一些实施方案中,无用存储单元收集算法可产生需保留以供以后应用程序使用的数据对象的列表。该列表的产生可从根或根地址开始。根地址可对应于静态数据220中的静态全局指针、栈250中的指针以及由CPU中的存储器地址指向的堆230中的任何数据对象。在GC算法进行递归搜索期间,可确定对象232g为可获得的。在一个示例中,对象232b可由于被对象232g中的指针引用而可为可获得的。可获得的对象可被定义为通过根地址定位的对象或被此前确定为可获得的对象引用的对象。
在一个实施方案中,利用了周期性地执行无用存储单元收集的无用存储单元收集算法。一个周期开始于收集程序决定(或被通知)需要回收内存时。例如,当系统内存不足时,可启动无用存储单元收集。无用存储单元收集算法试图回收无用存储单元或绝不会被应用程序再次访问或改变的对象所使用的内存。可得出语法无用存储单元(程序不可能获得的数据对象)与语义无用存储单元(程序实际上绝不会再次使用的数据对象)之间的一个区别。访问存储器的软件线程可称为存取器(mutator)。已经开发出且可使用许多种不同的无用存储单元收集技术。
在一些情况下,无用存储单元收集系统通常经历了各种程度的过多暂停时间的问题。该问题出现在实时执行无用存储单元收集(即与运行于一个或多个处理器上的其它正在执行的程序的执行同时进行)时。例如,假定系统包含多个存取器线程和单个无用存储单元收集线程。如果这些存取器正被用于多媒体应用程序,则这些线程可能需要以某个速率来提供该应用程序,例如电影。不能承受可观的GC暂停时间的代价的一些关键应用程序的示例包括网上股票交易、电子商务应用程序以及多媒体应用程序(例如电影和视频游戏)。
现转向图3,示出了分区的存储器300的一个实施方案。分代无用存储单元收集(GC)可利用存储器中可分成代360a、360b、360c等的分配的堆230。在各个实施方案中,操作系统或其它软件可执行分区,并且确定代360a、360b和360c的大小。此外,代360a、360b和360c中的每个均可分成子区域。这些子区域可称为卡。例如,代360a可分成卡350a、350b、350f等。在一个实施方案中,卡350a、350b和350f中的每个均具有相同的固定大小,例如128个字节、4千字节(KB)虚拟页或其它大小。
在一个实施方案中,堆230中的卡350a‑350g中的每个均存储一个或多个数据对象。例如,卡350a存储数据对象320a、320g等。虽然卡可仅存储单个数据对象,但通常卡存储多个数据对象。卡根地址380a、380b和380f可用于定位相应的卡350a、350b和350f。对应于代和卡的元数据可存储于存储器中。该元数据可包括用于定位代360a、360b和360c的代基地址370a、370b和370c。此外,该元数据可包括数据结构,例如包括条目312a、312b、312j、312k等的卡表310。在一个实施方案中,卡表310可针对存储器中的每个卡包括一个条目。在另一个实施方案中,卡表310可针对每个代(除了最新代之外)内的每个卡包括一个条目。在此实施方案中,可跳过最新代,因为最新代内的每个卡可在GC算法期间被无条件扫描。在另一个实施方案中,卡表310可针对堆中的每个数据对象包括一个条目。此实施方案使卡表310显著增大。
在一个实施方案中,条目312a、312b、312j和312k中的每个均包括单个位。条目312a、312b、312j和312k中的每个内的单个位可通过处理器核心112在其执行软件应用程序时进行设置。在一个实施方案中,可在存储于相应卡中的相应数据对象被修改时设置此单个位。在另一个实施方案中,可在相应数据对象内的指针值被修改以指向存储于另一代中的数据对象时设置此单个位。例如,如果修改了数据对象320g内的指针值以指向存储于代360b的卡350g中的数据对象,则可设置条目312a中的相应单个位。在又一个实施方案中,可在数据对象内的指针值被修改以指向存储于最新代中的数据对象时设置此单个位。在又一个实施方案中,可在数据对象内的指针值被修改以指向存储于预定要在下一次执行GC算法期间收集的多个最新代之一中的数据对象时设置此单个位。可能存在且可考虑对卡表310内的指示进行标记的其它条件。
存储检验操作执行上述步骤,以确定是否要标记指示。存储检验操作也可称为写屏障操作。存储检验操作可确定在应用程序执行期间是否要在存储操作访问堆时设置相应单个位。存储操作可创建指针值,以供随后在GC算法期间使用。对于一些存储操作,编译器可静态地知晓不需要任何存储检验。例如,当应用程序存储整数且整数作为立即值而非堆分配的对象来实现时,可能不需要任何存储检验操作。然而,在一般情况下,可针对访问堆的每个存储操作执行存储检验操作。因为应用程序中可能频繁地进行存储,所以存储检验操作的有效实施可能是必要的。
对应于处理器核心112的操作系统或其它软件可被配置成检测GC起始条件。在一个实施方案中,GC起始条件包括其中最新的卡具有小于预定阈值的空闲空间的条件。在另一个实施方案中,GC起始条件包括其中最新代具有小于预定阈值的空闲空间的条件。在又一个实施方案中,GC起始条件包括其中整个堆具有小于预定阈值的空闲空间的条件。可能存在且可考虑其它条件。当检测到GC起始条件时,可扫描卡表310的以寻找标记的指示或设置位。对于每个设置位,可计算卡根地址。
为了计算卡根地址,在一个实施方案中,可使用相应条目在卡表310中的位置。卡的大小可乘以相应设置位在卡表310内的条目位置。所得乘积可加上代基地址,以确定卡根地址。例如,卡可具有128字节的大小。卡表310中的条目312j可存储设置位。条目312j可为卡表310中的第20个位。20的二进制值(例如b10100)可向左侧移动7个位置。选择7个位置的移位是因为卡的大小为128个字节或在27字节界上对准的27个字节。所得乘积可加上代基地址370a。
上述用于确定卡根地址380的操作为可并行化的操作。因此,利用具有并行架构的处理器(例如单指令多数据(SIMD)核心)可能有利。SIMD核心的示例包括图形处理单元(GPU)和数字信号处理(DSP)核心。在一个实施方案中,当处理器核心112检测到GC起始条件时,核心112可向SIMD核心172发送通知。在一个实施方案中,该通知可包括在存储器中与卡表310的位置相对应的地址以及一个或多个代的基地址。当SIMD核心172计算卡根地址时,处理器核心112可继续执行一个或多个软件应用程序,从而减少GC暂停时间。
CPU、GPU、DSP或其它内的核心172可根据卡表310内的标记的指示以及代基地址来同时计算两个或更多个卡根地址。在一个实施方案中,核心172可将计算的卡根地址直接发送至处理器核心112。在另一个实施方案中,核心172可将在存储器中的地址发送至处理器核心112,该地址对应于存储计算的卡根地址的位置。当处理器核心112获得对卡根地址值的访问时,处理器核心112可开始执行预定GC算法的步骤。例如,处理器核心112可扫描与计算的卡根地址相对应的已修改卡或脏卡内的每个数据对象。处理器核心112可如前所述追踪这些数据对象内的指针值,以确定至少一个最新代中的可获得的数据对象。
现转向图4,示出了通过单独的专用处理核心来进行无用存储单元收集的方法400的一个实施方案。为了讨论的目的,按顺序示出了该实施方案和随后描述的方法的后续实施方案中的步骤。然而,一些步骤可以不同于所示顺序的顺序来进行,一些步骤可同时进行,一些步骤可与其它步骤结合,并且一些步骤在另一个实施方案中可能不存在。
在框402中,操作系统或其它软件可为软件应用程序分配地址空间。在框404中,分配的堆可分成两个或更多个代。在一个实施方案中,这些代对应于相应数据对象的龄期。此外,每个代可分成子区域或卡。
在框406中,正在执行一个或多个软件应用程序的指令。在框410中,在执行期间,可将数据对象分配在堆中。可在存储器中维护日志来存储每个分配的数据对象的相应信息。例如,日志可包括每个分配的数据对象的条目,其中该条目包括数据对象名称、地址、大小及其它信息。在一个实施方案中,执行软件应用程序的通用处理器可维护日志。此外,在执行期间,可修改存储于分配的数据对象中的值。
在框412中,在执行期间可确定对分配的数据对象的修改是否满足预定条件。在一个实施方案中,预定条件可包括存储于较旧代的数据对象中的指针值被修改以指向存储于最新代中的数据对象。在此实施方案中,可在新指针值和预定地址范围之间进行比较。该地址范围可对应于代,例如图3中所示的代360a、360b和360c。在一个实施方案中,可在执行软件应用程序期间针对向堆的每个存储操作执行该比较。该比较可为存储检验操作的一部分。可能存在且可考虑其它预定条件,例如以上关于卡标记描述的那些。
如果对分配的数据对象的修改满足预定条件(条件框414),则在框416中进行标记。在一个实施方案中,存储检验操作确定对堆内数据对象的修改是否符合标记条件。存储检验操作可使用至少新指针值和堆中每个代的地址范围之间的比较。在一个实施方案中,对相应指示的标记包括在数据结构(例如卡表310)中设置相应位。在一个实施方案中,存储检验操作也可使用新指针值和堆中每个卡的地址范围之间的比较。这些比较可与与代的地址范围的比较同时进行。
在条件框408中,可确定是否要启动无用存储单元收集。可使用不同要求来确定何时开始此无用存储单元收集,例如空闲存储器的可用量(例如与某个阈值相比)、最新代内空闲存储器的可用量、自上一次无用存储单元收集以来所经过的给定时间量或其它。如果确定不启动无用存储单元收集(条件框408),则方法400的控制流返回到框406。在框406中,继续执行应用程序的指令。如果确定要启动无用存储单元收集(条件框408),则在框420中可向专用处理单元(SPU)发送通知。该通知可指示SPU开始计算卡根地址,例如图3中所示的地址380a、380b和380f。卡根地址的计算可基于自上一次无用存储单元收集以来在应用程序执行期间进行的存储器分配和修改更新。例如,可针对框416中出现的每个标记的指示来计算一个卡根地址。在一个实施方案中,标记的指示对应于卡表310内的设置位。
在框422中,SPU可进行计算以确定卡根地址。在一个实施方案中,这些计算可包括对相应基地址的移位和加法运算,如前所述。随后,SPU可将卡根地址发送至CPU。或者,SPU可向CPU发送与存储器中存储卡根地址的位置相对应的地址。在框424中,CPU可利用计算的卡根地址来执行GC算法的步骤。
现参照图5,示出了用于计算卡根地址以供无用存储单元收集算法中使用的方法500的一个实施方案。类似于方法400,为了讨论的目的,按顺序示出了该实施方案和随后描述的方法的后续实施方案中的步骤。然而,一些步骤可以不同于所示顺序的顺序来进行,一些步骤可同时进行,一些步骤可与其它步骤结合,并且一些步骤在另一个实施方案中可能不存在。
在框502中,可将通知从CPU发送至SPU,以计算用于GC算法的卡根地址。在一个实施方案中,CPU可向SPU发送一个或多个代基地址,例如图3中所示的代基地址370a、370b和370c。此外,CPU可向SPU发送数据结构(例如卡表310)的地址。该数据结构可存储自上一次无用存储单元收集以来在应用程序执行期间任何合格的引用的指示。在框504中,SPU可利用其SIMD核心的并行架构来扫描数据结构(例如卡表310)中的存储的指示。该扫描操作可确定堆中的哪些子区域或卡存储着合格的跨代引用。在框506中,SPU可利用其SIMD核心的并行架构来同时计算多个卡根地址。这些计算可在无需CPU中止软件应用程序的执行的情况下进行。因此,可在无需无用存储单元收集暂停时间的情况下确定卡根地址。
在框508中,CPU可从SPU接收卡根地址。或者,CPU可接收与存储器中存储卡根地址的位置相对应的一个或多个地址。在一个实施方案中,CPU更新在方法400的框410中创建和维护的日志。该日志在应用程序执行期间存储堆中每个分配的数据对象的相应信息。该日志可使用计算的卡根地址来更新。在框510中,CPU可利用存储于日志中的信息来执行预定GC算法的步骤。
在上文中,描述了利用SIMD核心的并行架构来执行无用存储单元收集算法的预处理步骤。在一个实施方案中,预处理步骤包括扫描卡表并计算相应卡根地址。在此处,进一步描述了通用核心与并行架构的SIMD核心之间的区别。首先,描述了通用核心。图6示出了进行乱序执行的通用处理器核心600的一个实施方案。指令高速缓存(i‑cache)和相应转换后备缓冲器(TLB)602可存储软件应用程序的指令以及用于访问指令的地址。如果无i‑cache缺失,则指令获取单元(IFU)604可在每个时钟周期从i‑cache 602获取多个指令。IFU 604可包括程序计数器,其保存指向要在i‑cache 602中获取的后续指令的地址的指针,该指针可与i‑TLB中的地址相比较。IFU 604也可包括分支预测单元,以在执行单元在随后的流水线阶段确定实际结果之前预测条件指令的结果。
解码器单元606解码多个获取的指令的操作码,并且可分配有序回退队列(例如重排序缓冲器618)、保留站608和加载/存储单元614中的条目。在保留站608中分配条目被视为分派。保留站608可作为指令队列,其中指令等待直到其操作数变得可用时。当操作数可用且硬件资源也可用时,可从保留站608向整数和浮点功能单元610或加载/存储单元614无序发出指令。存储器访问(例如加载和存储操作)被发向加载/存储单元614。功能单元610可包括用于诸如加、减、乘、除和平方根等计算运算的算术逻辑单元(ALU)。可包括逻辑以确定条件指令的结果。加载/存储单元614可包括队列和逻辑,以执行存储器访问指令。另外,验证逻辑可位于加载/存储单元614中,以确保加载指令从正确的最新存储指令接收转发数据。
加载/存储单元614可将存储器访问请求622发送至芯片上的一级或多级数据高速缓存(d‑cache)616。每级高速缓存可具有其自身的TLB,用于与存储器请求622进行地址比较。每级高速缓存616可以串行或并行方式来搜索。如果请求的存储器线在高速缓存616中未找到,则将存储器请求622发送至存储器控制器,以便在芯片外访问系统存储器中的存储器线。
来自功能单元610和加载/存储单元614的结果可呈现在公用数据总线612上。可将这些结果发送至重排序缓冲器618。在一个实施方案中,重排序缓冲器618可为先进先出(FIFO)队列,该队列根据程序顺序确保指令的有序回退。在此处,标记接收其结果的指令以进行回退。如果该指令为队列首,则该指令可将其结果发送至寄存器文件620。寄存器文件620可保存处理器核心600的通用寄存器的架构状态。然后,重排序缓冲器中的指令可有序回退,并且可调整其队列首指针以指向程序顺序中的后续指令。
可将公用数据总线612上的结果发送至保留站608,以便将值转发至等待这些结果的指令的操作数。例如,算术指令可具有依赖于前一个算术指令的结果的操作数,或者加载指令可能需要由功能单元610中的地址生成单元(AGU)计算的地址。当这些等待指令具有用于其操作数的值且硬件资源可用于执行这些指令时,可从保留站608向功能单元610或加载/存储单元614中的适当资源无序发出这些指令。
未提交或非回退的存储器访问指令在加载/存储单元中具有条目。来自最新的未提交的较旧存储指令的未完成或未提交的加载指令的转发数据值可置于公用数据总线112上或者简单地路由至加载/存储单元614内的加载缓冲器中的适当条目。应注意,虽然通用处理器核心(例如核心600)可执行高度并行算法(例如单指令多数据(SIMD)应用程序)的指令,但是其效率可能低于具有并行架构的专用处理核心,例如SIMD核心。具有并行架构的专用处理核心的示例包括数字信号处理器(DSP)、图形处理单元(GPU)或其它。
现转向图7,示出了图形处理器核心700的一个实施方案的框图。核心700为SIMD核心中并行架构的一个示例。可能存在且可考虑其它示例,例如DSP的核心。本领域的技术人员可修改核心700,以便获得替代实施方案。用特定布局示出了该实施方案中的框。然而,核心700的布局可不同于所示布局。在其它实施方案中,一些框可被集成,一些框可具有另一个框或单独的独立框中的内部功能和电路,并且一些功能和电路可位于另一个集成电路中。
在所示实施方案中,命令和数据获取单元710可从处理器核心(例如图1中的核心112)上的图形驱动器接收用于浮点运算的渲染命令流、状态信息和几何数据。在一些实施方案中,处理器核心可提供对存储器(如存储该信息的存储器)中的位置的引用,而不是直接提供该信息。从而,单元710从指定位置检索该信息。
可使用渲染命令流、状态信息和几何数据来定义所需的一个或多个呈现的图像,包括场景的几何形状、布光、阴影、纹理、移动和/或摄像机参数。在一个实施方案中,几何数据包括用于可存在于场景中的对象(例如桌子、树、人或动物)的多个定义。多组图元(例如点、线条、三角形和/或其它多边形)可用于对对象建模。这些图元可通过对其顶点的引用来定义。对于每个顶点,可在对象坐标系中指定位置,以表示该顶点相对于正被建模的对象的位置。除了位置之外,每个顶点可具有与其相关的各种其它属性。其它顶点属性的示例可包括用于确定诸如颜色、纹理、透明度、布光、阴影和顶点及其相关几何图元的动画等性质的标量或矢量属性。
对场景中对象的管理可包括状态管理开销并且此开销可在工作分组为小批量的情况下增加。在一个实施方案中,单元710可为从来自主机CPU(如CPU115)的图形驱动器卸载工作的处理器。通常,图形驱动器执行此管理工作,但之后由处理单元115承担此工作。因此,通过加强单元710的处理能力,图形驱动器并且随后处理单元115可免除开销操作。
然后,输入数据汇编器720准备供处理的数据。由汇编器720执行的功能的三个示例可包括用于顶点着色器的顶点组装、用于几何着色器的几何形状组装和用于像素着色器的扫描转换和内插。每种功能均可向分派单元730提交线程。
在一个实施方案中,分派单元730可将接收的工作负荷划分成线程并以最优方式在包括一个或多个流核心742的着色器阵列740与包括一个或多个纹理单元752的功能单元750之间分配线程。分派单元730可确定核心742内部一些流处理单元744的空闲时刻可并向其指定新任务。
流处理应用程序的特征在于需要以及时且响应的方式处理大容量数据流。此类应用程序可采用多个计算单元(例如GPU上的浮点单元),而无需明确地管理这些单元之间的分配、同步或通讯。流处理可通过限制可执行的并行计算来简化并行软件和硬件。作为给定的一组数据的流可具有应用于该流中每个元素的一系列操作。其中一种操作应用于流中所有元素的均匀流型是典型的。操作通常是流水线操作,并且本地芯片上存储器被重新利用来最小化外部存储器带宽。
流抽象暴露数据依赖关系,且因此编译器工具可使芯片上管理任务完全自动化和优化。当依赖关系变为已知时,流处理硬件可使用记分板(scoreboarding)例如来在运行时发起直接存储器存取(DMA)。消除手动DMA管理可降低软件复杂性,而消除硬件高速缓存可减少未专用于计算单元(如算术逻辑单元(ALU))的管芯区域的量。
通过针对传统数字信号处理(DSP)或GPU型应用程序运行良好的数据中心模型来驱动流处理。对于具有更多随机化数据访问的通用处理(如数据库)而言,流处理并非最佳。
在一个实施方案中,每个流核心742为SIMD核心并且包括多个流处理单元(SPU)744。每个SPU 744可包括多个ALU,且因此着色器阵列740可具有大量的计算能力。着色器阵列740可通过按提供的状态信息所选择的程序来对顶点数据执行顶点和/或几何着色程序。着色程序可对顶点和其它数据执行使用多种数学和逻辑运算的算法,并且该程序可包括条件或分支执行路径以及直接和间接存储器访问。待使用的着色程序可存储于图1中示出的系统存储器或缓冲器174中。着色程序可经由本领域已知的适当的渲染命令和状态信息识别到着色器阵列740。
功能单元750包括一个或多个纹理单元752,用于执行像素着色程序,以获得视觉效果。在一个实施方案中,纹理单元752与流核心742结合,使得增加更多的着色能力相当于增加更多的纹理绘制能力。纹理单元752可利用高速缓冲存储器子系统754来在程序执行期间进行数据存储。
参照图8,示出计算系统800的一个实施方案。对应于图1中那些元件的电路部分具有相同标号。计算系统800包括多个处理节点110a‑110d。尽管图8中示出了四个节点,但其它实施方案可包括不同数量的节点,其中每个节点包括一个或多个处理器核心。如本文所用,通过后面带有字母的参考数字标示的元件可只通过该数字来总称。例如,处理节点110a‑110d可总称为处理节点110或节点110。每个节点110可经由相应存储器控制器120耦接至相应存储器130。另外,每个处理节点110可包括用于与处理节点110中的其它节点通信的接口逻辑140。例如,处理节点110a包括用于与处理节点110b和110c通信的接口逻辑140a。类似地,处理节点110b包括用于与处理节点110a和110d等通信的接口逻辑140b。
在图8的实施方案中,示出处理节点110d被耦接以经由接口逻辑140d与输入/输出(I/O)装置160a通信,并且I/O装置160a进一步被耦接至第二I/O装置160b。其它处理节点可以类似的方式与其它I/O装置通信。或者,处理节点可与耦接至I/O总线的I/O桥通信。
计算系统800可实现用于节点间通信的基于分组的链路。在所述实施方案中,链路被实现为一组单向线路(例如,线路150a用于将包从处理节点110a发送至处理节点110b,而线路150b用于将包从处理节点110b发送至处理节点110a)。其它线路组150c‑150h用于将包在图8所示的其它处理节点之间传送。链路可以高速缓存相干方式运行以在处理节点之间通信或以非相干方式作为I/O装置160a‑160b(和其它I/O装置,根据需要)之间的菊花链结构运行。应注意,待从一个处理节点110发送至另一个节点的包可经过一个或多个中间节点。例如,由处理节点110a发送至处理节点110d的包可经过处理节点110b或处理节点110c,如图8所示。可使用任何合适的路由算法。计算系统800的其它实施方案可包括比图8所示的实施方案更多或更少的处理节点。此外,可存在其中每个处理节点通过点对点网络耦接至每个其它处理节点的其它实施方案。除了示出的存储器控制器和接口逻辑之外,每个处理节点110可包括一个或多个处理器和相关高速缓存,如此前在图1中示出和描述的。
存储器130可包括任何合适的存储器装置。例如,存储器130可包括一个或多个RAMBUS动态随机存取存储器(DRAM)、同步DRAM(SDRAM)、DRAM、静态RAM等。计算系统800的地址空间在存储器130间划分。每个处理节点110可包括用于确定哪个地址映射到哪个存储器130的存储器映像,且因此确定对于特定地址的存储器请求应路由至哪个处理节点110。在一个实施方案中,计算系统800内的地址的相干点为耦接至存储对应于该地址的字节的存储器的存储器控制器120。存储器控制器120可包括用于与存储器130接口连接的控制电路。另外,存储器控制器120可包括用于对存储器请求排队的请求队列。
通常,接口逻辑140可包括缓冲器,其用于接收来自链路的包并用于缓存待通过链路发送的包。计算系统800可采用任何合适的流控制机制来发送包。I/O装置160为任何所需的外围装置的示意。例如,I/O装置160可包括网络接口卡、视频加速器、音频卡、硬盘或软盘驱动器或驱动器控制器、小型计算机系统接口(SCSI)适配器和电话卡、调制解调器、声卡和各种数据采集卡如通用接口总线(GPIB)或现场总线接口卡。
如先前所述,每个处理节点110可包括一个或多个处理器和相关高速缓存,如此前在图1中示出和描述的。每个节点110可包括一个或多个通用处理器核心112。此外,处理节点110可包括具有并行架构的专用处理器核心172,例如单指令多数据(SIMD)核心。处理器核心112可在执行GC算法步骤之前利用SIMD核心172来计算根地址,如前文所述。或者,处理节点110a中的处理器核心112例如可在无SIMD核心172的情况下利用包括SIMD核心172的单独节点(如节点110b)中的SIMD核心172。在此实施方案中,当节点110a内的处理器核心112检测到满足的GC起始条件时,核心112可向单独节点110b内的SIMD核心172发送计算根地址的通知。该通知可包括在任何所选节点间通信中。
应注意,上述实施方案可包括软件。在此类实施方案中,实现方法和/或机制的程序指令可通过计算机可读介质来传递或存储。被配置成存储程序指令的许多类型的介质是可用的并且包括硬盘、软盘、CD‑ROM、DVD、闪速存储器、可编程ROM(PROM)、随机存取存储器(RAM)以及各种其它形式的易失性或非易失性存储器。
尽管相当详细地描述了以上实施方案,但本领域的技术人员一旦完全理解上述公开内容,则这些实施方案的许多变化和修改将是显而易见的。所附权利要求应被理解为涵盖所有此类变化和修改。

对无用存储单元收集的GPU支持.pdf_第1页
第1页 / 共25页
对无用存储单元收集的GPU支持.pdf_第2页
第2页 / 共25页
对无用存储单元收集的GPU支持.pdf_第3页
第3页 / 共25页
点击查看更多>>
资源描述

《对无用存储单元收集的GPU支持.pdf》由会员分享,可在线阅读,更多相关《对无用存储单元收集的GPU支持.pdf(25页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 102985910 A(43)申请公布日 2013.03.20CN102985910A*CN102985910A*(21)申请号 201180020912.X(22)申请日 2011.02.2212/715,835 2010.03.02 USG06F 12/02(2006.01)(71)申请人超威半导体公司地址美国加利福尼亚州(72)发明人埃里克R卡斯波尔(74)专利代理机构上海胜康律师事务所 31263代理人李献忠(54) 发明名称对无用存储单元收集的GPU支持(57) 摘要本发明公开了一种用于有效无用存储单元收集的系统和方法。通用中央处理单元(CPU)根据分代无用。

2、存储单元收集技术对分配的堆进行分区。代被分成固定大小的卡。所述CPU在应用程序执行期间标记自上一次无用存储单元收集以来的合格脏卡的指示。当所述CPU检测到下一次无用存储单元收集起始条件被满足时,所述CPU向专用处理单元(SPU)发送与一个或多个卡根地址的确定相对应的通知,每个卡根地址对应于所述标记指示之一。所述SPU具有单指令多数据(SIMD)并行架构,并且可为图形处理单元(GPU)。所述SPU可利用其SIMD核心的并行架构来同时计算多个卡根地址。然后,所述SPU将这些地址发送至所述CPU以供无用存储单元收集算法中使用。(30)优先权数据(85)PCT申请进入国家阶段日2012.10.25(8。

3、6)PCT申请的申请数据PCT/US2011/025779 2011.02.22(87)PCT申请的公布数据WO2011/109191 EN 2011.09.09(51)Int.Cl.权利要求书3页 说明书13页 附图8页(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书 3 页 说明书 13 页 附图 8 页1/3页21.一种处理节点,其包括:通用中央处理单元(CPU);专用处理单元(SPU);以及存储器;其中所述CPU被配置成:响应于检测到存储于所述存储器的一部分中的数据对象已被修改,存储对应于所述部分的指示;并且响应于检测到无用存储单元收集起始条件被满足,向所述SPU发送。

4、通知;其中响应于从所述CPU接收到所述通知,所述SPU被配置成执行对应于所述部分的无用存储单元收集预处理。2.根据权利要求1所述的处理节点,其中所述CPU还被配置成:将所述存储器分成多个区域,每个区域均包括多个子区域,所述部分对应于所述子区域之一;并且其中所述SPU还被配置成计算多个根地址,每个根地址均对应于所述存储的指示之一。3.根据权利要求2所述的处理节点,其中所述SPU还被配置成将所述计算的根地址发送至所述CPU以供无用存储单元收集算法使用,以识别一个或多个预定可收集区域中的可获得的数据对象。4.根据权利要求3所述的处理节点,其中所述CPU还被配置成响应于检测到存储于所述多个子区域中的子。

5、区域中的数据对象包含指向所述一个或多个预定可收集区域之一的指针值来存储与所述子区域相对应的指示。5.根据权利要求3所述的处理节点,其中所述CPU还被配置成在所述通知中向所述SPU发送所述存储的指示和所述多个区域中的区域的基地址,所述多个区域包括与所述存储的指示相对应的一个或多个子区域。6.根据权利要求5所述的处理节点,其中所述SPU还被配置成:并行读取两个或更多个存储的指示,以定位两个或更多个相应子区域;并且针对所述两个或更多个定位的子区域中的每一个,基于相应基地址并行计算一个根地址。7.根据权利要求6所述的处理节点,其中所述SPU包括单指令多数据(SIMD)并行架构。8.根据权利要求6所述的。

6、处理节点,其中所述SPU在不引起使所述CPU停止执行的暂停的情况下计算所述多个根地址。9.一种用于无用存储单元收集的方法,所述方法包括:通用中央处理单元CPU响应于检测到存储于存储器的一部分中的数据对象已被修改来存储对应于所述部分的指示;响应于检测到无用存储单元收集起始条件被满足,从所述CPU向专用处理单元(SPU)发送通知;并且所述SPU执行对应于所述部分的无用存储单元收集预处理。权 利 要 求 书CN 102985910 A2/3页310.根据权利要求9所述的方法,其还包括:所述CPU将所述存储器分成多个区域,每个区域均包括多个子区域,所述部分对应于所述子区域之一;并且所述SPU计算多个根。

7、地址,每个根地址均对应于所述存储的指示之一。11.根据权利要求10所述的方法,其还包括将所述计算的根地址发送至所述CPU以供无用存储单元收集算法使用,以识别一个或多个预定可收集区域中的可获得的数据对象。12.根据权利要求11所述的方法,其还包括响应于检测到存储于所述多个子区域中的子区域中的数据对象包含指向所述一个或多个预定可收集区域之一的指针值来存储与所述子区域相对应的指示。13.根据权利要求11所述的方法,其还包括在所述通知中向所述SPU发送所述存储的指示和所述多个区域中的区域的基地址,所述多个区域包括与所述存储的指示相对应的一个或多个子区域。14.根据权利要求13所述的方法,其还包括:并行。

8、读取两个或更多个存储的指示,以定位两个或更多个相应子区域;并且针对所述两个或更多个定位的子区域中的每一个,基于相应基地址并行计算一个根地址。15.根据权利要求13所述的方法,其中所述多个区域中的每个区域均对应于相应存储数据对象的龄期,其中所述一个或多个预定可收集区域为所述多个区域中的最新区域。16.根据权利要求15所述的方法,其中所述无用存储单元收集起始条件包括其中最新子区域具有小于预定阈值的空闲空间的条件。17.一种计算系统,其包括:第一处理节点,其包括通用中央处理单元(CPU);存储器,其耦接至所述第一处理节点;以及第二处理节点,其包括专用处理单元(SPU);其中所述CPU被配置成:响应于。

9、检测到存储于所述存储器的一部分中的数据对象已被修改,存储对应于所述部分的指示;并且响应于检测到无用存储单元收集起始条件被满足,向所述SPU发送通知;其中响应于从所述CPU接收到所述通知,所述SPU被配置成执行对应于所述部分的无用存储单元收集预处理。18.根据权利要求17所述的计算系统,其中所述CPU还被配置成:将所述存储器分成多个区域,每个区域均包括多个子区域,所述部分对应于所述子区域之一;并且其中所述SPU还被配置成计算多个根地址,每个根地址均对应于所述存储的指示之一。19.根据权利要求18所述的计算系统,其中所述CPU还被配置成响应于检测到存储于所述多个子区域中的子区域中的数据对象包含指向。

10、一个或多个预定可收集区域之一的指针值来存储与所述子区域相对应的指示。20.根据权利要求18所述的计算系统,其中所述CPU还被配置成在所述通知中向所述权 利 要 求 书CN 102985910 A3/3页4SPU发送所述存储的指示和所述多个区域中的区域的基地址,所述多个区域包括与所述存储的指示相对应的一个或多个子区域。权 利 要 求 书CN 102985910 A1/13页5对无用存储单元收集的 GPU 支持背景技术技术领域0001 本发明涉及计算系统,并且更具体地涉及计算机无用存储单元收集机制。相关领域的描述0002 当软件程序员根据一种算法或方法编写应用程序以执行工作时,程序员通常会利用变量。

11、来引用临时数据和结果数据。可称为数据对象的此数据要求在计算机存储器中分配空间。在一个或多个应用程序的执行期间,可用于数据对象的分配的计算机存储器的未分配或空闲的量可减少至次优水平。空闲空间量的这种减少可使系统性能降低,并且最终可能不存在任何可用空闲空间。可在应用程序执行期间使用自动存储器管理技术,例如无用存储单元收集。无用存储单元收集维持足够的空闲空间,识别并移除内存泄漏,将可获得的数据对象中的一些或全部复制到新存储区中,根据需要更新对数据对象的引用等。0003 无用存储单元收集算法在带来益处的同时也有一些设计代价。例如,无用存储单元收集算法通常包括若干步骤,并且可能比较耗时。因此,当无用存储。

12、单元收集算法执行其任务时,计算系统可能会经历暂停。如果无用存储单元收集程序实时运行或在执行应用程序的同时运行,则无用存储单元收集暂停的时长可能是不可接受的。此外,该算法可能在其执行期间利用高速缓存空间。高速缓存空间的使用又可能导致有用信息被排除,一旦该算法完成就必须重新获取该信息。0004 对存储器的一部分而非整个存储器执行无用存储单元收集算法的步骤可减少与无用存储单元收集相关的暂停时间。此外,研究已表明在许多软件应用程序中大多数数据对象存活时间不长。因此,对于上述无用存储单元收集的问题的一个解决方案包括对具有最新数据对象的存储器的一部分执行无用存储单元收集算法。一种此类技术为分代无用存储单元。

13、收集。0005 在确定运行无用存储单元收集时,执行一些预处理步骤,然后才进行无用存储单元收集。例如,在此时计算指向较新数据对象的较旧数据对象的地址。无用存储单元收集算法随后使用这些地址以将所有可获得的数据对象定位。随着地址的数量和大小的增加,用于地址计算的时间也增加,并且可能减少分代无用存储单元收集技术的有益效果。0006 鉴于以上情况,需要用于进行计算机无用存储单元收集的有效方法和机制。0007 发明概述0008 考虑了用于进行有效无用存储单元收集的系统和方法。0009 在一个实施方案中,处理节点包括通用中央处理单元(CPU)、专用处理单元(SPU)和存储器。在一个实施方案中,SPU具有单指。

14、令多数据(SIMD)并行架构,并且可为图形处理单元(GPU)。CPU进行操作以将存储器内的分配的堆分成多个区域。在各个实施方案中,这些区域可按照龄期来排序或识别,并且可称为“代”。此外,每个区域均可包括多个子区域或“卡”。在一些实施方案中,每个卡均具有固定大小,例如128个字节、4KB虚拟页或其它大小。在应用程序执行期间,CPU响应于检测到对存储于卡中的数据对象的修改有资格作说 明 书CN 102985910 A2/13页6为潜在跨代引用来标记与特定卡相对应的指示。例如,在一个实施方案中,可修改存储于数据对象中的指针值以指向存储于另一代中的数据对象。在另一个实施方案中,当修改指针值以指向存储于。

15、最新代中的数据对象时,对相应指示进行标记。可能存在且可考虑其它资格条件。0010 在各个实施方案中,CPU可检测到无用存储单元收集起始条件被满足,例如最新代具有小于预定阈值的空闲存储空间。响应于确定无用存储单元收集起始条件被满足,CPU将指示SPU将执行预定无用存储单元收集相关任务的通知发送至SPU。在一个实施方案中,SPU可确定一个或多个卡根地址,每个卡根地址均对应于标记的指示之一。SPU可利用SIMD核心的并行架构来同时计算多个卡根地址。当SPU执行无用存储单元收集相关任务时,CPU可继续处理其它任务。因此,可在CPU不引起无用存储单元收集暂停的情况下确定这些卡根地址。另外,这些任务无需C。

16、PU的高速缓存子系统。因此,可提高总体系统性能。在各个实施方案中,第一处理节点的CPU可经由网络连接将上述通知发送至位于第二处理节点中的SPU。然后,如上所述,SPU可确定卡根地址,以便卸载CPU。0011 这些和其它实施方案将通过参考以下描述和附图来进一步理解。0012 附图简述0013 图1为包括具有并行架构的专用处理单元的示例性处理节点的一个实施方案的总体框图。0014 图2为进程地址空间的一个实施方案的总体框图。0015 图3为分区存储器的一个实施方案的总体框图。0016 图4为一种通过具有并行架构的专用处理单元来进行有效无用存储单元收集的方法的一个实施方案的流程图。0017 图5为一。

17、种用于计算卡根地址以供无用存储单元收集算法中使用的方法的一个实施方案的流程图。0018 图6为通用处理器核心的一个实施方案的总体框图。0019 图7为图形处理器核心的一个实施方案的总体框图。0020 图8为示出计算系统的一个实施方案的总体框图。0021 虽然本发明可具有各种修改和替代形式,但是具体实施方案以举例的方式在附图中示出,并且在本文中被详细描述。然而,应当理解,附图及其详细描述并不旨在使本发明受限于所公开的特定形式,而相反地,本发明应涵盖由所附权利要求所限定的本发明的精神和范围内的所有修改、等同形式和替代形式。具体实施方式0022 在以下描述中,阐述了许多具体细节,以提供对本发明的充分。

18、理解。然而,本领域的普通技术人员应意识到,本发明可在无需这些具体细节的情况下实施。在某些情况下,未详细示出所熟知的电路、结构和技术,以避免使本发明难以理解。0023 参照图1,示出了带有具有并行架构的专用处理单元(SPU)的示例性处理节点110的一个实施方案。处理节点110可包括存储器控制器(MC)120;接口逻辑140;一个或多个处理单元115,其可包括一个或多个处理器核心112和相应高速缓冲存储器子系统114;包处理逻辑116;以及共享高速缓冲存储器子系统118。此外,处理节点110可包括一个或多说 明 书CN 102985910 A3/13页7个专用处理单元(SPU)170。SPU 17。

19、0可包括具有并行架构的专用处理器核心172,例如单指令多数据(SIMD)核心。SIMD核心的示例包括图形处理单元(GPU)、数字信号处理(DSP)核心或其它。0024 在一个实施方案中,处理节点110可包括作为图形处理单元(GPU)来实施的SPU 170,以替代或补充到第二通用处理单元115(未示出)。GPU 170可包括一个或多个图形处理器核心172和数据存储缓冲器174。GPU可为用于个人计算机、工作站或视频游戏控制台的专用图形呈现装置。在一个实施方案中,处理节点110的所述功能包括在单个集成电路上。0025 处理器核心112包括用于根据预定义通用指令集来执行指令的电路。例如,可选择x86。

20、指令集架构。或者,可选择Alpha、PowerPC或任何其它通用指令集架构。一般来讲,处理器核心112分别为了数据和指令访问高速缓冲存储器子系统114。如果请求的块在高速缓冲存储器子系统114或共享高速缓冲存储器子系统118中未找到,则可生成读请求,并且将其传送至位于缺失块映射到的节点内的存储器控制器(MC)。0026 现代GPU 170在处理和显示计算机图形方面非常有效,并且对于一系列复杂算法而言,其高度并行的结构使其比通用中央处理单元(CPU)(例如处理单元115)更有效。GPU通常执行图形和视频所需的计算,而CPU执行不止图形的更多系统进程的计算。常规的GPU 170使用非常广泛的单指令。

21、多数据(SIMD)架构,以在图像渲染应用程序中实现高吞吐量。此类应用程序通常需要对大量对象(顶点或像素)执行相同的程序,例如顶点着色器或像素着色器。因为每个对象独立于其它对象被处理,但使用相同的操作序列,所以SIMD架构可提供可观的性能增强。0027 GPU 170中的发展包括对可编程着色器的支持,这些可编程着色器可操纵顶点和纹理、用于减少混叠的过采样和内插技术以及极高精度的色彩空间。这些计算中的很多涉及矩阵和矢量运算。因此,已考虑将GPU 119用于非图形计算中。0028 在一个实施方案中,为了管理存储器,CPU执行分代无用存储单元收集(GC)算法的步骤;见H.Lieberman等,A Re。

22、al-Time Garbage Collector Based on the Lifetime of Objects,Communications of the ACM 26(6),第419-429页。CPU 115在执行分代无用存储单元收集算法之前可利用卡标记技术的预处理步骤,见P.Wilson等,A card-marking scheme for controlling intergenerational references in generation-based GC on stock hardware,SIGPLAN Notices 24(5),第87-92页。为了减少无用存储单元收。

23、集暂停时间,算法可在存储器的一部分而非整个存储器上运行。在一个实施方案中,在存储器中的分配的堆可分成区域。这些区域可称为“代”。在一个实施方案中,每个代对应于其中所包含的数据对象的龄期。在一个实施方案中,无用存储单元收集算法可在仅一个或多个最新代上运行。此技术可减少无用存储单元收集期间的无用存储单元收集暂停时间和高速缓存的利用。0029 位于一个或多个较新代中的第一数据对象可被较旧代中的第二数据对象引用。该较旧代不包括在一个或多个较新代之内。因为仅对这一个或多个较新代执行无用存储单元收集,所以该引用可能丢失。如果发生这样的丢失,则可能错误地确定位于较新代中的第一数据对象为不可获得。经确定为不可。

24、获得的数据对象从存储器中被移除。因此,采取步骤以确定引用较新代中的数据对象的位于较旧代中的任何数据对象的地址。这些步骤作为分说 明 书CN 102985910 A4/13页8代无用存储单元收集技术的一部分来执行,并且随后被进一步描述。0030 在一个实施方案中,每个代被分成子区域。这些子区域可称为“卡”。在一个实施方案中,每个卡对应于其中所包含的数据对象的龄期。在一个实施方案中,无用存储单元收集算法可在位于较新代中的每个卡上运行。无用存储单元收集可仅在较旧代中的标记的卡上运行。在应用程序执行期间,在一个实施方案中,当确定卡包含指向位于一个或多个最新代中的另一个数据对象的数据对象时,可对该卡进行。

25、标记。在另一个实施方案中,当确定卡包含已修改的数据对象时,可对该卡进行标记。可能存在且可考虑其它卡标记条件。在一个实施方案中,在执行无用存储单元收集算法之前执行的预处理步骤可确定标记的卡的地址。随后,在算法中,执行步骤以确定引用较新代中的数据对象的位于较旧代中的任何数据对象的地址。0031 再参照图1,在一个实施方案中,当CPU 115检测到分代GC起始条件时,CPU 115可向GPU 170发送通知。响应于接收到该通知,GPU 170可计算地址。这些地址可对应于较旧代中的卡,这些代可能存储指向较新代中的卡的指针值。这些地址可称为根地址或卡根地址。0032 上述根地址的计算可为可高度并行化的任。

26、务。与CPU相比,GPU 170可更有效地执行可高度并行化的任务。此外,可执行GPU 170所执行的工作,同时CPU 115继续执行一个或多个软件应用程序。因此,执行用于获得根地址的计算步骤不会产生GC暂停。通过消除预处理步骤的GC暂停,可提高总体系统性能。下面将进一步描述用于执行这些预处理步骤的CPU 115与GPU 170之间的协议的更多细节。0033 在一个实施方案中,GPU 170可位于视频卡上。在另一个实施方案中,GPU170可集成于母板上。在又一个实施方案中,处理节点110的所述功能可包括在单个集成电路上。在该实施方案中,CPU 115和GPU 170可为来自不同设计中心的专有核心。

27、。另外,GPU 170现在可能能够经由来自处理节点110的存储器控制器120来直接访问本地存储器114和118以及主存储器,而非经由接口140在芯片外进行存储器访问。该实施方案可减少GPU 170的存储器访问的等待时间,这可转化成更高的性能。0034 继续描述图1中处理节点110的组件,高速缓存子系统114和118可包括被配置成存储数据块的高速缓存存储器。高速缓冲存储器子系统114可集成于相应处理器核心112内。或者,根据需要,高速缓冲存储器子系统114可耦接至后部高速缓存配置或内联配置中的处理器核心114。更进一步地,高速缓冲存储器子系统114可作为高速缓存的一个层次结构来实施。如果需要,更。

28、靠近处理器核心112(在层次结构内)定位的高速缓存可集成于处理器核心112中。在一个实施方案中,高速缓冲存储器子系统114各自均表示L2高速缓存结构,而共享高速缓存子系统118表示L3高速缓存结构。高速缓冲存储器子系统114和共享高速缓冲存储器子系统118均可包括耦接至相应高速缓存控制器的高速缓冲存储器。0035 一般来讲,包处理逻辑116被配置成对在处理节点110耦接到的链路上所接收的控制包作出响应、响应于处理器核心112和/或高速缓冲存储器子系统114来生成控制包、响应于存储器控制器120为服务所选择的事务来生成探测命令和响应包以及通过接口逻辑140将包路由到其它节点(对于这些包,节点11。

29、0为中间节点)。接口逻辑140可包括用以接收包且使这些包与包处理逻辑116所使用的内部时钟同步的逻辑。0036 参照图2,示出了总体进程地址空间200的一个实施方案。现代计算系统使用虚说 明 书CN 102985910 A5/13页9拟存储器,以便在多个进程之间共享较少量的物理存储器。地址空间200可为相连虚拟地址空间,其中虚拟地址和物理地址之间的映射确定了值210-250在物理存储器或磁盘中的位置。多处理器系统上可例如使处理节点110的资源的再现的操作系统可为软件应用程序分配存储器的区域。当编译软件应用程序时,应用程序可包括多个进程。在此实施方案中,每个进程均可在应用程序执行之前拥有其自身的。

30、资源,例如存储器的映像或者指令和数据的实例。另外,每个进程均可包含进程特定信息,例如处理代码、数据且可能处理堆和栈的地址空间;诸如栈指针、通用和浮点寄存器、程序计数器及其它等数据和控制寄存器中的变量;以及诸如stdin、stdout及其它等操作系统描述符,以及诸如处理器所有者和进程权限集合等安全属性。0037 一般而言,对于给定软件应用程序,操作系统的内核为该应用程序设置地址空间200,将该应用程序的代码210加载到存储器中,为该程序设置栈250,分支到应用程序代码210内的给定位置,并且开始应用程序代码210的执行。在一些实施方案中,并非所有代码210和数据220都需在开始执行之前存储于物理。

31、存储器中。软件应用程序如何使用指令集架构(ISA)受编译器与高级别语言的交互的影响。例如,对于软件应用程序的开发,需要知道如何分配变量和为其定址以及需要多少个寄存器来分配变量。在一个实施方案中,静态数据220、栈250和堆230确定数据分配。0038 静态数据220可用于分配静态声明的对象,例如全局变量和常量。大多数这些对象可为阵列。栈250可用于分配标量变量而非阵列,例如当前被调用的函数中的局部变量和参数。栈250可分别在过程调用或返回时增长和收缩。堆230可用于分配通过指针访问的动态对象,并且通常不为标量变量。堆230可用于通过在串/列表操作期间存储临时串或列表的内容来降低复制串和列表内容。

32、的频率。堆不受函数调用的返回的影响。0039 在源代码中示出栈250和堆230的使用的方法的一个简单示例如下:0040 0041 以上示例具有称为Students的类,并且Students类包括两个公共字段:name(名字)和score(分数)。Students类通过Classroom方法来访问。在Classroom方法中,创建了属于类型Students的名为jeff的对象。该对象的名字和分数字段被初始化。在一个说 明 书CN 102985910 A6/13页10实施方案中,在执行该代码示例之后,栈250包含调入例如图2中的条目252j的Classroom方法。对象jeff的条目可包括在图2中。

33、的条目252k中。对象jeff可不指向某个值,而是其可引用堆230中的对象232h。对象232h可存储为一个类或引用类型的Students对象。对象232h的字段234a可存储name字段值,而字段234b可存储score字段值。0042 在Classroom方法已完成执行之后,栈250可使条目252j出栈,因为该条目仅包含关于正在执行或将要执行的代码的信息。因为该示例中未剩下要执行的内容(其可表示整个应用程序的仅一部分),所以栈250可具有被调整为当前指向条目252i而非条目252j的栈指针。另一方面,堆仍然可包含对象232h的字段234a和234b中的数据。0043 随后,可执行无用存储单。

34、元收集算法,以便从堆230中清除未被引用的(未使用)的数据。例如,可从对象232h中移除上述Students类,因为它将不再被使用。在一个实施方案中,无用存储单元收集算法包括以下操作中的一个或多个:扫描系统存储器、标记所有可获得的数据对象(这可能需要递归搜索)、删除经确定为不可用或不可获得的数据对象以及移动数据对象以占用存储器中的相连位置。该最后一个步骤可称为压缩。0044 虽然未在上述示例中使用,但在图2中示出了在堆230中对象232b被对象232g中的指针引用。当执行无用存储单元收集以清除未使用的数据时,通过无用存储单元收集程序算法使有用数据仍保持在存储器中。在一些实施方案中,无用存储单元。

35、收集算法可产生需保留以供以后应用程序使用的数据对象的列表。该列表的产生可从根或根地址开始。根地址可对应于静态数据220中的静态全局指针、栈250中的指针以及由CPU中的存储器地址指向的堆230中的任何数据对象。在GC算法进行递归搜索期间,可确定对象232g为可获得的。在一个示例中,对象232b可由于被对象232g中的指针引用而可为可获得的。可获得的对象可被定义为通过根地址定位的对象或被此前确定为可获得的对象引用的对象。0045 在一个实施方案中,利用了周期性地执行无用存储单元收集的无用存储单元收集算法。一个周期开始于收集程序决定(或被通知)需要回收内存时。例如,当系统内存不足时,可启动无用存储。

36、单元收集。无用存储单元收集算法试图回收无用存储单元或绝不会被应用程序再次访问或改变的对象所使用的内存。可得出语法无用存储单元(程序不可能获得的数据对象)与语义无用存储单元(程序实际上绝不会再次使用的数据对象)之间的一个区别。访问存储器的软件线程可称为存取器(mutator)。已经开发出且可使用许多种不同的无用存储单元收集技术。0046 在一些情况下,无用存储单元收集系统通常经历了各种程度的过多暂停时间的问题。该问题出现在实时执行无用存储单元收集(即与运行于一个或多个处理器上的其它正在执行的程序的执行同时进行)时。例如,假定系统包含多个存取器线程和单个无用存储单元收集线程。如果这些存取器正被用于。

37、多媒体应用程序,则这些线程可能需要以某个速率来提供该应用程序,例如电影。不能承受可观的GC暂停时间的代价的一些关键应用程序的示例包括网上股票交易、电子商务应用程序以及多媒体应用程序(例如电影和视频游戏)。0047 现转向图3,示出了分区的存储器300的一个实施方案。分代无用存储单元收集(GC)可利用存储器中可分成代360a、360b、360c等的分配的堆230。在各个实施方案中,操作系统或其它软件可执行分区,并且确定代360a、360b和360c的大小。此外,代360a、360b和360c中的每个均可分成子区域。这些子区域可称为卡。例如,代360a可分成卡350a、350b、350f等。在一个实施方案中,卡350a、350b和350f中的每个均具有相同的固定大小,说 明 书CN 102985910 A10。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1