一种计算机硬件的可拓展和性能可移植的多维数组库实现方法

文档序号:29360526发布日期:2022-03-23 01:18阅读:109来源:国知局
一种计算机硬件的可拓展和性能可移植的多维数组库实现方法

1.本发明涉及跨硬件平台的计算机技术领域,具体涉及一种计算机硬件的可拓展和性能可移植的多维数组库实现方法。


背景技术:

2.在如今的并行计算机中,计算机的发展呈现多样性,其中包括多核cpu、众核cpu、加速卡等。众核处理器引入了非统一内存访问体系结构(numa),如intel cpu和amd cpu等。为了加速深度学习的训练速度,不同硬件厂家提出了不同的加速卡,其中包含国外的nvidia gpu和国内的昇腾910(ascend910)等。ascend910是华为科技有限公司开发的用于加速深度学习训练的芯片,其基于达芬奇架构,而且具有完善的芯片算子库和高度自动化算子开发工具cann,有着高算力低功耗等优点。众核cpu和加速卡在运行性能和能源消耗上有着很大的改进。然而由于这些设备具有不同的编程模型、应用程序编程接口(api)、性能要求。给开发者也带来了很大的挑战,开发者需要学习不同的硬件体系结构和编程接口(api),来达到性能最大化。同时numa架构在众多场景中对于算法性能的影响越来越明显,越来越多的算法基于numa来进行算法优化,开发者需要使用numa api进行编程实践,而学习不同的api和适配不同的硬件架构需要花费开发者大量精力。
3.众多算法代码都会使用大量时间来计算和处理数据,然而在不同的编程语言中数据一般均是通过数组(array)的方式来进行存储的,其中包括标量运算、向量计算、矩阵计算等,均可以在计算机中使用多维数组的方式来进行存储。为了达到更佳的性能,开发者往往会花费大量的时间来让array存储的相关运算更加快速。然而不同的硬件平台有着不同的实现细节,为了达到最佳的性能,往往跟计算机硬件平台的体系结构、运行时环境、使用的编程语言密切相关。开发者需要将特定的体系结构和编程模型的底层实现混合到具体的算法中。这使得在不同的体系结构之间移植代码变得困难,算法性能也会大打折扣,很难做到性能可移植。


技术实现要素:

4.针对现有技术的不足,本发明旨在提供一种计算机硬件的可拓展和性能可移植的多维数组库实现方法,以国产硬件平台包含鲲鹏920和昇腾910(ascend910)为基础,针对不同的硬件平台和编程接口,目标是提供一种跨硬件解决方案的高可拓展性和性能可移植性的多维array库实现,同时支持数组的常见操作,包含深拷贝、浅拷贝、元素复制传输、内存自动申请与释放、用户自定义数组layout等。同时也兼容支持国外硬件平台包括intel cpu、nvidia gpu。
5.为了实现上述目的,本发明采用如下技术方案:
6.一种计算机硬件的可拓展和性能可移植的多维数组库实现方法,针对不同的硬件平台进行分析,结合不同平台的编程语言模型或者编程库,使用c++模板元编程集成封装;
其中,其中,包括基于arm架构的鲲鹏920的支持numa架构的多维array、基于昇腾910加速卡的支持异构计算架构cann的多维array、基于intel cpu和nvidia gpu编程模型为cuda的多维array;提供array库常见的基本操作。
7.需要说明的是,所述array常见的操作包含基于引用技术的自动内存管理、深浅拷贝获取子数组元素值、数据在加速卡的主机和设备之间快速传输、支持row-major和column-major两种内存布局、支持用户自定义内存布局。
8.需要说明的是,多维array维度最高可设置为8维。
9.需要指出的是,本发明使用c++模板元编程进行开发,针对于不同的硬件平台,分析不同的硬件平台架构特点,将不同硬件平台的编程接口api进行集成和封装。具体的实现主要包括下面四个部分:
10.针对于不同cpu的多维array实现
11.针对nvidia gpu加速卡的编程模型为cuda的多维array实现
12.针对于ascend910加速卡支持异构计算架构cann的多维array
13.针对于支持numa架构的cpu,基于libnuma的多维array实现
14.所述针对不同cpu包括intel cpu和amd cpu的多维array实现,在c++模板类的基础上,使用c++的内存申请和释放函数。
15.所述针对nvidia gpu加速卡,编程模型为cuda的多维array实现,nvidia gpu的编程语言为cuda。gpu有着其特定的硬件架构,包含有主机内存和设备内存等多种内存区域,在不同的区域申请释放内存的操作均不相同,使用模板类进行封装不同的内存区域所用api,同时支持在gpu上的host跟device之间的数据快速传输与拷贝。
16.所述针对于ascend 910加速卡,使用异构计算架构cann编程,ascend910是华为公司实现一种用于加速深度学习训练的加速卡,其使用专用电路的方式来加速运算,如使用电路集成了卷积中img2col的转换等。其可以使用异构计算架构cann进行编程,也支持在host和device之间的数据快速传输。在ascend910上使用多维array时需要将运行空间指定为ascend,内存空间指定为ascendspace。
17.所述针对于支持numa的cpu架构,基于libnuma的多维array实现。其的内存分配按照页大小进行。在host内存上,支持将内存平均分配到不同页上、分配到特定的页面上、分配到本地的节点上等方式,当所分配的内存大小不足一页的时候会进行填充,其所用的内存空间为hostspace。
18.本发明实现的多维array具有其余一些功能:基于引用计数方式自动申请和释放内存、nvidia gpu和ascend910上支持内存数据在主机和设备之间快速传输、浅拷贝和深拷贝获取子数组数据、resize改变数组大小、同时支持layout right和layout left和layout stride,layout stride方式支持用户自定义的内存布局,弥补了多数编程语言仅支持一种layout的缺陷。
附图说明
19.图1为一般的numa计算机架构示意图;
20.图2为ascend910加速卡中达芬奇架构示意图;
21.图3为多维array的row-major示意图;
22.图4为多维array的column-major示意图;
23.图5为多维array初始化的示意图。
具体实施方式
24.以下将结合附图对本发明作进一步的描述,需要说明的是,以下实施例以本技术方案为前提,给出了详细的实施方式和具体的操作过程,但本发明的保护范围并不限于本实施例。
25.本发明为一种计算机硬件的可拓展和性能可移植的多维数组库实现方法,针对不同的硬件平台进行分析,结合不同平台的编程语言模型或者编程库,使用c++模板元编程集成封装;其中,其中,包括基于arm架构的鲲鹏920的支持numa架构的多维array、基于昇腾910加速卡的支持异构计算架构cann的多维array、基于intel cpu和nvidia gpu编程模型为cuda的多维array;提供array库常见的基本操作。
26.需要说明的是,所述array常见的操作包含基于引用技术的自动内存管理、深浅拷贝获取子数组元素值、数据在加速卡的主机和设备之间快速传输、支持row-major和column-major两种内存布局、支持用户自定义内存布局。
27.需要说明的是,多维array维度最高可设置为8维。
28.实施例
29.本实施例描述了一种计算机硬件的可拓展和性能可移植的多维数组库实现,array数据存储方式在多数计算机科学算法中有着至关重要的作用。通过分析不同的硬件架构和多维数组重要性为切入点。以c++模板元编程为基础,以达到提供一种高可拓展和性能可移植的库为目的。
30.不同的硬件平台有着不同的硬件架构,在不同硬件架构上有着不同编程api,在很多算法场景为了获取到最佳的算法性能,需要兼容不同的硬件架构,使得代码高度适配于某一种特定的体系架构,在后续想要进行算法代码移植时便会带来很大的性能消耗,无法做到性能可移植性。本发明针对于不同硬件架构,兼容不同硬件,提供一种在不同硬件平台之间高可拓展性和性能可移植性的多维array库,同时支持多维数组api支持的常见的操作。
31.下面先对本发明实施例中所用到的缩略语和关键术语做一个简要的说明:
32.numa(non-uniform memory access):一种为多处理器的计算机设计的内存架构,在这种架构之中,cpu核心访问不同物理內存的时间有着一定的差异。cpu访问自己本地的內存比非本地的內存(其余cpu核心的本地内存)要更快。
33.c++模板元编程:元编程就是编写直接生成或操纵程序的程序,c++模板给c++语言提供了元编程的能力,模板使c++编程变得灵活,能实现很多高级动态语言才有的特性,模板元编程可在编译时完成一些计算,将一些计算由运行时转移到编译时,而且保持原有的抽象层次。
34.row-major和column-major:两者是计算机中数据存储的两种形式,不论维度为多少的数组存储在内存中时,都存储在一维的内存中。两者的区别在于优先按照行主序或者列主序存储。以二位数组为例,row-major在将数据存储在一维内存上时是首先按照行优先的方式存储,column-major则为首先按照列优先的方式存储。
35.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图对本发明中的技术方案进行更详细的说明。
36.图1描述了一台典型的numa架构计算机的架构图。当中包含內存、cpu核心、cpu插槽、numa节点等。其余计算机部件被省略。鲲鹏920处理器便是基于numa架构的。
37.为了更好利用本地numa节点访存速度更快的优点。本发明支持在特定numa节点上申请内存来实现多维array。为了确保应用性能,一般会将应用内存尽量分配在相同的numa节点中,但一些算法并不能获得最佳性能,本发明支持将内存申请在相同的节点、也支持将内存平均申请在不同的节点。提供了不同的操作,可以供用户根据实际来选择。
38.图2是ascend910的达芬奇硬件架构,ascend910是华为自主研发的人工智能芯片,有着高算力、低能耗的显著优势。其基于达芬奇架构实现,包含有三种基本计算资源,分别为:矩阵计算单元、向量计算单元、标量计算单元。所述的三种不同的计算单元使用的数据都可以使用本发明中的多维array来进行存储。
39.图3和图4分别是两种计算机中默认的array布局方式,row-major和column-major,一般一种硬件设备上仅有一种特定的layout,仅支持一种布局有着一定的局限性,往往会带来很大的性能损耗。
40.为了带来更好的cache效率,本发明同时支持两者布局,额外提供layout stride布局,让用户自定义内存布局,用户可以通过指定的参数来实现。在参数指定上,layoutright布局为row-major,layoutleft为column-major。
41.多维array的数据布局,在默认情况下,是根据用户指定的内存空间来确定的,同时用户也可以根据参数来进行更改。
42.支持的内存空间包含hostspace、cudaspace、aecendspace等。
43.图5是使用array库的一个流程图,用户可以指定数据类型、内存空间、内存映射方式。
44.第一个参数必须给出array的数据类型值,数据类型包含有c++中所有的数据类型和ascend910中的数据类型;执行空间可以为cudaspace、numaspace、ascendspace。最后指定内存映射方。
45.内存空间和执行空间需要对应,否则会编译时出错。layout布局方式可以选择为layoutright、layoutleft、layoutstride。
46.在指定执行空间为host的时候,内存空间只能是hostspace或者是numaspace。指定为host的时候使用内存申请和释放函数分别为alloc和dealloc。
47.当执行空间为host时,内存空间指定为numaspace的时候,会根据用户选择的分配模式来进行分配。
48.可选择平均分配到每个numa节点上,当内存申请小于单个numa节点内存时候,可将内存分配到一个numa节点上。此时使用内存申请函数分别为numa_alloc_interleaved和numa_alloc_onnode。
49.执行空间除了指定为host外,还可以指定为cuda,指定为cuda的时候,内存空间须指定为cudaspace。
50.cuda上可以指定多种不同类型的内存空间,使用的内存申请函数分别为:cudamalloc、cudamallocmanaged、cudahostalloc。
51.当执行空间指定为国产的ascend的时候,内存空间可以指定为ascendspace,ascend还支持媒体数据类型处理,只需要将内存空间指定为ascendmediaspace。
52.同时由于ascend的特殊性,还可以直接使用ascend在主机内存上申请内存,其效果跟将内存指定为hostspace相同。
53.在ascend上申请内存所用的api包含有aclrtmalloc、acldvppmalloc、aclrtmallochost。
54.当指定内存空间和执行空间之后,多维array库根据参数在编译期间完成对数据内存的申请。本发明中内存处理是使用引用计数来完成,整个过程中无需用户关注内存管理。
55.图5也列举出了多维array库所支持的api,主要包含有:数组元素赋值操作、浅拷贝方式赋值、数组resize操作、、数组元素的原子操作、获取子数组、深拷贝赋值操作等。下面是实现细节。
56.数组元素赋值操作,当执行空间为hostspace的时会使用c++支持的memset函数进行赋值操作。
57.当执行空间为cudaspace的调用cuda支持的cudamemset函数进行赋值操作。
58.当执行空间为ascend的时候调用aclrtmemset函数进行赋值。
59.浅拷贝方式进行赋值操作,赋值的时会将内存数据的引用计数的值加一。当引用计数的值为0的时候对内存进行回收。
60.数组resize操作,执行该操作之后,会重新在相同的内存空间中申请新的内存,并且释放原先内存。
61.通过封装不同平台上所支持的原子操作,来支持数组库中元素的原子操作,完成性能提高。
62.subarray操作,该操作是获取得到子数组的方式,不会重新申请内存,只是返回原先数组内容的子数组,操作subarray的值会改变原先数组的值。
63.deepcopy的操作,是一种深拷贝方式。在调用之前会首先会检测是否支持进行深拷贝。
64.内存空间之间拷贝数据,在hostspace和hostspace之间,在主机hostspace和cudaspace之间拷贝,后者会调用cudamemcpy函数根据参数来进行拷贝。
65.当设备内存为ascendspace的时候,可以在主机host和ascendspace之间进行数据传输,这个时候会调用aclrtmemcpyasync或者是aclrtmemcpy的方式来进行数据拷贝。
66.通过提供上述的兼容于国内外不同硬件平台的多维array库实现,并提供常见的array操作api,提供了一种可拓展性和性能可移植性的多维array库。
67.对于本领域的技术人员来说,可以根据以上的技术方案和构思,给出各种相应的改变和变形,而所有的这些改变和变形,都应该包括在本发明权利要求的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1