CT图像SART重建技术的CUDA并行实现
史怀林,孙丰荣,姜 威,刘 炜,秦 通,李新彩
【摘 要】摘 要:在计算机断层扫描(CT)图像重建领域,当投影数据不完备或者含有噪声时,相对于滤波反投影(FBP)算法,联合代数重建方法(SART)能重建出质量更高、更符合临床诊断要求的图像。但SART方法非常耗时,而算法的并行实现是解决这一问题的有效途径之一。提出一种基于nVIDIA通用设备计算架构(CUDA)实现的SART并行运算方法。实验结果表明,该方法在不牺牲重建图像质量的基础上,重建时间大为缩减,更有利于临床应用。 【期刊名称】计算机应用 【年(卷),期】2011(031)005 【总页数】4
【关键词】关键词:计算机断层扫描;图像重建;联合代数重建技术;并行计算;通用设备计算架构
0 引言
计算机断层扫描(Computed Tomography,CT)图像重建领域主要存在两大类方法:解析法与迭代法。当投影数据采集不完备(例如欠采样与有限角)或者存在较大噪声时,解析法重建出的图像很难达到临床诊断要求[1]。此时,以联合代数重建技术(Simultaneous Algebraic Reconstruction Technique,SART)[2]为代表的迭代算法成为首选,但SART非常耗时,在对实时性要求较高的场合,难以得到实际应用。近些年来,为了能够缩短重建时间,众多学者开始从硬件结构、基于硬件的软件加速以及并行运算等方面入手进行了大量的深入研究。
1994年,Calbral等人[3]在SGI工作站的通用纹理硬件上采用滤波反投影(Filtered Back-Projection,FBP)方法重建出锥束CT图像。曾理等人[4]在对螺旋锥束CT算法适当改进的基础上,利用工作站机群(Cluster of Workstation,COW)并行加速重建出与串行算法相同质量的图像。Scherl等人[5]在图形处理器(Graphic Processing Unit,GPU)上利用通用设备计算架构(Compute Unified Device Architecture,CUDA)较快实现了FDK(Feldkamp)[6]的并行重建;在此基础上,Okitsu等人[7]采用减少片外存储访问、隐藏存储时延等技巧对FDK并行算法进行优化,缩减了近一半重建时间。Lu等人[8]亦对SART算法的并行化进行了富有成效的研究。 本文提出一种基于CUDA通用计算平台的SART并行实现方法,该方法的主要技术有:1)基于射线驱动的正投影技术;2)基于CUDA的并行遍历方法;3)基于体素驱动的反投影技术。实验结果表明,这种基于CUDA并行实现的SART算法在不牺牲重建图像质量的基础上,时间性能得到极大提升,这有着较为重要的工程应用价值。另外,本文对常规串行算法的并行化改进、遍历算法的引入与实现等方面也有较强的探索意义。
1 SART与CUDA的基本原理
1.1 SART 重建技术
CT图像重建可被转化为如下代数方程[9]:
其中:F即为待求的N个体素值(N=n3);P=[p1,p2,…,pM]T为M(总射线数目)维投影数据向量;W是M×N维系统矩阵,其元素wij表示第j个体素fj对于第i个投影数据pi的贡献,在本方法中,wij被赋值为第i条射线穿过第j个体素空间的长度。
实际应用中,鉴于N与M十分庞大,传统的矩阵方法已经不能够将F高效地求解出来。于是,数学迭代方法ART[10]及其改进技术SART被提出并得到应用。ART公式可表示如下:
而作为ART的改进技术,在SART算法中,子迭代过程以投影角度为单位,体素值是逐投影更新的,这不同于以射线为单位逐条更新的ART算法。换言之,在SART中,每个像素的修正值是同一投影角度内通过该像素的所有射线修正值的平均,其实质就是对噪声进行平滑,这也就使得SART能够更好地抑制带状伪影,得到比ART更加平滑的重建图像[11]。SART子迭代过程可分解为如下两步[1]:
其中:与分别为第k与k+1次子迭代过程中的第j个体素值,pi与表示第i条射线的投影值与线积分值为第i条射线穿过整个体素空间的长度,λ为松弛因子,Iφ代表投影角度φ下的所有射线集合。 1.2 CUDA 并行平台
通用设备计算架构(CUDA)是nVIDIA最新推出的并行计算架构,该架构充分利用GPU的数值处理能力,使大量线程(thread)能够并行执行高度并行化的内核(kernel),从而大幅提升计算性能。与计算机集群、多核运算等其他加速方案相比,CUDA在运算性能、经济性与便捷性等各方面均有着很大的优势,目前已被广泛应用于物理学、计算化学、生物医学等多个领域[12]。
在CUDA架构下,一个程序被分为host端与device端两个部分,分别在CPU与GPU上运行。通常host端程序会将准备好的数据复制到显存中,由GPU并行执行device端程序,完成后再由host端程序将结果从显存中取回。同时,可以利用显卡的高速共享内存(share memory)与可缓存的纹理单元