首页> 中国专利> 一种利用非统一存储器访问架构特点提升并行化NumPy计算性能的方法

一种利用非统一存储器访问架构特点提升并行化NumPy计算性能的方法

摘要

本发明公开了一种利用非统一内存访问架构特点提升并行化NumPy计算性能的方法,所述方法包括针对NUMA架构及NumPy并行计算的特点分析;针对NumPy并行计算及NUMA架构优化的CPU分配程序与基于CPU分配程序及进程绑定的优化版NumPy并行计算系统。本发明的有益效果在于,可以由CPU分配器根据NUMA架构计算机以及NumPy并行计算的特点,生成一个CPU配置文件,利用进程绑定,把进程绑定到适合的CPU核心上运行。这样可以更有效地利用计算机的硬件资源的同时,减少进程迁移带来的性能问题,提升并行计算的性能。

著录项

  • 公开/公告号CN112860530B

    专利类型发明专利

  • 公开/公告日2022.09.27

    原文格式PDF

  • 申请/专利权人 中山大学;

    申请/专利号CN202110122117.7

  • 发明设计人 梁嘉迪;杜云飞;卢宇彤;肖侬;

    申请日2021.01.27

  • 分类号G06F11/34(2006.01);G06F9/445(2018.01);G06F9/50(2006.01);

  • 代理机构深圳市创富知识产权代理有限公司 44367;

  • 代理人高冰

  • 地址 510275 广东省广州市海珠区新港西路135号

  • 入库时间 2022-11-28 17:49:28

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-09-27

    授权

    发明专利权授予

说明书

技术领域

本发明属于计算机算法性能提升的研究技术领域,特别涉及一种利用非统一存储器访问架构特点提升并行化NumPy计算性能的方法。

背景技术

NumPy是Python语言的一个矩阵及多维数组计算库。它使用C实现各算法中的核心计算部分,使得它的运行效率可以达到编译语言的水平。它还可以通过连接BLAS与LAPACK以进一步提升线性代数运算的性能。NumPy的常用领域包括科学计算、机器学习、数据分析、数据可视化等,而这些领域对性能的需求日渐提高,NumPy是一个串行计算的计算库,并行计算是提升NumPy性能的一种有效思路。

现代计算机应用对处理器的性能需求日渐提升,为了给这些应用提高更多处理器核心,出现了更多非统一存储器访问(NUMA)架构的计算机处理器。与传统的统一存储器访问架构不同,在非统一存储器访问架构的处理器中,存储器的访问时间取决于存储器相对于处理器的位置。虽然两者同样由计算机中的所有物理存储器组成全局的地址空间,但在NUMA架构中存储器在物理上是分布式的。处理器访问它的本地存储器时速度比非本地存储器更快。

因为处理器在访问本地存储器时速度更快,所以一般操作系统在处理多线程任务时,会更倾向于把同一个进程的线程分配到同一个NUMA节点当中,以此提升线程间数据交换的效率。然而这种方式并不是对所有应用场景都是最好的。

如图1所示,描述了一台典型的NUMA架构计算机的架构图。当中包含存储器、CPU插槽、NUMA节点、CPU核心等。其他典型的计算机部件例如硬盘及网络等被省略。

图1中的计算机有两个CPU插槽,分别为Socket0和Socket1,它们各自对应一个相同的CPU。

每个CPU当中包含8个核心,并且被分为两个NUMA节点,其中Socket0中的CPU被分为NUMA0及NUMA1;Socket1中的CPUl被分为NUMA2及NUMA3。其中每个NUMA节点当中皆有4个核心。

与NUMA节点对应地,存储器也被分为了对于每个NUMA节点的本地存储器,它们分别是RAM0、RAM1、RAM2及RAM3。

以NUMA0当中的核心为例,其访问RAM0中的数据时具有相对更小的延迟。而访问RAM1中的数据时因为需要经过NUMA1,延迟会变得较大。访问RAM2或RAM3中的数据因为要进行跨插槽的数据交换,这个时候访问延迟会再进一步提升。

为了确保应用的性能,在一般的操作系统中,会把并行计算应用中的线程尽量分配到相同的NUMA节点的核心当中。同样地,在并行编程模型例如MPI当中,默认也是尽量较少的NUMA节点数量,并尽量使用当中的全部核心。

这样的方式减少了程序中在核心间进行数据交换的延迟,某上程度上可以提升应用的性能。然而,这样的方式可能减少了存储器及存储器带宽的利用率,这个问题将在后续部分进行详细说明。

NumPy并行计算版本主要服务的目标是科学计算、机器学习、数据分析、数据可视化等。这些领域一般都有计算量大、可接受的计算延迟较大等特点。

由于NumPy中相当多的计算操作都是对矩阵中每一个元素进行相同的操作,这些操作显然是易于并行的,而且并行的时候也基本不需要进行进程间的数据交换。这样使得即是进程在不同的NUMA节点上,也不会为计算带来巨大的延迟。

因为应用场景一般是数据密集的。所以NumPy计算时CPU需要访问记忆体中大量的数据,这使得存储器带宽是影响计算性能的一个重要因素。

同时,NumPy的数据是密集地存储在内存空间中的,这样使得Cache的容量提升对于程序的性能提升有很大的作用。

如图2为并行计算在NUMA架构上传统的CPU分配方式示意图,图中深色部分为此分配方式所选择的核心,其选择了在NUMA0中的四个CPU核心用作计算。

这种分配方式为一般操作系统及并行编程模型中选择的分配方式,尽量使用相同NUMA节点中的核心用作计算。

在这种分配方式中,所有核心都尽量使用RAM0作为存储器。虽然这种分配方式使得CPU核心之间的数据交换可以达到最小的延迟,但显然地RAM1、RAM2及RAM3以及它们的带宽都被浪费了。

发明内容

鉴于现有技术的缺陷,本发明旨在于提供一种利用非统一存储器访问架构特点提升并行化NumPy计算性能的方法,本发明一种利用NUMA架构特点提升NumPy并行计算性能的方式及使用之实现的NumPy并行计算系统,通过分析NUMA架构及NumPy并行计算的特点,以更高效的CPU分配作切入,进程绑定为手段,以达到提升计算性能及硬件利用效率的目的。

为了实现上述目的,本发明采用的技术方案如下:

一种利用非统一存储器访问架构特点提升并行化NumPy计算性能的方法,所述方法包括针对NUMA架构及NumPy并行计算的特点分析;针对NumPy并行计算及NUMA架构优化的CPU分配程序与基于CPU分配程序及进程绑定的优化版NumPy并行计算系统。

需要说明的是,所述方法包括:

S1 NumPy并行计算系统接收计算任务;

S2从用户输入中确定需要使用的CPU核心数量;

S3调用CPU分配程序以生成针对NUMA架构及NumPy并行计算优化过的CPU分配文件;

S4结果为分配给不同的NUMA中各两个核心;

S5建立与步骤S2需要使用的CPU核心数量相同的进程,并按照CPU分配文件对它们进行与CPU核心的绑定;

S6矩阵计算任务被分到各个进程中进行;

S7计算完成。

需要进一步说明的是,所述步骤S3包括:

S3.1从环境变量或输入获取需要的核心数量;

S3.2使用lscpu获取系统的CPU信息并截取有用部分;

S3.3从CPU信息中截取有用信息;

S3.4以需要的核心数量除以NUMA节点数量以求出平均每个NUMA节点需要分配多少个核心;

S3.5从第一个NUMA节点开始进行核心的分配;

S3.6若剩余需要分配的核心数可被剩下的NUMA节点数整除,从剩余的NUMA节点中平均地分配需要的核心即可完成分配;

S3.7若剩余需要分配的核心数为0也即完成分配;

S3.8否则为在当前NUMA节点分配核心并跳到下一个NUMA节点,转到第6步继续;

S3.9完成分配后,根据CPU信息及各NUMA节点上分配的核心数量生成CPU核心分配文件。

优选的,所述有用信息可以是CPU插槽数量、NUMA节点数量及CPU核心数量。

优选的,所述步骤S3.4中,对于非整数情况,使用round,即求与该小数最接近的整数。

本发明的有益效果在于,可以由CPU分配器根据NUMA架构计算机以及NumPy并行计算的特点,生成一个CPU配置档,利用进程绑定,把进程绑定到适合的CPU核心上运行。这样可以更有效地利用电脑的硬件资源的同时,减少进程迁移带来的性能问题,提升并行计算的性能。

附图说明

图1为现有技术中一般NUMA计算机架构示意图;

图2为并行计算在NUMA架构中传统的CPU分配方式示意图;

图3为本发明基于CPU分配程序及进程绑定的优化版NumPy并行计算系统的运行流程示意图;

图4为本发明中CPU核心分配文件生成流程示意图;

图5为本发明针对NumPy并行计算优化的CPU分配方式示意图;

图6为本发明其中一个核心分配文件示例示意图。

具体实施例

以下将结合附图对本发明作进一步的描述,需要说明的是,本实施例以本技术方案为前提,给出了详细的实施方式和具体的操作过程,但本发明的保护范围并不限于本实施例。

本发明为一种利用非统一存储器访问架构特点提升并行化NumPy计算性能的方法,所述方法包括针对NUMA架构及NumPy并行计算的特点分析;针对NumPy并行计算及NUMA架构优化的CPU分配程序与基于CPU分配程序及进程绑定的优化版NumPy并行计算系统。

如图3所示,本发明的所述方法包括:

S1 NumPy并行计算系统接收计算任务;

S2从用户输入中确定需要使用的CPU核心数量;

S3调用CPU分配程序以生成针对NUMA架构及NumPy并行计算优化过的CPU分配文件;

S4结果为分配给不同的NUMA中各两个核心;

S5建立与步骤S2需要使用的CPU核心数量相同的进程,并按照CPU分配文件对它们进行与CPU核心的绑定;

S6矩阵计算任务被分到各个进程中进行;

S7计算完成。

如图4所示,本发明的步骤S3包括:

S3.1从环境变量或输入获取需要的核心数量;

S3.2使用lscpu获取系统的CPU信息并截取有用部分;

S3.3从CPU信息中截取有用信息;

S3.4以需要的核心数量除以NUMA节点数量以求出平均每个NUMA节点需要分配多少个核心;

S3.5从第一个NUMA节点开始进行核心的分配;

S3.6若剩余需要分配的核心数可被剩下的NUMA节点数整除,从剩余的NUMA节点中平均地分配需要的核心即可完成分配;

S3.7若剩余需要分配的核心数为0也即完成分配;

S3.8否则为在当前NUMA节点分配核心并跳到下一个NUMA节点,转到第6步继续;

S3.9完成分配后,根据CPU信息及各NUMA节点上分配的核心数量生成CPU核心分配文件。

优选的,所述有用信息可以是CPU插槽数量、NUMA节点数量及CPU核心数量。

优选的,所述步骤S3.4中,对于非整数情况,使用round,即求与该小数最接近的整数。

实施例

图5为针对NumPy并行计算优化的CPU分配方式示意图,图中深色部分为此分配方式所选择的核心,其选择了分布在NUMA0、NUMA1、NUMA2及NUMA3上的四个核心。

这种分配方式使用根据的原则是尽可能使用更多的NUMA节点。这样相对于传统的CPU分配方式,存储器带宽达到了四倍。与此同时,因为使用了两个插槽中的CPU,L3 Cache也变为了传统CPU分配方式的两倍。

这种分配方式虽然提升了核心间数据交换的开销,却可以充分利用计算机的存储器和存储器带宽。并且应用的性能也能因L3 Cache容量的提升而得益,这对于程序局部性较好的程序提升是巨大的。

传统的CPU分配方式在程序中可以使进程间数据交换延迟更低,这对于很多应用程序来说是关键的。然而,NumPy并行计算主要服务于科学计算及机器学习等计算量巨大但对于计算延迟相对不敏感的应用。同时它的计算中相对于进程间的数据交换,更多的是数据在内存和CPU间的交换。针对于NumPy并行计算的CPU分配方式可以充分地利用系统中的存储器带宽以及L3 Cache,这对于NumPy并行计算系统的性能提升是巨大的。

为了进一步描述本发明,如图6所示,为一个核心分配文件示例,它描述了一个需要8核心的计算任务在图1架构的计算机中,CPU分配程序所生成的CPU分配文件。

档当中每行皆描述了一个进程相关的绑定信息,信息皆可以以rank[rank]=[hostname]slot=[slot]:[core]的形式表示。

其中rank为程序中的进程号,档中8行信息分别代表着进程0到进程7共8个进程的绑定信息。

hostname为处理器所在机器的机器名称或ip地址,在本例中使用单台机器完成计算,所以8个进程所在的机器皆为localhost。

slot为核心所在的插槽号,本例中前4个进程与0号插槽中的CPU核心进行绑定,后4个进程与1号插槽中的CPU核心进行绑定。

core为插槽内的核心号。从图1,每个插槽中第一个NUMA节点中的核心的核心号为0-3,第二个NUMA节点中的核心的核心号为4-7。所以核心分配程序按照使用尽量多的NUMA节点并平均分配的原则,使用了每个插槽的0,1,4,5号核心。

NumPy并行计算系统根据此档可以把8个进程绑定到对应的核心,达到比传统分配方式更好的性能。

对于本领域的技术人员来说,可以根据以上的技术方案和构思,给出各种相应的改变,而所有的这些改变,都应该包括在本发明权利要求的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号