本节主要介绍NBody算法的OpenCL性能优化。

1、NBody

    NBody系统主要用来通过粒子之间的物理作用力来模拟星系系统。每个粒子表示一个星星,多个粒子之间的相互作用,就呈现出星系的效果。

AMD OpenCL大学课程(12) 性能优化案例NBody

 

   上图为一个粒子模拟星系的图片:Source: THE GALAXY-CLUSTER-SUPERCLUSTER CONNECTIONhttp://www.casca.ca/ecass/issues/1997-DS/West/west-bil.html

   由于每个粒子之间都有相互作用的引力,所以这个算法的复杂度是N2的。下面我们主要探讨如何优化算法以及在OpenCL基础上优化算法。

2、NBody算法

   假设两个粒子之间通过万有引力相互作用,则任意两个粒子之间的相互作用力F公式如下:

AMD OpenCL大学课程(12) 性能优化案例NBody

   最笨的方法就是计算每个粒子和其它粒子的作用力之和,这个方法通常称作N-Pair的NBody模拟。

   粒子之间的万有引力和它们之间的距离成反比,对于一个粒子而言(假设粒子质量都一样),远距离粒子的作用力有时候很小,甚至可以忽略。Barnes Hut 把3D空间按八叉树进行分割,只有在相邻cell的粒子才直接计算它们之间的引力,远距离cell中的粒子当作一个整体来计算引力。

AMD OpenCL大学课程(12) 性能优化案例NBody

3、OpenCL优化Nbody

     在本节中,我们不考虑算法本身的优化,只是通过OpenCL机制来优化N-Pair的NBody模拟。

     最简单的实施方法就是每个例子的作用力相加,代码如下:

// Use ax, ay, az to update particle positions
}

我们对每个粒子计算作用在它上面的合力,然后求在合力作用下,delta时间内粒子的新位置,并把这个新位置当作下次计算的输入参数。

AMD OpenCL大学课程(12) 性能优化案例NBody

没有优化的OpenCL kernel代码如下:

// write to global memory
newPosition[gid] = newPos;
newVelocity[gid] = newVel;
}

在这种实现中,每次都要从global memory中读取其它粒子的位置,速度,内存访问= N reads*N threads= N2

我们可以通过local memory进行优化,一个粒子数据读进来以后,可以被p*p个线程共用,p*p即为workgroup的大小,对于每个粒子,我们通过迭代p*p的tile,累积得到最终结果。

AMD OpenCL大学课程(12) 性能优化案例NBody

优化后的kernel代码如下:

// write to global memory

newPosition[gid] = newPos;

newVelocity[gid] = newVel;
}

下面是在AMD, NV两个平台上性能测试结果:

AMD GPU = 5870 Stream SDK 2.2

Nvidia GPU = GTX 480 with CUDA 3.1

AMD OpenCL大学课程(12) 性能优化案例NBody

另外,在程序中,也尝试了循环展开,通过展开内循环,从而减少GPU执行分支指令,我的测试中,使用展开四次,得到的FPS比没展开前快了30%。(AMD 5670显卡)。具体实现可以看kernel代码中的__kernel void nbody_sim_unroll函数。在AMD平台上,使用向量化也可以提高10%左右的性能。

最后提供2篇NBody优化的文章:

—Nvidia GPU Gems

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch31.html

—Brown Deer Technology

http://www.browndeertechnology.com/docs/BDT_OpenCL_Tutorial_NBody.html

完整的代码可从:http://code.google.com/p/imagefilter-opencl/downloads/detail?name=amduniCourseCode7.zip&can=2&q=#makechanges 下载。

相关文章:

  • 2021-08-23
  • 2021-07-30
  • 2021-08-31
  • 2021-10-07
  • 2021-08-18
  • 2021-09-11
  • 2021-06-10
猜你喜欢
  • 2021-07-04
  • 2021-09-29
  • 2021-09-24
  • 2022-02-07
  • 2021-11-16
  • 2021-09-09
  • 2021-06-28
相关资源
相似解决方案