读文献Accelerating molecular dynamics simulations using Graphics Processing Units with CUDA

来源:互联网 发布:算法导论第四版 豆瓣 编辑:程序博客网 时间:2024/06/11 14:22

   最近一直在忙着准备几天后的一个学期总结性质的会议,一直没时间写,趁着看这篇文祥的机会,写一点来请教一下。

Accelerating molecular dynamics simulations using Graphics Processing Units with CUDA

一、Introduction

二、Molecular dynamics simulation

三、Previous Work on accelerating molecular dynamics

四、The CUDA programming model

五、The CUDA-based MD simulation algorithm

六、Performance evaluation

  以上是此文的行文思路,我不是全文翻译,只是挑出里面我最感兴趣以及不明白的地方和大家分享。

1. 在第一部分In order to exploit the GPU’s capabilities for high performance MD simulation, we present a new algorithm for non-bonded short-range interactions within the atom system这里的non-boud short-range interactions 直译就是短程无键相互作用,为什么这里用这个呢??还有其他的长程、有键相互作用呢??(后面又讲到长程,但是也不懂)

2. 在第二部分提到由于计算力花费90%的模拟时间,因此设置一个cutoff,这个可以理解。但是后面又提到When the neighbor list is built, all of the nearby atoms within an extended cutoff distance rlist = rc + skin are stored.这里为什么还要加上一个skin啊??

3. 第三第四部分主要就是介绍GPU以及CUDA用于MD模拟的一些相关知识,比如GPU架构、加速策略等。

最最重要的,也是本文的核心就是第五部分。

4. 以数据分割作为任务划分的依据将加速方法分成以下几种类型:

1) AD即原子分割,一个处理器负责N/P个原子(N是原子总数,P是处理器数目)。每个处理器要保持一个相同的原子信息副本。

2) FD即力的分割,就是一个处理器负责一部分力,然而它并不能像AD那样轻易的保持负载平衡。

3) SD即空间分割。对于course-grained architectures, such as clusters来说,它比前两种方法要好。    

5. 本文选择的是AD方法,原因有以下两种

1) 良好的负载平衡以及可测量性可以轻易实现。

2) 在第三部分讲过GPU硬件是基于共享存储器的多处理系统,AD方法在这种系统上能够很好的表现。

6. 以下是进行分子动力学模拟的基本步骤:

  之所以在这里列出来是想告诉大家,在利用GPU运算时,要找出运算量最大,并行度能够达到最大的部分,将这一部分放在GPU上运行。在这里呢,作者说经过分析,其中Neighbor list update and Force calculation花费了超过97%的时间,因此将这两个部分移到GPU上进行运算。

7. 要利用CUDA编写一个高效的parallel neighbor list update 程序时,必须考虑在不同blockthread之间是无法同步或者通信的。 文中说到we have decided to use a partitioning of D into threads and thread blocks as illustrated in following figure :each column is assigned to a single thread and there are two threads in a thread block. 

     

    我在这里只是说一说我自己的理解啊,大家可以参考一下下,希望能够和你分享你的所得。

其实就是为每一个粒子建立一个类似栈的东西,而栈顶就是这个粒子,一个线程处理一个栈,计算位移、力以及能量等等都是以这个粒子为中心,同时又将两个thread作为一个block,又方便了各个粒子之间数据的交流。

    但是我不明白的是,这里既然每个thread都处理所有的粒子,那么thread间的通信又是为了什么呢??一个线程只能更新一个粒子的数据啊????那么岂不是这些block都要同步才行??

8. 在随后的行文里作者又讲到前面的方法会有多个kernel,这也是为了避免block之间通信不畅的问题的,但是由于两个kernel要重复交替运行,这样数据拷贝的时间开销就会很大,因此作者说要将程序合并成一个kernel,但是这样前面费了一些篇幅讲解的关于ADFDSD的方法就不能用了,这里他用二叉树的方法来寻找移动位移最大的粒子。但是让我郁闷的是这样有什么用吗???这对于neighbor list update有什么作用啊??

 

 全文看到这里,说句实话啊,很是糊涂啊,是那种一会明一会暗,忽明忽暗的感觉,越仔细看,越不明白。

原创粉丝点击