CN116701263B - 一种用于超级计算机的dma操作方法及系统 - Google Patents
一种用于超级计算机的dma操作方法及系统 Download PDFInfo
- Publication number
- CN116701263B CN116701263B CN202310952240.0A CN202310952240A CN116701263B CN 116701263 B CN116701263 B CN 116701263B CN 202310952240 A CN202310952240 A CN 202310952240A CN 116701263 B CN116701263 B CN 116701263B
- Authority
- CN
- China
- Prior art keywords
- data
- cache
- main memory
- data block
- target data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 46
- 238000003860 storage Methods 0.000 claims abstract description 38
- 238000009825 accumulation Methods 0.000 claims abstract description 37
- 238000013507 mapping Methods 0.000 claims description 11
- 238000012545 processing Methods 0.000 claims description 6
- 238000012546 transfer Methods 0.000 claims description 6
- 238000012423 maintenance Methods 0.000 abstract description 5
- 230000006870 function Effects 0.000 description 51
- 230000005540 biological transmission Effects 0.000 description 16
- 238000010586 diagram Methods 0.000 description 11
- 230000008569 process Effects 0.000 description 10
- 230000001133 acceleration Effects 0.000 description 7
- 238000010276 construction Methods 0.000 description 6
- 230000006872 improvement Effects 0.000 description 4
- 239000002699 waste material Substances 0.000 description 4
- 238000007667 floating Methods 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 230000006378 damage Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000011065 in-situ storage Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000013508 migration Methods 0.000 description 1
- 230000005012 migration Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000002054 transplantation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/14—Handling requests for interconnection or transfer
- G06F13/20—Handling requests for interconnection or transfer for access to input/output bus
- G06F13/28—Handling requests for interconnection or transfer for access to input/output bus using burst mode transfer, e.g. direct memory access DMA, cycle steal
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/40—Bus structure
- G06F13/4063—Device-to-bus coupling
- G06F13/4068—Electrical coupling
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明提出了一种用于超级计算机的DMA操作方法及系统,涉及DMA操作技术领域,在从核的局存中开辟Cache空间,将Cache空间与主核的主存空间按照预设数据块尺寸进行空间划分,建立主存数据块与Cache数据块之间多对一的对应关系;从核从Cache数据块读取目标数据;从核将对主存数据块中目标数据增量更新的数据加到Cache数据块的对应数据上;本发明设计DMA操作库,包含透明指针、自动读Cache、离散累加Cache等接口,不仅解决代码大量重复编写带来的后期维护问题,还引入高速缓存Cache的概念,解决大型数据不能一次性缓存到局存中带来的性能问题,提高系统的运行效率。
Description
技术领域
本发明属于DMA操作技术领域,尤其涉及一种用于超级计算机的DMA操作方法及系统。
背景技术
本部分的陈述仅仅是提供了与本发明相关的背景技术信息,不必然构成在先技术。
超级计算机的多核处理器每个核组通常包含1个主核和多个从核,从核可做加速计算使用,当从核在计算的时候,频繁去主核的主存存取数据是非常消耗时间的;图1是多核处理器SW26010的存储层次结构示意图,从图中可以看出从核以gld/gst方式访问主存延迟较大,而直接访问从核的局部存储的延迟就较小,所以充分利用从核的局部存储,可以缓解主存访问压力。
DMA(直接存储器访问),一种批量式访问主存的方式,用于在计算前将数据从主存缓存到从核的局部存储中,一定程度上避免时间的浪费,所以DMA在超级计算机的多核处理器并行编程中有着非常重要的应用。
现有通过DMA在主存和局部存储间读写数据,通用的方法是利用裸DMA接口dma_macros_new.h中的方法来实现,具体过程为:首先要调用dma_init()初始化DMA相关变量,调用pe_get(mem, ldm, size)将数据通过DMA从主存取到局存,即从主核的主存到从核的局部存储,调用pe_put(mem, ldm, size)将数据通过DMA从局存存到主存,最后调用dma_syn()等待发起的请求结束。
上述DMA过程存在两个问题:
(1)代码的大量重复编写,不利于后期的维护;现在需要进行显式的指令调用,对于复杂应用移植与开发来说,会带来巨大的工作量,例如,神威平台上的社区地球系统模型项目中从核代码调用DMA超过2000次,涉及的源码修改达10万行,这无论给程序优化还是调试都带来了巨大的人力浪费。
(2)大型数据不能一次性缓存到局存中带来的性能问题,对于大型的数据,由于局存空间的限制,无法一次性通过DMA缓存到局存中,这会增加处理器读写次数,降低系统性能。
发明内容
为克服上述现有技术的不足,本发明提供了一种用于超级计算机的DMA操作方法及系统,设计DMA操作库,包含透明指针、自动读Cache、离散累加Cache等接口,不仅解决代码大量重复编写带来的后期维护问题,还引入高速缓存Cache的概念,解决大型数据不能一次性缓存到局存中带来的性能问题,提高系统的运行效率。
为实现上述目的,本发明的一个或多个实施例提供了如下技术方案:
本发明第一方面提供了一种用于超级计算机的DMA操作方法。
一种用于超级计算机的DMA操作方法,包括:
在从核的局存中开辟Cache空间,将Cache空间与主核的主存中的数据空间按照预设数据块尺寸进行空间划分,分别得到多个Cache数据块和主存数据块,并建立主存数据块与Cache数据块之间多对一的对应关系,以Cache数据块作为对应主存数据块在从核上的数据缓存区;
从核读取目标数据时,通过自动读Cache接口,先从Cache数据块读取目标数据,没有命中则将目标数据所在的主存数据块,缓存到对应的Cache数据块中,再从Cache数据块读取;
从核增量更新目标数据时,通过离散累加Cache接口,先从Cache数据块查找目标数据,没有命中则将对应Cache数据块中的数据增量更新到主存中,然后将对应Cache数据块中的数据初始化为零,再将目标数据增量更新的数据加到Cache数据块的对应数据上。
进一步的,所述数据块,根据单映射规则,建立主存数据块与Cache数据块之间多对一的对应关系,主存数据块传输到Cache后,只能存储到对应的Cache数据块中;
每个Cache数据块,通过标签tag,记录当前存储的主存数据块号。
进一步的,所述命中,具体为:
获取目标数据在主存中的序号;
基于预设数据块尺寸,计算目标数据在主存中的数据块号mem_page;
通过主存数据块号mem_page,根据单映射规则,确定对应的Cache数据块号ldm_page;
从标签tag中,获取块号为ldm_page的Cache数据块中当前存储的主存数据块号;
判断主存数据块号mem_page与当前存储的主存数据块号是否一致,一致则命中,否则没有命中。
进一步的,所述自动读Cache接口的没有命中,处理步骤为:
将目标数据所在的主存数据块缓存到对应的Cache数据块中;
将Cache数据块的标签tag更新为当前存储的主存数据块号;
从对应的Cache数据块中读取目标数据。
进一步的,所述离散累加Cache接口中,Cache数据块存储的数据是给主存中的对应数据累加的值;
所述增量更新,是将Cache中的值加到对应的主存数据上。
进一步的,所述离散累加Cache接口的没有命中,处理步骤为:
将对应Cache数据块中的数据增量更新到主存中;
将对应Cache数据块中的数据初始化为零;
将Cache数据块的标签tag更新为当前存储的主存数据块号;
将目标数据增量更新的数据加到Cache数据块的对应数据上。
进一步的,还包括透明指针接口,用于在主核的主存和从核的局存之间进行目标数据的直接传输,实现从核对目标数据的读取和写回。
进一步的,所述透明指针接口,进行目标数据的读取,具体方法为:设定目标数据在主存中的起始地址、传输的数据个数和在局部存储中的存储地址,调用裸DMA接口中的数据读取方法,将目标数据传输到从核的局存中。
进一步的,所述透明指针接口,进行目标数据的写回,具体方法为:设定目标数据在局存中的存储地址、传输的数据个数和在主存中的存储地址,调用裸DMA接口中的数据写回方法,将更新后的目标数据传输到主核中。
本发明第二方面提供了一种用于超级计算机的DMA操作系统。
一种用于超级计算机的DMA操作系统,包括初始化模块、数据读取模块和数据更新模块:
初始化模块,被配置为:在从核的局存中开辟Cache空间,将Cache空间与主核的主存空间按照预设数据块尺寸进行空间划分,分别得到多个Cache数据块和主存数据块,并建立主存数据块与Cache数据块之间多对一的对应关系,以Cache数据块作为对应主存数据块在从核上的数据缓存区;
数据读取模块,被配置为:从核读取目标数据时,通过自动读Cache接口,先从Cache数据块读取目标数据,没有命中则将目标数据所在的主存数据块,缓存到对应的Cache数据块中,再从Cache数据块读取;
数据更新模块,被配置为:从核增量更新目标数据时,通过离散累加Cache接口,先从Cache数据块查找目标数据,没有命中则将对应Cache数据块中的数据增量更新到主存中,然后将对应Cache数据块中的数据初始化为零,再将目标数据增量更新的数据加到Cache数据块的对应数据上。
以上一个或多个技术方案存在以下有益效果:
本发明设计DMA操作库,包含透明指针、自动读Cache、离散累加Cache等接口,针对代码的大量重复编写,给程序优化还是调试都带来了巨大的人力浪费,将DMA封装在接口中,提高后期代码维护的效率。
本发明的自动读Cache接口、离散累加Cache接口,引入高速缓存Cache的概念,在主存和Cache之间传输目标数据对应数据块,通过提高Cache的命中率,解决大型数据不能一次性缓存到局存中、从核频繁对主存读写带来的系统性能问题,提高系统的运行效率。
本发明附加方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
构成本发明的一部分的说明书附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。
图1为SW26010的存储层次结构图。
图2为第一个实施例透明指针接口的成员函数架构图。
图3为第一个实施例应用于异步DMA的透明指针接口的成员函数架构图。
图4为第一个实施例自动读Cache接口的成员函数架构图。
图5为第一个实施例自动读Cache接口的读取数据过程图。
图6为第一个实施例离散累加Cache接口的成员函数架构图。
图7为第一个实施例离散累加Cache接口的写回过程图。
图8为第一个实施例窗口大小为64的随机访存序列示意图。
图9为第一个实施例窗口大小为256的随机序列示意图。
图10为第一个实施例自动读Cache接口加速比与Cache命中率的关系图。
图11为第一个实施例离散累加Cache接口加速比与Cache命中率的关系图。
具体实施方式
应该指出,以下详细说明都是例示性的,旨在对本申请提供进一步的说明。除非另有指明,本发明使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。
需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。
实施例一
在一个或多个实施方式中,公开了一种用于超级计算机的DMA操作方法,包括如下步骤:
在从核的局存中开辟Cache空间,将Cache空间与主核的主存空间按照预设数据块尺寸进行空间划分,分别得到多个Cache数据块和主存数据块,并建立主存数据块与Cache数据块之间多对一的对应关系,以Cache数据块作为对应主存数据块在从核上的数据缓存区;
从核读取目标数据时,通过自动读Cache接口,先从Cache数据块读取目标数据,没有命中则将目标数据所在的主存数据块,缓存到对应的Cache数据块中,再从Cache数据块读取;
从核增量更新目标数据时,通过离散累加Cache接口,先从Cache数据块查找目标数据,没有命中则将对应Cache数据块中的数据增量更新到主存中,然后将对应Cache数据块中的数据初始化为零,再将目标数据增量更新的数据加到Cache数据块的对应数据上。
下面以神威•太湖之光为例,对本实施例一种用于超级计算机的DMA操作方法的实现过程进行详细说明。
神威•太湖之光是世界上第一台峰值运算性能超过每秒十亿亿次浮点运算能力的超级计算机;它由国家并行计算机工程技术研究中心研制,计算系统全面采用了通过自主核心技术研制的SW26010众核处理器,是我国在探索科技创新的过程中的一项重大科研成果;神威•太湖之光也是我国首台全部采用国产处理器构建的世界排名第一的超级计算机。
神威•太湖之光的高速计算系统主要由SW26010处理器构成;在高速计算系统中一共有40960个运算节点,每个运算节点中就有一个SW26010处理器;一个处理器包含4个核组,每个核组由1个主核和64个从核构成;主核功能更强大,除了计算外,还可以进行消息通信和文件操作,从核一般只用于加速计算使用;主核浮点性能为23.2GFlops,主频为1.5GHz,四译码七发射,每核组内存8GB,L1cache大小为32KB,L2cache(数据cache和指令cache混合)大小为256KB;从核浮点性能为742.4GFlops,主频为1.5GHz,每个从核有一个64KB的局部存储LDM。从核可通过gld/gst(global load/store)离散访主存,也可以通过DMA(Direct Memory Access,直接内存访问)批量式访主存,从核阵列之间可以采用寄存器通信方式进行通信。
从图1中可以看到,从核访问局部存储LDM比直接访问主存所需的时间要少,所以对于在神威·太湖之光上移植或开发的应用程序,往往会面临如何充分利用从核局部存储LDM,以提升程序整体性能的问题;而DMA在神威的并行编程中有着非常重要的应用,如果不能通过DMA方式充分利用从核局部存储LDM,那么程序的运行速度就会比较慢;并且DMA需要软件进行显式的指令调用,对于复杂应用移植与开发来说,会带来巨大的工作量;而且对于短时间内频繁使用的数据,需要在主存和局存之间频繁传输数据,这无疑增加了处理器的读写次数,降低了系统的系统。
对于利用sw5g++的从核C++编程来说,目前缺乏一个通用的DMA操作方法来简化编程和提升程序整体性能,本实施例提供一个便捷高效的DMA相关操作库,实现神威·太湖之光上的高效并行编程,解决代码大量重复编写带来的后期维护问题,解决同一数据在短时间内频繁传输导致的系统性能问题,提高系统的运行效率。
DMA相关操作库包括三个接口:透明指针接口、自动读Cache接口和离散累加Cache接口,实现从核对目标数据的读取和更新,三个接口都是基于DMA传输实现,区别在于透明指针接口是在主核主存和从核局部存储之间传输数据,而自动读Cache接口和离散累加Cache接口是在主核主存和从核Cache之间传输目标数据对应的数据块,下面对三个接口进行详细说明。
一、透明指针接口
透明指针接口,通过DMA在主核主存和从核局部存储之间传输数据,进行数据的读取和写回,包括两个操作:(1)将主存中的数据通过DMA传输到局部存储LDM中,进行数据的读取;(2)将局部存储LDM中的数据通过DMA传输到主存,进行数据的写回。
具体的,透明指针接口主要是实现将主存中的数据通过DMA传输到局存和将局存中的数据通过DMA传输到主存,通过调用这个接口,可以避免从核通过gld/gst指令直接对主存进行访问,在需要密集访存的情况下带来明显的性能提升。
设计一个MemPtr类来实现透明指针接口,在这个类中,利用构造函数将主存中的数据通过DMA读入局存,利用析构函数将局存中的数据通过DMA读入主存,同时重载 [] 使得可以像数组一样通过索引读取数据,这个类的成员变量和成员函数如表1和图2所示:
表1 透明指针接口的成员变量表
在成员变量中,数组buffer[COUNT]代表目标数据在局部存储LDM中存储的空间,即在局部存储中的存储地址,指针mem代表目标数据在主存中的起始地址,count代表传输的数据个数,即目标数据的大小。
考虑到与sw5g++的从核C++编程的适用性,选择利用神威上的裸DMA接口dma_macros_new.h中的方法来实现,dma_macros_new.h提供的方法有dma_init、pe_get、pe_put、pe_getn、pe_putn、dma_syn等。dma_init()初始化DMA相关变量,数据读取方法pe_get(mem, ldm, size) 发起从mem取size字节到ldm的异步请求,数据写回方法pe_put(mem,ldm, size) 发起从ldm存size字节到mem的异步请求,dma_syn()等待发起的所有异步请求结束。
透明指针接口的MemPtr类包括三个成员函数:构造函数、析构函数和对[]的重载函数。
构造函数:完成DMA初始化和通过DMA将主存中的目标数据读入局部存储LDM中,具体为:
先调用dma_init()初始化DMA相关变量,再调用数据读取方法pe_get(mem,buffer, sizeof(DataType) * count)将从主存中的起始地址mem开始的count个数据读入到LDM中存储数据的空间buffer中,最后调用dma_syn()等待数据传输结束。
析构函数:通过DMA将LDM中的数据写回主存,与构造函数的实现方法类似,具体为:
先调用dma_init()初始化DMA相关变量,再调用数据写回方法pe_put(mem,buffer, sizeof(DataType) * count)将LDM中存储数据的空间buffer中的count个数据写回到主存中的起始地址mem,最后调用dma_syn()等待数据传输结束。
对[]的重载函数:在对[]的重载函数中实现数据的索引项index,通过buffer中目标数据的索引项index,像数组一样访问目标数据。
在此基础上,还设计了应用于异步DMA的透明指针接口,实现在数据通过DMA传输时,不需要原地等待数据传输完成,而是去完成其他任务,例如数据计算等,其他任务完成后再进行目标数据的传输,充分利用时间资源,进一步提高了效率。
设计一个MemPtrAsync类来实现应用于异步DMA的透明指针接口, 透明指针接口的MemPtr类在数据传输时需要在原地等待数据传输完成,这样会造成一定程度上时间的浪费,为了充分利用这段等待的时间,在MemPtr类的基础上再设计一个MemPtrAsync类。MemPtrAsync类能够实现异步的DMA传输,提高资源的利用率;MemPtrAsync类的成员变量和成员函数如表2和图3所示:
表2 应用于异步DMA的透明指针接口的成员变量表
在成员变量中,数组buffer[COUNT]代表目标数据在LDM中存储的空间,即在局部存储中的存储地址,指针mem代表目标数据在主存中的起始地址,count代表传输的数据个数,即目标数据的大小。和MemPtr类相比,MemPtrAsync类多了两个成员变量reply和nreq,其中,reply表示完成数据传输的次数,nreq表示调用传输请求的次数。当reply和nreq相等,即调用传输请求的次数和完成数据传输的次数相等时,代表数据传输完成。
应用于异步DMA的MemPtrAsync类包括五个成员函数:sync函数、构造函数、flush函数、析构函数和对[]的重载函数。
sync函数:由于是异步DMA,所以和MemPtr类相比,多了一个sync函数用来判断数据传输是否结束;sync函数通过一个while来完成,在while中循环判断reply和nreq是否相等,当reply和nreq相等时就可以退出循环,代表数据传输完成。
构造函数:对于应用于异步DMA的透明指针接口,不能再简单调用裸DMA接口dma_macros_new.h中现成的数据读取方法pe_get和数据写回方法pe_put进行数据传输,因为pe_get和pe_put无法根据数据传输情况对完成数据传输的次数reply的值进行修改,解决方案是在裸DMA接口dma_macros_new.h中添加两个函数pe_get_rpl和pe_put_rpl,这两个函数多了一个参数rpl,传输时将reply传入,传输完成时可以将reply加一;除此之外,还需要添加一个dma_set_rpl函数用来设置初始值。
在构造函数中完成初始化和通过DMA将主存中的目标数据读入局部内存LDM;和MemPtr类不同的是,在构造函数中并不保证数据传输完成;在构造函数中,使reply和nreq初始化为0,并使nreq加一,读取目标数据时,首先调用dma_init()进行初始化,接着调用dma_set_rpl(reply)设置初始值,最后调用pe_get_rpl(mem, buffer, sizeof(DataType)* count, reply)将从主存起始地址mem开始的count个数据读入buffer。
flush函数:在flush函数中完成将LDM中的数据通过DMA写回主存;和通过DMA将数据读入LDM的过程类似,先使nreq加一,再调用dma_init()进行初始化,接着调用dma_set_rpl(reply)设置初始值,最后调用pe_put_rpl(mem, buffer, sizeof(DataType) *count, reply)发起DMA将buffer中的count个元素写回主存。
析构函数:在析构函数中需要确保对象能够安全销毁,因此需要在析构函数中调用sync函数确保数据已经全部传输完成。
对[]的重载函数:在对[]的重载函数中实现数据的索引项index,通过buffer中目标数据的索引项index,像一个数组一样访问目标数据。
二、自动读Cache接口
在局部存储LDM中实现一个单映射的读Cache,相比于透明指针接口,引入高速缓存Cache,增加对数据缓存的能力,对于局部性较好的访存序列,下一次访问的数据很可能已经在Cache中,这样就可以大幅减少访问主存的次数,提高程序运行速度。
由于从核以gld/gst方式访问主存延迟较大,直接访问局存的延迟就较小,为了缓解高速的从核和低速的主存之间的速度差异,在局部存储LDM中开辟一块Cache空间存储来自主存的部分数据,这块空间相对于主存的数据来说容量较小,以数据块为单位,将目标数据所在的数据块从主核主存传输到从核局存Cache中,读取目标数据时,先从Cache中读取,Cache中找不到目标数据时,再将目标数据所在的数据块缓存在Cache中,通过提高Cache的命中率,从而提高系统的性能。
具体的,将主核上的主存空间和从核上的Cache空间划分为大小相同的多个数据块,也就是页,Cache页和主存页的大小相等。主存中的每个页会根据单映射规则被映射到Cache中的一个页,由于Cache的大小小于主存的大小,所以会有多个主存页被映射到同一个Cache页中,建立主存页与Cache页之间多对一的对应关系,因此每个Cache页都会有一个标签tag,用来记录当前存储的主存页号。当从核需要读主存中的数据时,自动读Cache接口会先通过标签tag的值,判断目标数据是否已经在Cache中,即是否命中,如果命中的话,则直接从Cache中读取,如果没有命中就将目标数据所在的页从主存中传输到对应的Cache数据块中。对于局部性较好的访存序列,下一次访问的数据很可能因为所在页的传输,已经在Cache中,这样就可以大幅减少访问主存的次数,提高程序运行速度。
通过设计一个ReadOnlyCache类来实现自动读Cache接口,这个类的成员变量和成员函数分别如表3和图4所示:
表3 自动读Cache接口的成员变量表
在成员变量中,二维数组cache[NPAGES][PAGESIZE]代表从核上的Cache空间,这个Cache共有NPAGES个页,每个页的大小为PAGESIZE。数组tags[NPAGES]用来标记Cache中每一个页当前存储主存的哪一个页,tags数组中的第i项记录了Cache的第i个页存储的数据在主存中的页号,如果该页还没有存储主存中的数据就记为-1;指针mem代表数据在主存中的起始地址。
自动读Cache接口的ReadOnlyCache类包括两个成员函数:构造函数和对[]的重载函数。
构造函数:在构造函数中完成初始化,主要是初始化目标数据的主存起始地址mem并将tags数组中的所有项初始化为-1,代表Cache中还没有存储数据。
对[]的重载函数:在对[]的重载函数中实现读取主存中数据的第index项。
图5是自动读Cache接口的读取数据过程,如图5所示,如果要读取的目标数据是主存中第index项数据,那么先找到该项数据对应的主存页号mem_page = index /PAGESIZE。对于mem_page的主存页,其对应的Cache页号为 ldm_page = mem_page %NPAGES。接下来检查tags[ldm_page] 即Cache页号ldm_page对应的标签tag是否匹配主存页号mem_page,如果不匹配则通过DMA从主存中将mem_page主存页的全部数据传输到ldm_page的Cache页中,并将tags[ldm_page]的值更新为mem_page。这个时候主存中数据的第index项所在的页已经被读取到Cache中,所以只需返回Cache中目标数据对应的第index项,即cache[ldm_page][index % PAGESIZE]的引用,即可读取目标数据。
三、离散累加Cache接口
在局部存储LDM中实现一个单映射的写Cache,主要应用于需要对主存中的数据进行更新的情况,这里的数据更新,采用对主存中的数据累加新值的方式实现;和自动读Cache接口不同的是,离散累加Cache接口不能读出主存中的完整数据,而是将Cache中的数据累加到主存中对应的数据上。对于局部性较好的访存序列,这个接口能解决频繁访问主存的问题,带来极大的性能提升。
具体的,离散累加Cache接口和自动读Cache接口实现的Cache类似,不同之处在于自动读Cache接口解决的是从主存中读取数据的需求,离散累加Cache接口解决的是更新主存中数据的需求。自动读Cache接口能将主存中的数据读到Cache中,而离散累加Cache接口不是读出主存中的数据,离散累加Cache接口中的Cache存储的是给主存中的对应数据累加的值,之后再将Cache中的值写回,也就是将Cache中的值加到对应的主存页数据上。如果需要给主存中数据累加新值,在没有离散累加Cache接口的情况下,每一次更新从核都需要访问一次主存,当有大量更新需求的时候,这种方式就会严重影响整个程序的性能。
通过调用这个离散累加Cache接口,每次需要给主存中某个数据累加新值的时候,会先判断该目标数据所在的主存页号和对应的Cache页的标签tag是否匹配,如果匹配代表该Cache页存储的就是该主存页累加的值,这个时候只需要将累加的值加到该Cache页中对应的数据项上;如果不匹配代表该Cache页存储的是给其他主存页累加的值,这时需要将该Cache页的数据加到对应的主存页数据上,之后再将该Cache页所有项数据赋为0,并把该Cache页的tag更改为需要累加的数据所在的主存页的块号,代表此时该Cache页存储的已经是给需要累加的数据所在的主存页累加的值,然后再将需要累加的值加到该Cache页中对应的数据项上即可。因此,这个接口能缓解频繁访问主存的问题,带来极大的性能提升。
通过设计两个类DefaultUpdateConf和UpdateCache来实现离散累加Cache接口,具体为:
首先定义一个DefaultUpdateConf类,代表更新的方式,在这个类中实现“赋 0”和“更新”两种操作的函数,以应对更为普遍的数值类型累加。
然后再设计UpdateCache类用于更新Cache,UpdateConf是一个模板类,可以把DefaultUpdateConf类赋给UpdateConf,这样数据更新的方式就是在DefaultUpdateConf类中的定义的方式,这个类的成员变量和成员函数分别如表4和图6所示:
表4 UpdateCache类的成员变量表
在成员变量中,二维数组cache[NPAGES][PAGESIZE]代表从核上的Cache空间,这个Cache共有NPAGES个页,每个页的大小为PAGESIZE。数组tags[NPAGES]用来标记Cache中每一个页当前存储主存的哪一个页,tags数组中的第i项记录了Cache的第i个页存储的数据在主存中的页号,如果该页还没有存储主存中的数据就记为-1;指针mem代表数据在主存中的起始地址。conf代表数据更新的方式;为了避免冲突的并行更新,需要利用锁行的方式,成员变量中的指针locks就是为了避免冲突建立的锁空间地址。它的类型cal_lock_t类型是神威上提供的接口cal.h中的原子锁数据类型,应初始化为{x,x}(任意两个相等整数)。cal.h接口中还提供了一些方法包括cal_lock(cal_lock_t *lock)对一个锁变量加锁、cal_unlock(cal_lock_t *lock)对一个锁变量解锁等,还有一个成员变量size_t类型的length代表主存中数据的长度。
离散累加Cache接口的UpdateCache类包括四个成员函数:构造函数、对[]的重载函数、flush函数和析构函数。
构造函数:完成初始化工作,首先初始化成员变量mem、length、conf的值,并将标签tags数组中的所有项初始化为-1;之后需要给锁空间地址locks分配内存,为了使从核之间能够共享这段空间,需要在主核程序中建立锁空间再将这段空间的地址传到从核中,由构造函数将地址赋给locks;因为要保证从核之间对主存中每个页的操作都是互斥的,所以要建立的锁的空间的大小应该是主存的页数。
对[]的重载函数:实现在对主存中数据累加新值之前对Cache的操作,在对主存中某个数据进行累加操作之前,需要先根据单映射Cache的映射方式判断是否命中(即该数据所在的主存页和通过单映射方式映射到的Cache页的tag是否匹配),如果命中就返回Cache中对应的数据项,如果不命中就需要把即将被覆盖的Cache页写回,然后再返回Cache中对应的数据。如果要给主存中的第index项数据累加新值,在这个函数中,首先找到第index项数据所在的主存页号mem_page = index / PAGESIZE。对于主存页号为mem_page的主存页,其通过单映射方式映射到的Cache页号为 ldm_page = mem_page % NPAGES;检查 tags[ldm_page]是否匹配 mem_page,如果不匹配则不命中;不命中的情况需要把数据写回,即把Cache中的数据累加到对应的主存数据上。
写回的过程如图7所示,首先在LDM中开辟临时数组tmp[PAGESIZE],这个数组存储从主存传过来的主存对应页的数据。为了防止从核同时从主存取数据并写回造成数据错误,需要对这部分流程加锁。利用cal_lock(locks + mem_page)给locks[mem_page]加锁,之后通过DMA将该页的主存数据取到tmp,并将tmp和对应Cache行的数据累加,再通过DMA将tmp中的数据写回到对应的主存地址。其中,如果是主存的最后一页写回,还需要考虑到数据的实际长度。根据数据的length得到最后一页的页码last_page = (length - 1) /PAGESIZE,当mem_page = last_page时,写回的数据长度是实际的数据长度。完成这一系列步骤后,就可以利用cal_unlock(locks + mem_page)给locks[mem_page]解锁。之后,还要将对应的Cache页的数据初始化,即将该页的所有项填0。并且tags[ldm_page]也要改为ldm_page。最后返回Cache中对应主存数据第index项的元素的引用,通过对Cache中该项数据累加实现对主存中第index项数据的累加。为了对Cache中的该项进行累加操作,利用一个结构体Ref将该项元素的引用包装起来,在这个结构体中还包含了更新的方式conf,实现了对“+=”的运算符重载函数。函数最后的返回结果就是包装了Cache中该项元素引用的结构体Ref,对返回结果通过“+=”运算符实现累加。
flush函数:将Cache中累加的数据写回主存,该函数遍历Cache的每一个页,如果tag不为-1,就将该页的数据写回主存,写回的过程依然如图7所示,对于Cache中的任意第i页,在LDM中开辟临时数组tmp[PAGESIZE],接着用cal_lock(locks + tags[i])对该Cache页对应的主存页的操作加锁,然后将该主存页的主存数据取到tmp,并将tmp和对应Cache行的数据累加,再将tmp中的数据写回到对应的主存地址。这里也需要注意主存最后一页写回时的实际长度。完成这些之后就可以用cal_unlock(locks + tags[i])对对应的主存页的操作解锁。最后还要将被写回的页的tag置-1。
析构函数:完成对象销毁之前的准备工作,就是把Cache中累加的数据都写回主存,通过在析构函数中调用flush函数来实现。
测试使用自动读Cache接口和离散累加Cache接口相对完全gld/gst访存的加速比;由于不同的Cache命中率对加速比可能产生较大的影响,设置一个窗口,代表上次访存的位置周围的一片区域,这片区域有固定大小,每一次访存的位置都在上次访存的位置的窗口之内;随机生成窗口大小为64、128、256、512、1024和完全随机的访存序列,选择窗口大小为64和256的随机序列绘制散点图如图8和图9所示。
当窗口大小为64时,Cache命中率为98.99%;当窗口大小为128时,Cache命中率为96.12%;当窗口大小为256时,Cache命中率为86.33%;当窗口大小为512时,Cache命中率为62.08%;当窗口大小为1024时,Cache命中率为35.30%。当序列完全随机时,Cache命中率为12.53%。
对于自动读Cache接口,加速比和Cache命中率的关系如图10所示,从图中可以看出,当Cache命中率较高时,使用接口能将加速比提升至2倍以上;但Cache命中率较低时,使用接口可能并不能起到加速的效果,反而还会延长运行时间。因此,对于局部性较好的访存序列,使用自动读Cache接口能起到比较好的效果。
对于离散累加Cache接口,加速比和Cache命中率的关系如图11所示,从图中可以看出,相比于自动读Cache接口,当Cache命中率较高时,离散累加Cache接口的加速比更高,效率提升更明显,但同时离散累加Cache接口对Cache命中率的要求也更高,当Cache命中率下降时,离散累加Cache接口的加速比下降得更为明显。
实施例二
在一个或多个实施例中,公开了一种用于超级计算机的DMA操作系统,包括初始化模块、数据读取模块和数据更新模块:
初始化模块,被配置为:在从核的局存中开辟Cache空间,将Cache空间与主核的主存空间按照预设数据块尺寸进行空间划分,分别得到多个Cache数据块和主存数据块,并建立主存数据块与Cache数据块之间多对一的对应关系,以Cache数据块作为对应主存数据块在从核上的数据缓存区;
数据读取模块,被配置为:从核读取目标数据时,通过自动读Cache接口,先从Cache数据块读取目标数据,没有命中则将目标数据所在的主存数据块,缓存到对应的Cache数据块中,再从Cache数据块读取;
数据更新模块,被配置为:从核增量更新目标数据时,通过离散累加Cache接口,先从Cache数据块查找目标数据,没有命中则将对应Cache数据块中的数据增量更新到主存中,然后将对应Cache数据块中的数据初始化为零,再将目标数据增量更新的数据加到Cache数据块的对应数据上。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (7)
1.一种用于超级计算机的DMA操作方法,其特征在于,包括:
在从核的局存中开辟Cache空间,将Cache空间与主核的主存空间按照预设数据块尺寸进行空间划分,分别得到多个Cache数据块和主存数据块,并建立主存数据块与Cache数据块之间多对一的对应关系,以Cache数据块作为对应主存数据块在从核上的数据缓存区,具体为:所述数据块,根据单映射规则,建立主存数据块与Cache数据块之间多对一的对应关系,主存数据块传输到Cache后,只能存储到对应的Cache数据块中;
每个Cache数据块,通过标签tag,记录当前存储的主存数据块号;
从核读取目标数据时,通过自动读Cache接口,先从Cache数据块读取目标数据,没有命中则将目标数据所在的主存数据块,缓存到对应的Cache数据块中,再从Cache数据块读取,具体为:所述自动读Cache接口的没有命中,处理步骤为:
将目标数据所在的主存数据块缓存到对应的Cache数据块中;
将Cache数据块的标签tag更新为当前存储的主存数据块号;
从对应的Cache数据块中读取目标数据;
从核增量更新目标数据时,通过离散累加Cache接口,先从Cache数据块查找目标数据,没有命中则将对应Cache数据块中的数据增量更新到主存中,然后将对应Cache数据块中的数据初始化为零,再将目标数据增量更新的数据加到Cache数据块的对应数据上,具体为:所述离散累加Cache接口的没有命中,处理步骤为:
将对应Cache数据块中的数据增量更新到主存中;
将对应Cache数据块中的数据初始化为零;
将Cache数据块的标签tag更新为当前存储的主存数据块号;
将目标数据增量更新的数据加到Cache数据块的对应数据上。
2.如权利要求1所述的一种用于超级计算机的DMA操作方法,其特征在于,所述命中,具体为:
获取目标数据在主存中的序号;
基于预设数据块尺寸,计算目标数据在主存中的数据块号mem_page;
通过主存数据块号mem_page,根据单映射规则,确定对应的Cache数据块号ldm_page;
从标签tag中,获取块号为ldm_page的Cache数据块中当前存储的主存数据块号;
判断主存数据块号mem_page与当前存储的主存数据块号是否一致,一致则命中,否则没有命中。
3.如权利要求1所述的一种用于超级计算机的DMA操作方法,其特征在于,所述离散累加Cache接口中,Cache数据块存储的数据是给主存中的对应数据累加的值;
所述增量更新,是将Cache中的值加到对应的主存数据上。
4.如权利要求1所述的一种用于超级计算机的DMA操作方法,其特征在于,还包括透明指针接口,用于在主核的主存和从核的局存之间进行目标数据的直接传输,实现从核对目标数据的读取和写回。
5.如权利要求4所述的一种用于超级计算机的DMA操作方法,其特征在于,所述透明指针接口,进行目标数据的读取,具体方法为:设定目标数据在主存中的起始地址、传输的数据个数和在局部存储中的存储地址,调用裸DMA接口中的数据读取方法,将目标数据传输到从核的局存中。
6.如权利要求4所述的一种用于超级计算机的DMA操作方法,其特征在于,所述透明指针接口,进行目标数据的更新,具体方法为:设定目标数据在局存中的存储地址、传输的数据个数和在主存中的存储地址,调用裸DMA接口中的数据写回方法,将更新后的目标数据传输到主核中。
7.一种用于超级计算机的DMA操作系统,其特征在于,包括初始化模块、数据读取模块和数据更新模块:
初始化模块,被配置为:在从核的局存中开辟Cache空间,将Cache空间与主核的主存空间按照预设数据块尺寸进行空间划分,分别得到多个Cache数据块和主存数据块,并建立主存数据块与Cache数据块之间多对一的对应关系,以Cache数据块作为对应主存数据块在从核上的数据缓存区,具体为:所述数据块,根据单映射规则,建立主存数据块与Cache数据块之间多对一的对应关系,主存数据块传输到Cache后,只能存储到对应的Cache数据块中;
每个Cache数据块,通过标签tag,记录当前存储的主存数据块号;
数据读取模块,被配置为:从核读取目标数据时,通过自动读Cache接口,先从Cache数据块读取目标数据,没有命中则将目标数据所在的主存数据块,缓存到对应的Cache数据块中,再从Cache数据块读取,具体为:所述自动读Cache接口的没有命中,处理步骤为:
将目标数据所在的主存数据块缓存到对应的Cache数据块中;
将Cache数据块的标签tag更新为当前存储的主存数据块号;
从对应的Cache数据块中读取目标数据;
数据更新模块,被配置为:从核增量更新目标数据时,通过离散累加Cache接口,先从Cache数据块查找目标数据,没有命中则将对应Cache数据块中的数据增量更新到主存中,然后将对应Cache数据块中的数据初始化为零,再将目标数据增量更新的数据加到Cache数据块的对应数据上,具体为:所述离散累加Cache接口的没有命中,处理步骤为:
将对应Cache数据块中的数据增量更新到主存中;
将对应Cache数据块中的数据初始化为零;
将Cache数据块的标签tag更新为当前存储的主存数据块号;
将目标数据增量更新的数据加到Cache数据块的对应数据上。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310952240.0A CN116701263B (zh) | 2023-08-01 | 2023-08-01 | 一种用于超级计算机的dma操作方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310952240.0A CN116701263B (zh) | 2023-08-01 | 2023-08-01 | 一种用于超级计算机的dma操作方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116701263A CN116701263A (zh) | 2023-09-05 |
CN116701263B true CN116701263B (zh) | 2023-12-19 |
Family
ID=87839536
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310952240.0A Active CN116701263B (zh) | 2023-08-01 | 2023-08-01 | 一种用于超级计算机的dma操作方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116701263B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6792508B1 (en) * | 1999-12-06 | 2004-09-14 | Texas Instruments Incorporated | Cache with multiple fill modes |
WO2020106626A1 (en) * | 2018-11-19 | 2020-05-28 | Fungible, Inc. | History-based compression pipeline for data compression accelerator of a data processing unit |
CN111429974A (zh) * | 2020-03-24 | 2020-07-17 | 山东大学 | 超级计算机平台上的分子动力学模拟短程力并行优化方法 |
CN112306678A (zh) * | 2020-10-22 | 2021-02-02 | 中国海洋大学 | 一种基于异构众核处理器的算法并行处理方法及系统 |
CN112463711A (zh) * | 2020-12-11 | 2021-03-09 | 北京航空航天大学 | 一种针对众核处理器的从核软件缓存共享方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9086973B2 (en) * | 2009-06-09 | 2015-07-21 | Hyperion Core, Inc. | System and method for a cache in a multi-core processor |
US20170371660A1 (en) * | 2016-06-23 | 2017-12-28 | Microsoft Technology Licensing, Llc | Load-store queue for multiple processor cores |
-
2023
- 2023-08-01 CN CN202310952240.0A patent/CN116701263B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6792508B1 (en) * | 1999-12-06 | 2004-09-14 | Texas Instruments Incorporated | Cache with multiple fill modes |
WO2020106626A1 (en) * | 2018-11-19 | 2020-05-28 | Fungible, Inc. | History-based compression pipeline for data compression accelerator of a data processing unit |
CN111429974A (zh) * | 2020-03-24 | 2020-07-17 | 山东大学 | 超级计算机平台上的分子动力学模拟短程力并行优化方法 |
CN112306678A (zh) * | 2020-10-22 | 2021-02-02 | 中国海洋大学 | 一种基于异构众核处理器的算法并行处理方法及系统 |
CN112463711A (zh) * | 2020-12-11 | 2021-03-09 | 北京航空航天大学 | 一种针对众核处理器的从核软件缓存共享方法 |
Non-Patent Citations (2)
Title |
---|
"神威・太湖之光"上Tend_lin并行优化;傅游;王坦;郭强;高希然;;山东科技大学学报(自然科学版)(第02期);全文 * |
太湖之光上利用OpenACC移植和优化GTC-P;王一超;林新华;蔡林金;Tang William;Ethier Stephane;王蓓;施忠伟;松岗聪;;计算机研究与发展(第04期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN116701263A (zh) | 2023-09-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5819304A (en) | Random access memory assembly | |
US5692185A (en) | Object space manager method and circuit | |
US7512745B2 (en) | Method for garbage collection in heterogeneous multiprocessor systems | |
US6785888B1 (en) | Memory allocator for a multiprocessor computer system | |
US8312219B2 (en) | Hybrid caching techniques and garbage collection using hybrid caching techniques | |
US8316190B2 (en) | Computer architecture and method of operation for multi-computer distributed processing having redundant array of independent systems with replicated memory and code striping | |
US5946711A (en) | System for locking data in a shared cache | |
US5237673A (en) | Memory management method for coupled memory multiprocessor systems | |
US6671707B1 (en) | Method for practical concurrent copying garbage collection offering minimal thread block times | |
CN100573477C (zh) | 管理锁定的高速缓冲存储器中的组替换的系统和方法 | |
US9513886B2 (en) | Heap data management for limited local memory(LLM) multi-core processors | |
US9268698B1 (en) | Method and system for maintaining context event logs without locking in virtual machine | |
US7389506B1 (en) | Selecting processor configuration based on thread usage in a multiprocessor system | |
EP2017730A1 (en) | System and method for storing programmatic modules | |
US7065763B1 (en) | Method of reducing contention of a highly contended lock protecting multiple data items | |
Siebert | Hard real-time garbage collection in the Jamaica Virtual Machine | |
US11620215B2 (en) | Multi-threaded pause-less replicating garbage collection | |
CN102566970B (zh) | 用于处理具有高速缓存旁路的修饰指令的数据处理器 | |
US20200183842A1 (en) | Tracking transactions using extended memory features | |
CN107562806B (zh) | 混合内存文件系统的自适应感知加速方法及系统 | |
JPH1115735A (ja) | 不均一アクセスメモリ及びキャッシュメモリコヒーレンスを有する情報処理マシン | |
US7398368B2 (en) | Atomic operation involving processors with different memory transfer operation sizes | |
CN116701263B (zh) | 一种用于超级计算机的dma操作方法及系统 | |
CN113138859A (zh) | 一种基于共享内存池的通用数据存储方法 | |
CN112346879B (zh) | 进程管理方法、装置、计算机设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |