技术开发 频道

CUDA使用心得——以流线生成为例

  【IT168 技术】

  注:本文为IT168&NVIDIA联合举办的“如何并行化我的应用”方案征集活动参赛作品。本次方案征集活动详情见:http://cuda.itpub.net/thread-1299715-1-1.html。近期活动的大部分方案,将会逐步与大家分享,不可错过哦!

  CUDA ZONE专区:http://cuda.it168.com/

  CUDA技术论坛:http://cuda.itpub.net

  正式接触可视化与图形学研究之前,就对GPU通用计算有所耳闻。从最初的道听途说,到现在的频繁使 用,GPU性能及特性也飞速发展,其可编程能力也大大提升。特别是CUDA(Compute Unified Device Architecture,计算统一设备架构)语言诞生后,使用GPU加速成为了对很多算法最直接、最有效的一种加速手段。CUDA极大程度上隐藏了传统 GPGPU使用时的图形接口及内部实现,且语法既通用又友好,文档齐全,易于上手,成为了使用GPU进行通用计算的首选工具。初学CUDA后,我尝试将流线生成进行加速,效果甚好。下面以此为例,浅谈一点心得体会。

  流体可视化(Flow Visualization)是科学可视化的一个重要分支,它将实际测量、计算模拟所得的流体数据转化成图像,以帮助科学家理解、分析流体数据。流体可视化对理论研究及工程应用有巨大的推动作用。其中,流线(Streamlines)是最有效的流体可视化手段之一,它用最基本的几何元素——曲线将流体场中 的速度信息表示出来。流线上每一点的切线方向与该点的速度方向相同,因此我们可以采用数值求解一阶微分方程的方法求得流线。在实践中,往往需要产生很多流线,以充分地显示流场中的信息。计算每条流线时,需要从事先给定的初值点(种子点)出发,做自适应步长的龙格-库塔(Runge-Kutta)数值积分, 若当前点落入计算网格中间时,还需要进行插值处理。如果仅使用CPU计算流线,运算负担可想而知。这里,我们可以利用GPU强大的并行性能及运算能力,并行地生成每一条流线,提高运算效率。

  利用CUDA实现这一算法时,将初值点及流场数据作为输入参数,输出为一数组,该数组存储流线上的每一点。选择适当的块大小,即可调用核函数。流场数据是利用CUDA与OpenGL的互操作性,以二维纹理或三维纹理的形式传入的,流场各方向分量的数据存储在该纹理的不同通道中(例如RGB三个通道分别存储x、y、z三个方向上的速度大小值)。这样在每步运算中,就可以借助GPU硬件对纹理的采样及三线性 差值,高效、准确地得到该点的速度值。这其中如果任何一步在CPU上处理,运算效率与内存访问恐怕都难以赶上GPU的效率,在实验中也取得了证实。进一步而言,GPU上可以并行地生成流线,而用传统方法并行这一过程,需要付出高昂的代价。

  当然,这一方案只是沧海一粟,CUDA还可以将很多应用并行化,并大大加速。这种加速可将过去不能交互的应用实时化,将原来成本高昂的应用不再遥不可及,而且必将对计算机的发展产生深远的影响。

0
相关文章