Page 329 - 《软件学报》2021年第9期
P. 329

田卓  等:神威太湖之光上分子动力学模拟的性能优化                                                        2953


                                                    k 2


                                                    i      k 1
                                               func1
                                                  -func1
                                              j            k 0
                                          Fig.14   Inter-atomic forces
                                            图 14   原子间作用力
             在分子动力学模拟中,分子间作用力的计算时间占 80%以上                   [18,19] ,是最重要的部分,也是发挥神威机器计算
         性能的关键所在.在迭代过程中,计算核心需要频繁地交互粒子信息,以保证分子间作用力计算的准确性.神威
         机器高延迟的特点,将使粒子信息的交互遇到瓶颈,此类应用会限制神威性能的发挥.程序特点是典型的 BSP 模
         式,如图 15 所示.每个迭代步将粒子的位置,速度等信息存储在一个向量中,该向量包含多个分量.粒子间作用力
         的计算只涉及到其邻居粒子,向量的不同分量间具有局部相关性.即:后面的分量是由前面几个分量计算而来,
         仅与前面的几个分量有关.数据的局部相关性和依赖性,导致具有一定的异步性.

                                                      开始
                                                初始化,粒子位置,速度,
                                                加速度,模拟参数等信息
                                                  由粒子位置,计算
                                                粒子之间的相互作用力
                                                      同步
                                                由新的受力更新加速度

                                                    更新速度

                                                    更新位移
                                                      同步

                                 Fig.15    Implementation process of parallel algorithm
                                          图 15   并行实现算法流程图

         2.2.2    改变计算模式,减少通信次数,优化消息个数
             在原来的计算模式中,向量的一个分量在计算过程中会产生一些中间数据,另外的分量可以利用.向量的不
         同分量之间是相互依赖的关系,是紧耦合的,导致芯片内部通过主存的这种数据传输和数据交换会大量增加.我
         们打破了这种依赖,变为松耦合,把原来互相写同步的计算模式变成了每个线程自己去做多步的计算,是独立计
         算,减少迭代步中间的同步次数,更流水化.代价是会造成计算量少量增加,但是整个吞吐率反而提高了.
             多体作用模型中,如图 16 所示,计算 i 粒子受到邻居 j 的作用力时,其他 3 个邻居 k 0 ,k 1 ,k 2 也对 i 粒子产生了
         作用力.这意味着 j,k 0 ,k 1 ,k 2 分别受到了来自 i 粒子的反作用力,需要从它们的受力上减去.考虑 i 粒子的全部受力,
         不仅需要计算它受到其邻居粒子的作用力,还需要计算 i 粒子作为邻居粒子时,它所受到的反作用力.如图 17 所
         示,当 i 粒子作为 j 的邻居粒子时,它会受到 j 粒子对它的反作用力−func3.此外,如图 18 所示,j 粒子在计算它的邻
         居 k 对其作用力时,会对 i 产生一个反作用力−func4,也需要从 i 粒子的受力上减去.
             具体做法如下:
             (1)  计算 i 粒子受到的作用力.i 粒子所受到的作用力来自于它的所有邻居粒子.虚代码如图 19 所示.变量
                 j 循环 i 粒子的所有邻居,例如,i 粒子的第 0 个邻居 j=0 时,计算 j 对 i 的作用力 func1.变量 k 循环 i 粒
   324   325   326   327   328   329   330   331   332   333   334