CN112765870B - 一种基于gpu的n体模拟程序性能优化方法 - Google Patents
一种基于gpu的n体模拟程序性能优化方法 Download PDFInfo
- Publication number
- CN112765870B CN112765870B CN202110077894.4A CN202110077894A CN112765870B CN 112765870 B CN112765870 B CN 112765870B CN 202110077894 A CN202110077894 A CN 202110077894A CN 112765870 B CN112765870 B CN 112765870B
- Authority
- CN
- China
- Prior art keywords
- gpu
- memory
- particles
- particle
- cpu
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/20—Design optimisation, verification or simulation
- G06F30/25—Design optimisation, verification or simulation using particle-based methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2119/00—Details relating to the type or aim of the analysis or the optimisation
- G06F2119/14—Force analysis or force optimisation, e.g. static or dynamic forces
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Evolutionary Computation (AREA)
- Geometry (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明涉及一种基于GPU的N体模拟程序性能优化方法,包括以下步骤:将相关索引信息传入到GPU使得构造短程力列表的过程迁移到GPU上,同时使得构造列表的过程并行化;改变线程块调度的方式,通过GPU的流水调度,将粒子信息轮流加载到GPU的共享内存中;在GPU核心函数中采用插值多项式和混合精度计算短程作用力,CPU上计算好插值常数后传入GPU,存放在GPU的共享内存中;对GPU上各粒子的短程力计算结果通过重排序,在GPU全局内存进行规约合并,在所有粒子计算完成后再将最终结果传回CPU。本发明减少了从CPU内存到GPU显存的数据传输,降低重复访存的延迟,提高GPU计算短程力过程中的数据存取效率,以及减少从GPU显存到CPU内存数据传输,同时也减少了CPU端信息更新的时间。
Description
技术领域
本发明属于计算机技术领域,具体涉及一种基于GPU的N体模拟程序性能优化方法。
背景技术
N体问题是力学的基本问题之一,主要研究N个粒子间的互相作用以及其运动规律,由给定的粒子初始参数,例如位置、质量、速度,计算每个粒子在物理力的作用下与其他粒子间的相互作用,来模拟粒子的演化过程。在计算过程中,主要分为长程力和短程力。N体问题在天体物理、分子动力学、材料科学等领域都有重要的应用。
在面对粒子总数达到千亿甚至万亿的物理系统,计算时间将随着规模的增大而急剧增加。虽然有一些快速算法,如快速多极子方法(Fast Multipole Method,FMM)将整体复杂度降到了O(N),但是N体问题的精确、完整模拟需要做成千上万步迭代,巨大的计算量成为主要瓶颈,传统计算机的计算能力已经远远无法满足要求,随着高性能计算技术的快速发展,以GPU为代表的并行异构平台已经成为提高计算性能的主要手段。
对于all-pairs问题中的直接法(Particle-to-Particle,P2P)的性能优化,主要利用显存的共享内存缓存重复计算过程中的粒子信息,虽然效率较高,但直接法的复杂度过高,为O(N^2),不适合N达到千亿量级的实际问题。对于快速N体模拟方法,基本的GPU优化使用零拷贝内存提高GPU运算时的传输效率,但是也依然有数据的重复传输和计算。
在快速算法中,粒子-粒子(P2P)之间的计算时间依然占据整体计算的较大比重,因此对P2P的优化能够最大效率的提高算法的整体性能,并且在P2P的计算中,每个粒子的速度以及位置的计算与更新都是相对独立的,因此很适合进行GPU上并行计算。在基于GPU的常用优化方法的基础上,进一步采用数据结构重构、传输优化、核心计算函数优化以及任务调度方式可以将计算性能再加速2倍左右。
发明内容
本发明的目的,在GPU上使用CUDA/HIP对N体模拟程序进行基本的优化之后,其中可能包括固定内存,零拷贝内存、流等优化方式,已经使得N体程序比其MPI版本快了近千倍,但是由于数据结构与算法原因,使得程序可能存在以下四点问题:
(1)为了对粒子进行分批计算会将粒子进行分包措施,但是由于N体问题中的粒子极有可能同时作用多个粒子,使得各个包中可能存在大量重复的粒子
(2)相同包中的粒子会与相同的作用列表中的粒子进行短程力计算,但是每个线程都从全局内存读取,访存效率不高
(3)在短程力的计算中,会存在许多耗时较长的数学函数,如sqrt,exp,erfc
(4)每次计算完成后都会传回CPU,进行更新,有重复传输与更新
程序在数据的传输量以及计算过程的处理上仍有继续优化的空间,因此在原有的数据结构的基础上,通过减少内存-显存之间数据的传输量以及减少核函数上复杂函数的调用次数以及运算指令的更换,减少整个计算过程的时钟周期,来达到提高P2P的运算效率的目的,这对上千亿乃至万亿规模的N体模拟十分必要。
为实现上述目的,本发明提供了一种基于GPU的N体模拟程序性能优化方法,该方法包括以下步骤:
将相关索引信息传入到GPU使得构造短程力列表的过程迁移到GPU上,同时使得构造列表的过程并行化;
改变线程块调度的方式,通过GPU的流水调度,将粒子信息轮流加载到GPU的共享内存中;
在GPU核心函数中采用插值多项式和混合精度计算短程作用力,CPU上计算好插值常数后传入GPU,存放在GPU的共享内存中;
对GPU上各粒子的短程力计算结果通过重排序,在GPU全局内存进行规约合并,在所有粒子计算完成后再将最终结果传回CPU。
本发明减少了从CPU内存到GPU显存的数据传输,降低重复访存的延迟,提高GPU计算短程力过程中的数据存取效率,以及减少从GPU显存到CPU内存数据传输,同时也减少了CPU端信息更新的时间。
附图说明
图1为本发明实施例提供的一种基于GPU的N体模拟程序性能优化方法的流程示意图;
图2为GPU上短程力相互作用计算过程的计算流程示意图;
图3为规约实现传输优化流程示意图。
具体实施方式
下面结合附图与具体实施方式对本发明作进一步详细描述。
在N体模拟程序中,基本的GPU优化先是将相关的数据整合到数组中传到显存,每次迭代完成粒子相互作用计算后再将加速度或作用力传回内存进行数据更新,由于在P2P粒子分包的过程中,不同包之间可能存在大量的重复粒子,导致传输的大量重复数据量会增加总线的负载,同时计算过程中有许多耗费较多时钟周期的指令。因此在不影响精度的情况下,对这些环节进行优化可提高效率。
如图1和图2所示,本发明实施例提供了一种基于GPU的N体模拟程序性能优化方法流程示意图。优化方案主要包括以下步骤:
步骤一、将相关索引信息传入到GPU使得构造短程力列表的过程迁移到GPU上,减少从CPU内存到GPU显存的数据传输,同时使得构造列表的过程并行化。
具体地,短程力列表中由于包中的粒子均有可能在其他包中出现作为其他包的作用粒子,使得最后生成的粒子列表有大量重复的信息,为了减少这部分传输量,具体步骤如下:
分配GPU显存,在显存中提前分配好短程力计算中所需求的target列表、source列表以及相关数组所需的显存空间;在CPU端进行预处理,存储为得到具体粒子信息所需要的索引信息,得到每个包的粒子对应的索引数组t_index、s_index以及在显存中存储的偏移量dev_offset,一起传入到显存;单独使用一个核函数,使每个线程处理单独一个包,根据CPU端传入的索引信息在显存中已经存在的所有粒子的信息进行索引,此过程与CPU端操作相同,得到对应包的粒子;根据各自包的偏移量dev_offset进行存储,生成target列表以及source列表。通过减少内存到显存的数据传输量,不仅减少了数据的传输时间,还通过直接在GPU端并行生成计算所需要的作用列表,减少了初始化短程力作用列表所需要的时间。
步骤二、改变线程块调度的方式,通过GPU的流水调度,将粒子信息轮流加载到GPU的共享内存中,降低重复访存的延迟,提高GPU计算短程力过程中的数据存取效率。
具体地,在GPU对P2P的计算中,在GPU端存取粒子信息普遍通过全局内存,延迟较高。在特定的调度方式下,同一target包中的粒子对source列表中的粒子可能重复调用,因此对低延迟的要求特别高。由于共享内存相比于全局内存有着更小的延迟,通过流水调度source粒子到共享内存中,大幅降低重复访存的延迟。通过改善GPU的调度方式,将粒子信息存入到有限的共享内存中,提高P2P计算时的数据存取效率。具体优化方法如下:
由一个GPU中的一个线程块计算target列表中相同target包中的粒子。可以使得每个包只使用一个线程块,其中的线程分批轮流加载不同的target粒子;也可以使每个包用一个或多个线程块,每个线程计算这个包中的一个target粒子,每个新的包用新的线程块,多余的线程空闲;将部分source列表中的相关粒子加载到共享内存;计算当前线程代表的target粒子与共享内存中的source粒子的相互作用;加载新的source粒子到共享内存继续计算,直到相互作用列表中所有source粒子的acc计算完成。
步骤三、在GPU核心函数中采用插值多项式和混合精度计算短程作用力,CPU上计算好插值常数后传入GPU,存放在GPU的共享内存中,减少除法运算,避免计算特殊数学函数,平均相对误差可达2e-7。
具体地,P2P的核心计算P2P_core中使用了exp(x)、erfc(x)等耗费大量时钟周期的数学函数,需要在保证误差的情况下减少这类函数的使用。
对于相关的函数,在保证误差的情况下对其用插值函数进行运算,比如使用Newton或Chebyshev插值多项式插值计算离散点的函数值;在CPU端计算好插值所需要的系数,传入到显存;在显存中将相关系数存放在共享内存,方便在计算过程中线程重复多次读取,提高效率。
GPU上单精度与双精度浮点运算在通信和计算上的性能差异也是不可忽略的,对于单精度,插值的相对误差可达到2e-7,满足应用的精度要求。因此在GPU程序中,使用单精度浮点运算时间可加快近1倍,数据传输的时间因为字节所占长度减半而加快,具体方案如下:
在保证不影响结果的情况下,可以使用混合精度的方法,使用单精度数常量、变量和单精度计算函数,并且可以考虑使用快速数学库进行优化,仅在有必要的时候使用双精度运算;乘法快于除法,对于GPU端的计算,有在除法中使用到的常数,在CPU端计算好,然后将其倒数作为常数传入GPU,在GPU端进行乘法运算,减少除法相关计算。
步骤四、对GPU上各粒子的短程力计算结果通过重排序,在GPU全局内存对同一粒子的加速度进行规约合并,在所有粒子计算完成后再将最终结果传回CPU,减少从GPU显存到CPU内存数据传输,同时也减少了CPU端信息更新的时间。
具体地,每次完成P2P计算后,都会将数据从显存传输到内存更新粒子的信息,可能会有粒子信息重复传输和重复更新的情况。相应的优化方法如下:
在GPU端分配数组acc,保存该进程所有粒子的加速度;在每次P2P计算的过程中,将每个线程计算后的加速度在显存所存储的target_acc列表进行重排序,使得拥有相同粒子编号(id)的部分规约到同一存储地址;使用一个核函数对重排序的列表进行规约,可将每个线程统计一个粒子加速度,获得每个粒子在这次计算中最终的加速度,再更新到acc数组中,一直在显存中保存该数组到最后一批粒子计算完短程力;在分批计算完所有粒子的P2P相关计算之后,最后一批粒子计算结束时将acc数组从显存传回到CPU内存,将CPU端的粒子信息进行更新。
采用以上优化方案后,在每次计算任务中显存到内存(D2H)的传输以及CPU端对于粒子信息的更新都只进行一次(如图3所示),从而有效减少传输数据量和传输时间,同时也减少了粒子更新时间。
本发明实施例可以减少从CPU内存到GPU显存的数据传输,降低重复访存的延迟,提高GPU计算短程力过程中的数据存取效率,以及减少从GPU显存到CPU内存数据传输,同时也减少了CPU端信息更新的时间。
显而易见,在不偏离本发明的真实精神和范围的前提下,在此描述的本发明可以有许多变化。因此,所有对于本领域技术人员来说显而易见的改变,都应包括在本权利要求书所涵盖的范围之内。本发明所要求保护的范围仅由所述的权利要求书进行限定。
Claims (3)
1.一种基于GPU的N体模拟程序性能优化方法,其特征在于,包括以下步骤:
将相关索引信息传入到GPU使得构造短程力列表的过程迁移到GPU上,同时使得构造列表的过程并行化;
改变线程块调度的方式,通过GPU的流水调度,将粒子信息轮流加载到GPU的共享内存中;
在GPU核心函数中采用插值多项式和混合精度计算短程作用力,CPU上计算好插值常数后传入GPU,存放在GPU的共享内存中;
对GPU上各粒子的短程力计算结果通过重排序,在GPU全局内存对同一粒子的加速度进行规约合并,在所有粒子计算完成后再将最终结果传回CPU;
所述将相关索引信息传入到GPU使得构造短程力列表的过程迁移到GPU上,同时使得构造列表的过程并行化步骤,包括:
在GPU显存中分配短程力计算中所需求的target列表、source列表以及相关数组所需的显存空间;
CPU端将预处理得到的具体粒子信息所需要的索引信息、每个包的粒子对应的索引数组以及在显存中存储的偏移量,传入到显存中;
GPU端单独使用一个核函数,使每个线程处理单独一个包,根据CPU端传入的索引信息在显存中已经存在的所有粒子的信息进行索引,得到对应包的粒子;以及根据各自包的偏移量进行存储,生成所述target列表和所述source列表;
所述对GPU上各粒子的短程力计算结果通过重排序,在GPU全局内存对同一粒子的加速度进行规约合并,在所有粒子计算完成后再将最终结果传回CPU步骤,包括:
在GPU端分配数组acc,保存进程所有粒子的加速度;
在每次P2P计算的过程中,将每个线程计算后的加速度在显存所存储的target_acc列表进行重排序,使得拥有相同粒子编号的部分规约到同一存储地址;
使用一个核函数对重排序的列表进行规约,使每个线程统计一个粒子加速度,获得每个粒子在这次计算中最终的加速度,再更新到acc数组中,一直在显存中保存该数组到最后一批粒子计算完短程力;
在分批计算完所有粒子的P2P相关计算之后,最后一批粒子计算结束时将acc数组从显存传回到CPU内存,将CPU端的粒子信息进行更新。
2.根据权利要求1所述的优化方法,其特征在于,所述改变线程块调度的方式,通过GPU的流水调度,将粒子信息轮流加载到GPU的共享内存中步骤,包括:
在GPU端分配数组acc,保存该进程所有粒子的加速度;
由一个GPU中的一个线程块计算target列表中相同target包中的粒子,每个包只使用一个线程块,其中的线程分批轮流加载不同的target粒子;或使每个包用一个或多个线程块,每个线程计算这个包中的一个target粒子,每个新的包用新的线程块,多余的线程空闲;
将部分source列表中的相关粒子加载到共享内存;
计算当前线程代表的target粒子与共享内存中的source粒子的相互作用;
加载新的source粒子到共享内存继续计算,直到相互作用列表中所有source粒子的acc计算完成。
3.根据权利要求1所述的优化方法,其特征在于,所述在GPU核心函数中采用插值多项式和混合精度计算短程作用力,CPU上计算好插值常数后传入GPU,存放在GPU的共享内存中步骤,包括:
对于GPU端的计算,有在除法中使用到的常数,在CPU端计算好,然后将其倒数作为常数传入GPU,在GPU端进行乘法运算。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110077894.4A CN112765870B (zh) | 2021-01-20 | 2021-01-20 | 一种基于gpu的n体模拟程序性能优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110077894.4A CN112765870B (zh) | 2021-01-20 | 2021-01-20 | 一种基于gpu的n体模拟程序性能优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112765870A CN112765870A (zh) | 2021-05-07 |
CN112765870B true CN112765870B (zh) | 2022-05-06 |
Family
ID=75701965
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110077894.4A Active CN112765870B (zh) | 2021-01-20 | 2021-01-20 | 一种基于gpu的n体模拟程序性能优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112765870B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117690502B (zh) * | 2024-02-04 | 2024-05-17 | 浪潮电子信息产业股份有限公司 | 一种分子动力学模拟系统及方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060241928A1 (en) * | 2005-04-25 | 2006-10-26 | International Business Machines Corporation | Load balancing by spatial partitioning of interaction centers |
CN102955686B (zh) * | 2011-08-18 | 2017-04-05 | 上海大学 | 一种N‑body问题近程作用计算在GPU结构的优化映射方法 |
CN111368484B (zh) * | 2020-03-19 | 2022-04-15 | 山东大学 | 基于神威架构的宇宙n体数值模拟优化方法及系统 |
-
2021
- 2021-01-20 CN CN202110077894.4A patent/CN112765870B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN112765870A (zh) | 2021-05-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Greathouse et al. | Efficient sparse matrix-vector multiplication on GPUs using the CSR storage format | |
US9529590B2 (en) | Processor for large graph algorithm computations and matrix operations | |
US8108659B1 (en) | Controlling access to memory resources shared among parallel synchronizable threads | |
Verschoor et al. | Analysis and performance estimation of the conjugate gradient method on multiple GPUs | |
EP2657842B1 (en) | Workload optimization in a multi-processor system executing sparse-matrix vector multiplication | |
CN111368484B (zh) | 基于神威架构的宇宙n体数值模拟优化方法及系统 | |
US20230315464A1 (en) | Method and tensor traversal engine for strided memory access during execution of neural networks | |
CN104765589A (zh) | 基于mpi的网格并行预处理方法 | |
CN114730275A (zh) | 使用张量在分布式计算系统中进行矢量化资源调度的方法和装置 | |
CN112765870B (zh) | 一种基于gpu的n体模拟程序性能优化方法 | |
Hong et al. | Multi-dimensional parallel training of winograd layer on memory-centric architecture | |
KR20210044180A (ko) | 고급 상호 연결 통신기술을 이용한 ai 훈련 가속화 방법 및 시스템 | |
Zhang et al. | An fast simulation tool for fluid animation in VR application based on GPUs | |
Bisson et al. | A cuda implementation of the pagerank pipeline benchmark | |
Morimoto et al. | Hardware acceleration of tensor-structured multilevel ewald summation method on MDGRAPE-4A, a special-purpose computer system for molecular dynamics simulations | |
CN116842304A (zh) | 一种不规则稀疏矩阵的计算方法及系统 | |
CN114428786A (zh) | 分布式流水线的数据处理方法、装置及存储介质 | |
Koike et al. | A novel computational model for GPUs with applications to efficient algorithms | |
CN110021339B (zh) | 基于蛋白质折叠测算蛋白质结构的集群并行计算加速方法 | |
Lee et al. | Row-Wise Product-Based Sparse Matrix Multiplication Hardware Accelerator With Optimal Load Balancing | |
Tabuchi et al. | The 16,384-node parallelism of 3D-CNN training on an arm CPU based supercomputer | |
Yang et al. | Learninggroup: A real-time sparse training on fpga via learnable weight grouping for multi-agent reinforcement learning | |
Zhou et al. | Accelerating Broadcast Communication with GPU Compression for Deep Learning Workloads | |
Zhao et al. | Optimization of cosmological N-body simulation with FMM-PM on SIMT accelerators | |
Kukutla | TC-GVF: Tensor Core GPU Based Vector Fitting Via Accelerated Tall-Skinny QR Solvers |
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 |