一种天文学软件Gridding的数据处理方法及装置与流程

文档序号:16067525发布日期:2018-11-24 12:49阅读:241来源:国知局
本发明涉及计算机信息
技术领域
:,特别涉及一种基于多线程并行的天文学软件gridding的数据处理方法及装置。
背景技术
:gridding程序是ska(squarekilometerarray,平方公里阵列)项目中科学数据处理模块中的重要一环,是此模块中计算量最大的应用之一。作为fft(fastfouriertransformation,快速傅里叶变换)执行前的环节,gridding程序需要将待处理数组(samples)的数据点转换到规则的网格点上。其实现方式是:首先将(u,v)平面的离散成像点取样,这一过程就形成了由一系列diracdelta方程组成的成像函数,将这一函数与一个有限长度的内核做卷积,此函数就转变成为一个过滤函数,从而将离散的点转换到规则的网格点上。gridding程序的计算量随着samples的数据点个数的增加而增加,同时也与卷积内核函数的长度成正比。现有技术中,gridding程序是基于mpi(messagepassinginterface,消息传递接口)多进程实现的,并且主要是针对cpu平台实现的并行程序设计,使得gridding程序只针对cpu平台实现了并行程度设计,且每个进程只有一个线程进行数据处理,没有充分利用处理器多线程功能。因此,在众核处理器计算性能得到高速的发展的今天,如何使gridding程序在knl(knightslanding,intel发布的一款众核处理器代号)平台上进行多进程+多线程的并行化计算,是现今急需解决的问题。技术实现要素:本发明的目的是提供一种基于多线程并行的天文学软件gridding的数据处理方法及装置,以结合openmp(openmulti-processing,并行程序接口名称)实现gridding程序在knl平台上进行多进程+多线程的并行化计算,提高gridding程序的计算性能。为解决上述技术问题,本发明提供一种基于多线程并行的天文学软件gridding的数据处理方法,应用于knl平台,包括:对待处理数组进行排序;将排序后的待处理数组分割成预设数量的子数组,并通过openmp将每个所述子数组分配到各自对应的一个线程;利用每个所述线程对各自对应的子数组进行计算,并将计算结果存储在各自对应的局部网格数组中;利用全部所述线程以串行方式将各自对应的局部网格数组合并到图像网格数组中。可选的,所述对待处理数组进行排序,包括:按照所述待处理数组中的每个数据点的坐标大小,对所述待处理数组进行排序。可选的,所述利用每个所述线程对各自对应的子数组进行计算,并将计算结果存储在各自对应的局部网格数组中之前,还包括:利用每个所述线程根据各自对应的子数组中第一个数据点和最后一个数据点的垂直坐标,确定各自对应的局部网格数组的内存空间;在所述knl平台上的mcdram上开辟所述内存空间。可选的,所述利用每个所述线程对各自对应的子数组进行计算,包括:利用每个所述线程利用所述knl平台上的avx512指令集进行向量化操作。可选的,所述利用每个所述线程对各自对应的子数组进行计算,包括:利用每个所述线程计算各自对应的子数组中的当前数据点之前,在内存中预取计算所述当前数据点之后预设数量的数据点所需的数据。此外,本发明还提供了一种基于多线程并行的天文学软件gridding的数据处理装置,应用于knl平台,包括:排序模块,用于对待处理数组进行排序;分配模块,用于将排序后的待处理数组分割成预设数量的子数组,并通过openmp将每个所述子数组分配到各自对应的一个线程;计算模块,用于利用每个所述线程对各自对应的子数组进行计算,并将计算结果存储在各自对应的局部网格数组中;合并模块,用于利用全部所述线程以串行方式将各自对应的局部网格数组合并到图像网格数组中。可选的,所述排序模块,包括:排序子模块,用于按照所述待处理数组中的每个数据点的坐标大小,对所述待处理数组进行排序。可选的,该装置还包括:开辟模块,用于利用每个所述线程根据各自对应的子数组中第一个数据点和最后一个数据点的垂直坐标,确定各自对应的局部网格数组的内存空间;在所述knl平台上的mcdram上开辟所述内存空间。可选的,所述计算模块,包括:向量化子模块,用于利用每个所述线程利用所述knl平台上的avx512指令集进行向量化操作。可选的,所述计算模块,包括:预取模块,用于利用每个所述线程计算各自对应的子数组中的当前数据点之前,在内存中预取计算所述当前数据点之后预设数量的数据点所需的数据。本发明所提供的一种基于多线程并行的天文学软件gridding的数据处理方法,应用于knl平台,包括:对待处理数组进行排序;将排序后的待处理数组分割成预设数量的子数组,并通过openmp将每个子数组分配到各自对应的一个线程;利用每个线程对各自对应的子数组进行计算,并将计算结果存储在各自对应的局部网格数组中;利用全部线程以串行方式将各自对应的局部网格数组合并到图像网格数组中;可见,本发明通过openmp将每个子数组分配到各自对应的一个线程,在现有mpi多进程的基础上,结合openmp实现了gridding程序在knl平台上进行的多进程和多线程的并行化计算,提高了gridding程序的计算性能;并且通过全部线程以串行方式将各自对应的局部网格数组合并到图像网格数组中,解决了gridding程序中进行多线程数据处理的写冲突问题,提升了用户体验。此外,本发明还提供了一种基于多线程并行的天文学软件gridding的数据处理装置,同样具有上述有益效果。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。图1为本发明实施例所提供的一种基于多线程并行的天文学软件gridding的数据处理方法的流程图;图2为本发明实施例所提供的一种基于多线程并行的天文学软件gridding的数据处理方法中mpi启动多个gridding进程的示意图;图3为gridding程序的原始并行算法中计算网格重叠问题的示意图;图4为本发明实施例所提供的另一种基于多线程并行的天文学软件gridding的数据处理方法中每个线程计算各自对应的局部网格数组的示意图;图5为本发明实施例所提供的另一种基于多线程并行的天文学软件gridding的数据处理方法中的内存预取的示意图;图6为本发明实施例所提供的另一种基于多线程并行的天文学软件gridding的数据处理方法中的串行合并的示意图;图7为本发明实施例所提供的另一种基于多线程并行的天文学软件gridding的数据处理方法中的归约操作的示意图;图8为本发明实施例所提供的一种基于多线程并行的天文学软件gridding的数据处理装置的结构图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。请参考图1,图1为本发明实施例所提供的一种基于多线程并行的天文学软件gridding的数据处理方法的流程图。该方法应用于knl平台,可以包括:步骤101:对待处理数组进行排序。其中,本实施例是以knl平台中的多个对各自对应的(u,v)平面的离散成像点取样的待处理数组(samples)进行图像网格化任务的进程中的一个进程为例进行的展示。如图2所示,可以通过mpi启动多个gridding进程,使多个gridding程序可以在同一时间处理多个图像网格化任务。对于knl平台中的其他进程的具体计算方式,可以采用与本实施例相同或相似的方式对应进行,本实施例对此不做任何限制。可以理解的是,本步骤中对待处理数组进行排序的具体方式,可以由设计人员根据实用场景和用户需求自行设置,如可以将待处理数组按照“dind”的大小进行排序;为了使局部网格数组(local_grid)能尽可能的集中在图像网格数组(grid)的局部区域,也可以将待处理数组按照元素(每个数据点)的坐标大小进行排序,使接下来每一个线程分到的samples样本(子数组)就会集中在一个区域,从而对应的赋值操作就会集中在一个区域(而不是随机地分散在图像网格数组的各个位置),使需要覆盖住这个区域的局部网格数组(local_grid)的大小可以尽可能的小。本实施例对此不做任何限制。具体的,本步骤为按照待处理数组中的每个数据点的坐标大小,对待处理数组进行排序时,由于knl处理器单个内核的主频较低,单核性能较弱,当程序在处理比较耗时的串行代码时候,性能往往不会很理想,如本步骤中的排序操作需要处理的数据点多达十万甚至百万个,耗时比较长,所以可以将串行代码并行化,从而提高gridding程序在knl平台上的性能。即可以本步骤可以通过一个lambda表达式调用函数“parallel_stable_sort”进行并行排序。其中,“parallel_stable_sort”是由intel工程师开发的一个用来并行排序的api(applicationprograminterface,应用程序接口),支持tbb(threadbuildingblocks,线程构建模块)以及openmp多线程开发环境,相关代码可以在intel网站上下载。之后还可以遍历整个待处理数组找到全局的u(水平)坐标最小值和最大值,用来确定局部网格数组在图像网格数组中的范围。步骤102:将排序后的待处理数组分割成预设数量的子数组,并通过openmp将每个子数组分配到各自对应的一个线程。其中,本步骤中的预设数量可以为排序后的待处理数组分割成的子数组的数量,即对每个子数组进行处理的openmp线程的数量,可以由设计人员根据实用场景和用户需求自行设置,本实施例对此不做任何。也就是说,尽管knl平台配有64个cpu核心(最高可支持72个),可以支持256个线程(最多288个线程)同时运行。但是考虑到数据的同步以及最终结果的归约操作,gridding程序的计算性能不会一直随着线程数的增加而提高。因此,针对不同的算例,可以由设计人员或用户选择一个合适的线程数,从而达到gridding程序运行的最优化。步骤103:利用每个线程对各自对应的子数组进行计算,并将计算结果存储在各自对应的局部网格数组中。可以理解的是,为了能充分利用openmp多线程并行地处理数据量巨大的待处理数组,以对待处理数组按照“dind”的大小进行排序为例,将排好序列的待处理数组分割并将子数组发送到不同的openmp线程进行处理后,写冲突的问题理论上依然有可能发生在最后的赋值阶段,这是因为gridding程序在赋值的时候并不是单点赋值,而是第一个以某点为中心的以“ssize”为大小正方形区域赋值。因此,如图3所示,这样将待处理数组排序只能保证它们的中心点不重合,而并不能保证每个线程矩形区域不发生重合。上述问题在knl平台上尤为明显,由于knl平台是一种众核处理器架构,可以开启的openmp线程多达200-300,因此这种情况下同一时间相邻线程处理的子数组的数据点较为接近,因此上述写冲突的风险比普通cpu平台(几个线程并行)要大的多。为了解决这个问题,本实施例通过本步骤先将每个线程的计算结果储存在局部网格数组(local_grid)中,然后通过接下来的步骤把各个线程的计算结果串行地合并到总的图像网格数组(grid)上,以避免写冲突问题。具体的,对于本步骤中利用每个线程对各自对应的子数组进行计算,并将计算结果存储在各自对应的局部网格数组中的具体方式,可以由设计人员根据实用场景和用户需求自行设置,如可以采用与现有技术相似的方式对应进行设置,只要每个线程可以将各自对应的子数组的计算结果存储在各自对应的局部网格数组中,本实施例对此不做任何限制。对应的,由于knl平台最具有特色的就是它装配的mcdram(multi-channeldynamicrandomaccessmemory,多通道动态随机访问内存)片上高速内存,它的访问速度可以达到400-500gb/s,几乎是普通ddr4内存的4到5倍。本步骤之前还可以包括每个线程在mcdram上开辟各自对应的局部网格数组的内存空间的步骤,即本步骤之前可以包括利用每个线程根据各自对应的子数组中第一个数据点和最后一个数据点的垂直坐标,确定各自对应的局部网格数组的内存空间;在knl平台上的mcdram上开辟内存空间。如每个线程可以先定义局部网格数组(local_grid),该大小是由该线程的子数组的第一个元素和最后一个元素的v(垂直)坐标决定的,同时为了给最后一些元素对应的正方形区域赋值,还可以开配一些额外的内存。具体的,可以采用“hbw_posix_memalign”函数实现将局部网格数组在mcdram上开辟内存空间。需要特别注意的是,局部网格数组u(水平)方向的大小是由umax、umin以及ssize共同确定的,局部网格数组内存开辟好后,可以用多线程并行计算每个线程的各自对应的局部网格数组。对于在mcdram上开辟每个线程各自对应的局部网格数组的内存空间的具体方式,可以由设计人员根据实用场景和用户需求自行设置,可以由每个线程在mcdram上开辟各自对应的局部网格数组的内存空间,也可以由每个进程在mcdram上开辟对应的多个线程各自对应的局部网格数组的内存空间。只要可以在mcdram上开辟每个线程各自对应的局部网格数组的内存空间,本实施例对此不做任何限制。对应的,由于gridding程序对于内存的需求不是很高,可以把核心函数的所有数据都开辟在了片上的mcdram高速内存上。但是由于开片上内存需要调用特别的函数库,且这些函数库还暂时还不支持stl库,所以我们将核心函数中的一些容器变量(如vector)改写成了一般的指针数组形式,而例如samples等一些数据需要保持vector结构(调用“parallel_stable_sort”时使用),需要重新定义一个allocator类,并利用“hbw_posix_memalign”函数对类的私有变量分配内存空间,进而保证vector容器是开辟在mcdram上。需要说明的是,本步骤还可以利用内存预取(memoryprefetch)提高访存效率和cache(高速缓冲存储器)的利用率,即本步骤可以包括:利用每个线程计算各自对应的子数组中的当前数据点之前,在内存中预取计算当前数据点之后预设数量的数据点所需的数据的步骤。如图4所示,在gridding算法的核心最内层循环中,在计算当前数据点(suppu,suppv,dind)对应的局部网格数组(local_grid)的数据点之前,即图4中计算local_grid之前,可以通过调用“_mm_prefetch”函数预取了若干步以后需要用到的局部网格数组以及子数组中的数据,即图4中对卷积函数和local_grid进行预取操作,这样做的目的是提前将数据准备好,等程序需要用到这些数据时,它们已经存放在cache里面了,从而提高访存效率。具体的,对于在内存中预取计算当前数据点之后预设数量的数据点所需的数据中的预设数量的具体数值设置,即如图5所示预取内存的距离(数据位置j与k之间的距离),可以由设计人员根据实用场景和用户需求自行设置,如可以将3倍水平网格个数的循环步以后的数据提前预取到l2cache,此操作大约需要200个时钟周期,这与迭代3次“suppv”循环(包含3*128*(3次读操作+1次乘法操作+1次写操作))所用的时钟周期在同一个量级上。本实施例对此不做任何限制。优选的,为了提升gridding程序的性能,本步骤还可以包括利用每个线程利用knl平台上的avx512指令集进行向量化操作的步骤。即在核心代码中,为了能指导编译器在遇到如图4中的循环的时候能够进行向量化操作,在for循环的前部或者最内层for循环的前部都加入预处理指令“#pragmasimd”,同时在编译时加入编译选项“-xcommon-avx512”,以充分发挥knl平台上的avx512指令集,通过高度向量化使gridding程序的性能提升。值得一提的是,本实施例中在调用“hbw_posix_memalign”函数开辟mcdram的片上内存空间的同时,还可以指导编译器将数据对齐,一定程度上避免了缓存访问未命中的情况发生,更好的利用knl平台的avx-512指令集,使得gridding程序会更有效地通过向量化操作,达到性能提升的效果。步骤104:利用全部线程以串行方式将各自对应的局部网格数组合并到图像网格数组中。可以理解的是,本步骤的目的可以为通过串行方式将每个线程各自对应的局部网格数组合并到图像网格数组中,解决gridding程序中进行多线程数据处理的写冲突问题,如图6所示,每个线程各自对应的局部网格数组合(thread1、2和3)串行相加到图像网格数组中。对于本步骤中利用全部线程以串行方式将各自对应的局部网格数组合并到图像网格数组中的具体方式,可以由设计人员自行设置,如每个线程可以进行如图7所示的归约操作。只要可以实现以串行方式将每个线程各自对应的局部网格数组合并到图像网格数组中,本实施例对此不做任何限制。具体的,如图7所示,每个线程(线程i)可以通过检查数据是否被锁,确定图像网格数组(grid)的当前区域是否正被其他线程写入数据点;若锁定,则等待下一次检测数据是否被锁;若未锁定,则利用critical对全局图像网格数组(grid)数据进行归约,即锁定当前区域。本实施例中,本发明实施例通过openmp将每个子数组分配到各自对应的一个线程,在现有mpi多进程的基础上,结合openmp实现了gridding程序在knl平台上进行的多进程和多线程的并行化计算,提高了gridding程序的计算性能;并且通过全部线程以串行方式将各自对应的局部网格数组合并到图像网格数组中,解决了gridding程序中进行多线程数据处理的写冲突问题,提升了用户体验。请参考图8,图8为本发明实施例所提供的一种基于多线程并行的天文学软件gridding的数据处理装置的结构图。该装置应用于knl平台,可以包括:排序模块100,用于对待处理数组进行排序;分配模块200,用于将排序后的待处理数组分割成预设数量的子数组,并通过openmp将每个子数组分配到各自对应的一个线程;计算模块300,用于利用每个线程对各自对应的子数组进行计算,并将计算结果存储在各自对应的局部网格数组中;合并模块400,用于利用全部线程以串行方式将各自对应的局部网格数组合并到图像网格数组中。可选的,排序模块100,可以包括:排序子模块,用于按照待处理数组中的每个数据点的坐标大小,对待处理数组进行排序。可选的,该装置还可以包括:开辟模块,用于利用每个线程根据各自对应的子数组中第一个数据点和最后一个数据点的垂直坐标,确定各自对应的局部网格数组的内存空间;在knl平台上的mcdram上开辟内存空间。可选的,计算模块300,可以包括:向量化子模块,用于利用每个线程利用knl平台上的avx512指令集进行向量化操作。可选的,计算模块300,可以包括:预取模块,用于利用每个线程计算各自对应的子数组中的当前数据点之前,在内存中预取计算当前数据点之后预设数量的数据点所需的数据。本实施例中,本发明实施例通过分配模块200利用openmp将每个子数组分配到各自对应的一个线程,在现有mpi多进程的基础上,结合openmp实现了gridding程序在knl平台上进行的多进程和多线程的并行化计算,提高了gridding程序的计算性能;并且通过合并模块400将全部线程以串行方式将各自对应的局部网格数组合并到图像网格数组中,解决了gridding程序中进行多线程数据处理的写冲突问题,提升了用户体验。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或
技术领域
:内所公知的任意其它形式的存储介质中。以上对本发明所提供的基于多线程并行的天文学软件gridding的数据处理方法及装置进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本
技术领域
:的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1