使用多核 CPU 趋近实时 C-arm 重建
图 1.(左)C-arm CT 系统的介入应用(图片由西门子公司提供)。(右)通过 RabbitCT 数据集重建的三维体获得的轴向切面图。
Hannes G.Hofmann,德国埃尔朗根大学模式识别实验室。
Hannes 是埃尔朗根大学的博士研究生,从事加速图像重建技术的研究。他的研究方向包括医学图像处理、并行架构的高性能计算和性能指标评测,目前主要关注使用多核服务器的 C-arm CT 图像实时重建。
Hannes 已取得了埃尔朗根大学计算机科学专业的理学硕士学位。
摘要:
三维(3-D)计算断层扫描(CT)成像技术有助于医疗人员更加精确地诊断疾病,改进治疗计划及导航,展开深入的后续研究。C-arm CT 系统(如图 1(左) 所示)可从患者的不同角度捕获大量二维平面投影。目前,临床上最常用的三维数据重建算法是滤波反投影法(filtered backprojection)。简单地说,就是将所有投影值抹入三维体中。重建属于计算密集型任务,而且由于使用的数据集庞大,因而需要高内存带宽。使用 C-arm 系统,3-D 数据也可在介入期间获得,从而支持新的医学应用。不过,OR 环境需要多至 60 fps 的实时处理,包括 2-D 预处理、3-D 重建和 3-D 后处理。在研究中,我们对 GPU 及多核处理器在动态执行 C-arm CT 数据重建方面的适用性进行了探索。
所使用技术说明:
我们基于 Feldkamp [1] 的 CT 重建针对多线程、向量化处理和高速缓存利用进行了优化。算法 1 显示了对全部 496 投影图像执行的基本算法。三维体大小为 512^3 体素。为获得可比较的结果,同时做正确性评估,我们使用了 RabbitCT [2] 基准测试。优化后的实施分别在两台英特尔至强多核服务器(8 核和 24 核)上进行测试。
24 核服务器配备了四枚六核 Hexacore CPU(至强 7460)和 32GB DDR2 RAM,
另一个系统采用两枚 四核Quadcore CPU(至强 5550),并配有集成内存控制器和 12GB DDR3 RAM。
两个系统均在 2.66 GHz 下运行且均使用 Linux。此报告使用的服务器为预生产系统。正式生产的硬件有望达到相似的性能级别。
算法 1.投影图像反投影的基本步骤。x、y、z 代表离散体坐标,u、v 为连续投影坐标。
多线程。我们对两种多线程方法进行了研究,OpenMP 和英特尔线程构件模块 (TBB)。并行化通过将三维体划分为 NP 个块(NP 代表可用内核的数量)而引入。这样,所有块都可以独立进行处理。两次实施都没在该步骤使用 CPU 的矢量处理 (SSE) 单元。它们在采用不同编译器(GNU gcc 和英特尔 C 编译器)的两台服务器上进行了测试。
图 2 显示了对比标量单线程实施的速度提升情况。结果,使用 gcc 的情况下,TBB 比 OpenMP 快 10-20%。英特尔 C 编译器的 OpenMP 实施与 TBB 速度相当。注意,感谢超线程技术,8 核服务器上可能实现超线性加速(多至 11.28 倍)。
向量化。在第二步中,使用了 CPU 的向量处理单元。这些单元同时对多个数据元素执行了相同的指令(如乘法)(简称 SIMD)。现在的 CPU 一次可处理 4 个单精度数字。
算法 1 的最内部循环体(对一列内的每个体素(有着固定的 y 和 z 坐标)执行同样的计算)被手动向量化。。对于大多数情况来说,此操作很简单。
不过,对于条件代码部分,向量化则颇为复杂,这是因为一个矢量的单个元素不确定是否有分支。如果当前体素位于当前投影的视场 (FOV) 内,则反投影将包含一个校检以避免无效的内存访问。无效坐标及对应的体素使用掩码被排除在下一步处理之外。
另一个问题是由几何体引发的。邻近的体素没有必要投射到投影图像的相邻体素中。这在加载体素矢量的投影值时将导致非线性内存访问。因此,所有体素将不得不以标量方式获取,然后被插入到随后用来计算双线性插值的 SIMD 矢量中。
图 3. 两个 Linux 系统在向量化、多线程和高速缓存优化后与使用英特尔编译器的单线程实施的速度提升对比。
图 3 的第一列显示 SIMD 优化的速度提升。在两个系统中,单线程向量化代码的速度均比标量代码快约 2.9 倍。由于上述问题,速度无法实现理论上最大的 4 倍提升。将多线程与向量化结合(列 2 和列 3),8 核和 24 核服务器分别实现了 29.5 倍和 43.5 倍的加速。如果只将这些数字与多线程进行比较,向量化取得的效果分别减少到 2.6 倍和 1.9 倍。这表明,在使用所有处理单元时,24 核服务器的内存带宽成为问题瓶颈。
高速缓存优化。高速缓存优化的思路是将数据保留在计算内核中,在对其进行多次运算后再存回主内存。对每个投影图像直接执行算法 1 将导致每次都需要读取和写入整个三维体。在 512^3 体素情形中,每个投影图像将生成 1GB 的数据传输。
为减少数据传输量,仅将少量体素加载到高速缓存,并从几个投影图像获得更新,然后再存回去。这样,数据传输可以整体减少到 1GB(仅体数据),大大减少了对内存带宽的需求。
图 3 的右列显示,高速缓存优化仅为 8 核服务器带来了微弱优势 (5%),此处少数处理器共享着充足的主内存带宽。另一方面,24 核服务器却从中明显受益,因为内存带宽是它的限制因素。
结论
我们证实了选择不同库和编译器对代码性能有着显著的影响。英特尔的 C 编译器和 OpenMP 实施比 GNU gcc 的速度提升了 20%。
本文中讨论的重建问题可以通过增加内核得到很好地解决。但是,基于酷睿2的服务器却由于内存带宽限制而无法充分利用其 24 个CPU。优化高速缓存缓解了这一限制,使速度比单线程标量实施提升多至 58.57 倍。
此外,在英特尔多核测试实验室 (Many Core Testing Lab) (http://software.intel.com/en-us/articles/intel-many-core-testing-lab/
) 进行的实验表明,带有 32 个内核的基于 Nehalem 的服务器速度提升明显。本研究的更多详情将在 [3, 4] 给出。