一种基于GPU的OCT成像方法及系统转让专利

申请号 : CN202111611454.9

文献号 : CN114331805B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李敏吕晶任林王艳周镇乔贾宏博陈月岩王斯博唐玉国

申请人 : 中国科学院苏州生物医学工程技术研究所

摘要 :

本发明公开一种基于GPU的OCT成像方法及系统,方法包括步骤:CPU主机端分配固定内存;GPU设备端获取GPU变量并对其进行单次设备初始化;重复GPU变量获取和单次设备初始化,直至停止采集;显示图像;GPU设备端采用C++类的析构函数完成GPU设备内存的自动释放;单次设备初始化包括:采用构造函数分配GPU设备内存;创建第一异步流绑定cuFFT plan,创建第二异步流绑定cuFFT plan;将每一帧数据分为第一帧和第二帧;第一异步流对应第一帧、第二异步流对应第二帧并行交替执行数据传入、数据处理以及传出图像数据。本发明通过对CPU端分配固定内存进行内存优化管理,利用异步流构架结合C++类的成员函数,实现CPU和GPU的异步运行,实现MHz高速的OCT图像实时处理。

权利要求 :

1.一种基于GPU的OCT成像方法,其特征在于,其包括以下步骤:在CPU主机端分配一固定内存存放采集的原始干涉信号数据;

GPU设备端访问所述CPU主机端,获取GPU变量并对其进行单次设备初始化;

重复所述GPU变量获取和所述单次设备初始化,直至停止采集;

所述CPU主机端显示图像;所述GPU设备端采用C++类的析构函数完成GPU设备内存的自动释放;

其中,所述单次设备初始化包括:

采用C++类的构造函数对所述GPU变量分配GPU设备内存;

创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan;将B‑Scan图像高度的每一帧数据按先后顺序依次分为第一帧和第二帧;所述第一异步流对应所述第一帧,所述第二异步流对应所述第二帧,并行交替执行数据传入、数据处理以及传出图像数据给所述CPU主机端;

所述并行交替执行,包括以下步骤:

当所述第一异步流在所述GPU设备端上执行将当前帧的所述第一帧数据进行所述数据处理时,所述第二异步流并行执行将当前帧的所述第二帧从所述CPU主机端传入所述GPU设备端;

当所述第二异步流在所述GPU设备在设备端上执行将当前帧的所述第二帧数据进行所述数据处理时,所述第一异步流并行执行将下一帧的所述第一帧数据从所述CPU主机端传入所述GPU设备端;

所述固定内存的大小为B‑Scan图像宽度×B‑Scan图像高度×2字节;所述B‑Scan图像宽度为每次进行A‑Scan的点数,所述B‑Scan图像高度为包含所述A‑Scan的行数。

2.如权利要求1所述的基于GPU的OCT成像方法,其特征在于,所述GPU变量至少包括所述原始干涉信号数据、所述传出图像数据以及中间变量,所述中间变量至少包括设备端变量、数组常量、异步流、cuFFT资源。

3.如权利要求1所述的基于GPU的OCT成像方法,其特征在于,所述数据处理包括依次的补零、加窗、FFT、取对数、归一化和极坐标变换。

4.如权利要求3所述的基于GPU的OCT成像方法,其特征在于,所述数据处理还包括:为所述B‑Scan图像的每一个像素点创建一个线程,并且利用static关键字进行修饰。

5.一种基于GPU的OCT成像系统,该系统基于如权利要求1‑4任一项所述的基于GPU的OCT成像方法进行OCT成像,其特征在于,其包括:CPU主机端,其用于分配一固定内存存放采集的原始干涉信号数据、显示图像;

GPU设备端,其通过访问所述CPU主机端获取GPU变量并对其进行单次设备初始化,重复所述GPU变量获取和所述单次设备初始化,直至停止采集;

其中,所述GPU设备端还采用C++类的析构函数完成GPU设备内存的自动释放;

所述单次设备初始化包括:

采用C++类的构造函数对所述GPU变量分配GPU设备内存;

创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan;将B‑Scan图像高度的每一帧数据按先后顺序依次分为第一帧和第二帧;所述第一异步流对应所述第一帧,所述第二异步流对应所述第二帧,并行交替执行数据传入、数据处理以及传出图像数据给所述CPU主机端;

所述GPU设备端还包括:

内存释放模块,其用于GPU设备内存的自动释放;

单次设备初始化模块,其包括内存分配单元、异步流创建单元;所述内存分配单元采用C++类的构造函数对所述GPU变量分配所述GPU设备内存;所述异步流创建单元用于创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan;

所述固定内存的大小为B‑Scan图像宽度×B‑Scan图像高度×2字节;所述B‑Scan图像宽度为每次进行A‑Scan的点数,所述B‑Scan图像高度为包含所述A‑Scan的行数。

6.如权利要求5所述的基于GPU的OCT成像系统,其特征在于,所述单次设备初始化模块还包括:补零单元,其用于对传入所述GPU设备端的数据进行补零处理;

加窗单元,其用于对补零后的数据进行加窗处理;

FFT单元,其用于对加窗处理后的数据进行FFT变换;

取对数单元,其用于对FFT变换后的数据进行取对数处理;

归一化单元,其用于对取对数处理后的数据进行归一化处理;

极坐标单元,其用于对归一化处理后的数据进行极坐标变换处理。

说明书 :

一种基于GPU的OCT成像方法及系统

技术领域

[0001] 本发明涉及OCT系统数据处理技术领域,更具体地说,本发明涉及一种基于GPU的OCT成像方法及系统。

背景技术

[0002] 光学相干层析扫描(optical coherence tomography,OCT)是一种可以对生物组织实时、在体、高灵敏度、高分辨率及非侵入性的光学成像方法,具有2~10可以的空间分辨率和1~3mm的成像深度,其横向分辨率和成像深度介于超声和显微镜之间。自基于导管的OCT提出以来,内窥OCT自提出至今得到了迅速的发展,能实现对胃肠道和呼吸道检查、消化道肿瘤检测、心血管疾病诊断、淋巴管、胆管和冠状动脉等生物组织的功能成像,目前在医学领域有着广泛的应用。
[0003] 针对OCT快速诊断的需求,其实时成像变得越来越重要和迫切,更快的成像速度可以实时、高时间分辨率地观测某些快速的生理活动,如血流等。且当OCT的成像速度大于组织生理运动速度可以减少运动伪影。OCT的成像速度通常是由轴向扫描(A‑Scan)速度决定的。在过去十几年的时间内,扫频光源的扫频速率从数百kHz提高到上MHz,取得了非常大进步,这使得扫频OCT(SSOCT)系统极大地缩短了采集时间,提高了采样速率,从而为SSOCT系统在进一步提高成像速度方面带来很大的发展空间。
[0004] 扫描光源扫频速率的提高,对SSOCT系统后端数据的采集和处理,带来了巨大的技术挑战。因为,光源扫频速率提高后,单位时间内采集的数据量会极具增大,为了得到组织的深度信息,这就需要硬件具有很强计算处理能力,以快速完成SSOCT系统较大的数据吞吐量和复杂的图像处理,才能够达到提高成像速度的目的。
[0005] 目前,OCT一般采用CPU、FPGA和GPU进行数据处理,由于CPU作为PC机运算和控制核心,是将OCT系统中采集的原始干涉信号提取到上位机,然后在上位机上通过软件做FFT变换和图像显示,这种软件处理方案的执行效率非常低,已经无法满足SSOCT系统高速成像产生大量数据的处理能力。FPGA是一种可编程的逻辑阵列硬件架构,但是对于编程人员来说,其编程难度大,开发周期较长,且目前并没有将FPGA应用于兆赫兹频率的OCT系统。目前OCT数据处理较为常用的是利用GPU多线程进行数据加速,利用GPU和CPU的协同能力,CPU负责调用GPU,GPU利用内部高速带宽和超高的计算力进行数据传输和数据并行计算,但对于兆赫兹这种大数据量实时处理,若不优化GPU内存依然很难实现实时处理显示。
[0006] 现有技术中,专利CN201510139729.1公开一种基于GPU的OCT成像处理方法,在GPU上的处理包括:将原始数据转换为浮点型数据、初始化插值定标文件数据和参数值、进行k空间的插值、傅里叶变换和取对数运算。虽然一定程度上提高了运算速率,但没有阐述GPU端的具体运算方法和最终计算能力,对于数据量更大和算法复杂度更高的OCT系统不太适应。专利CN201210513156.0公开一种基于GPU平台的眼科频域OCT系统和处理方法,该专利利用GPU对数据进行了加速实现了2D实时扫描,但其只是利用GPU加速硬件资源并结合常规GPU加速算法加快了频域OCT处理,常规GPU处理达不到该专利所述的MHz OCT系统实时处理速度需求。

发明内容

[0007] 针对上述技术中存在的不足之处,本发明提供一种基于GPU的OCT成像方法及系统,通过对CPU端分配固定内存进行内存优化管理,利用异步流构架结合C++类的成员函数,实现CPU和GPU的异步运行,实现MHz高速的OCT图像实时处理。
[0008] 为了实现根据本发明的这些目的和其它优点,本发明通过以下技术方案实现:
[0009] 本发明实施例提供一种基于GPU的OCT成像方法,其包括以下步骤:
[0010] 在CPU主机端分配一固定内存存放采集的原始干涉信号数据;
[0011] 所述GPU设备端访问所述CPU主机端,获取GPU变量并对其进行单次设备初始化;
[0012] 重复所述GPU变量获取和所述单次设备初始化,直至停止采集;
[0013] 所述CPU主机端显示图像;所述GPU设备端采用C++类的析构函数完成GPU设备内存的自动释放;
[0014] 其中,所述单次设备初始化包括:
[0015] 采用C++类的构造函数对所述GPU变量分配所述GPU设备内存;
[0016] 创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan;将B‑Scan图像高度的每一帧数据按先后顺序依次分为第一帧和第二帧;所述第一异步流对应所述第一帧,所述第二异步流对应所述第二帧,并行交替执行数据传入、数据处理以及传出图像数据给所述CPU主机端。
[0017] 优选的是,所述并行交替执行,包括以下步骤:
[0018] 当所述第一异步流在所述GPU设备端上执行将当前帧的所述第一帧数据进行所述数据处理时,所述第二异步流并行执行将当前帧的所述第二帧从所述CPU主机端传入所述GPU设备端;
[0019] 当所述第二异步流在所述GPU设备在设备端上执行将当前帧的所述第二帧数据进行所述数据处理时,所述第一异步流并行执行将下一帧的所述第一帧数据从所述CPU主机端传入所述GPU设备端。
[0020] 优选的是,所述固定内存的大小为B‑Scan图像宽度×B‑Scan图像高度×2字节;所述B‑Scan图像宽度为每次进行A‑Scan的点数,所述B‑Scan图像高度为包含所述A‑Scan的行数。
[0021] 优选的是,所述GPU变量至少包括所述原始干涉信号数据、所述传出图像数据以及中间变量,所述中间变量至少包括设备端变量、数组常量、异步流、cuFFT资源。
[0022] 优选的是,所述数据处理包括依次的补零、加窗、FFT、取对数、归一化和极坐标变换。
[0023] 优选的是,所述数据处理还包括:
[0024] 为所述B‑Scan图像的每一个像素点创建一个线程,并且利用static关键字进行修饰。
[0025] 一种基于GPU的OCT成像系统,其包括:
[0026] CPU主机端,其用于分配一固定内存存放采集的原始干涉信号数据、显示图像;
[0027] GPU设备端,其通过访问所述CPU主机端获取GPU变量并对其进行单次设备初始化,重复所述GPU变量获取和所述单次设备初始化,直至停止采集;
[0028] 其中,所述GPU设备端还采用C++类的析构函数完成GPU设备内存的自动释放;
[0029] 所述设备单次初始化包括:
[0030] 采用C++类的构造函数对所述GPU变量分配所述GPU设备内存;
[0031] 创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan;将B‑Scan图像高度的每一帧数据按先后顺序依次分为第一帧和第二帧;所述第一异步流对应所述第一帧,所述第二异步流对应所述第二帧,并行交替执行数据传入、数据处理以及传出图像数据给所述CPU主机端。
[0032] 优选的是,所述GPU设备端还包括:
[0033] 内存释放模块,其用于GPU设备内存的自动释放;
[0034] 单次设备初始化模块,其包括内存分配单元、异步流创建单元;所述内存分配单元采用C++类的构造函数对所述GPU变量分配所述GPU设备内存;所述异步流创建单元用于创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan。
[0035] 优选的是,所述单次设备初始化模块还包括:
[0036] 补零单元,其用于对传入所述GPU设备端的数据进行补零处理;
[0037] 加窗单元,其用于对所述补零后的数据进行加窗处理;
[0038] FFT单元,其用于对加窗处理后的数据进行FFT变换;
[0039] 取对数单元,其用于对FFT变换后的数据进行取对数处理;
[0040] 归一化单元,其用于对取对数处理后的数据进行归一化处理;
[0041] 极坐标单元,其用于对归一化处理后的数据进行极坐标变换处理。
[0042] 优选的是,所述固定内存的大小为B‑Scan图像宽度×B‑Scan图像高度×2字节;所述B‑Scan图像宽度为每次进行A‑Scan的点数,所述B‑Scan图像高度为包含所述A‑Scan的行数。
[0043] 本发明至少包括以下有益效果:
[0044] 本发明提供的基于GPU的OCT成像方法和系统,在CPU主机端对原始干涉信号数据分配B‑Scan大小的固定内存,以提高数据传输吞吐量;优选C++类的方法去管理CUDA代码,利用C++类的构造函数对GPU设备变量进行单次初始化,并利用C++类的析构函数完成GPU设备内存的自动释放;即利用C++类的成员函数结合异步流架构,实现CPU主机端和GPU设备端的异步运行,达到GPU设备端在加速运算同时,CPU主机端可以并行实现数据的双向传输,从而实现MHz高速的OCT图像实时处理。
[0045] 本发明的其它优点、目标和特征将部分通过下面的说明体现,部分还将通过对本发明的研究和实践而为本领域的技术人员所理解。

附图说明

[0046] 为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0047] 图1为本发明所述的基于GPU的OCT成像方法的流程示意图;
[0048] 图2为本发明所述的单次设备初始化的流程示意图。
[0049] 图3为数据处理流程示意图;
[0050] 图4为本发明所述的固定内存与默认方式数据传输方式对比示意图;
[0051] 图5为本发明提供的OCT成像方法获取的c57小鼠结直肠实时扫描效果图与病理切片结果对比图;
[0052] 图6为本发明提供的OCT成像系统组成及通信示意图。

具体实施方式

[0053] 下面将结合附图对本发明实施例的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0054] 下面所述的本发明不同实施方式中使用的诸如“具有”、“包含”以及“包括”术语并不排除一个或多个其它元件或其组合的存在或添加;所涉及的技术特征只要彼此之间未构成冲突就可以相互结合。
[0055] <实施方式1>
[0056] PCIe Gen3 x16的最高传输速度为16GB/s,GPU设备端全局内存传输速度为496.064GB/s,所以数据在GPU设备内部传输的速度远远大于数据在CPU主机端和GPU设备端之间的传输速度,为了提高数据处理速度,应尽量避免GPU设备端和CPU主机端之间的数据传输。
[0057] 一方面,为了提高数据传输速度,本发明优选采用NVIDIA  GeForce  RTX 2080Super显卡硬件为开发平台,单精度浮点计算能力为11.336TeraFLOP/s,全局内存带宽速率为496.064GB/s,显卡与CPU主机端通过PCIe Gen3 x16相连接。
[0058] 另一方面,为了尽量避免GPU设备端和CPU主机端之间的数据传输,本发明实施方式提供一种基于GPU的OCT成像方法,如图1所示,包括以下步骤:
[0059] S10,在CPU主机端分配一固定内存存放采集的原始干涉信号数据;
[0060] S20,GPU设备端访问CPU主机端,获取GPU变量并对其进行单次设备初始化;
[0061] S30,重复GPU变量获取和单次设备初始化,直至停止采集;
[0062] S40,CPU主机端显示图像,采用C++类的析构函数完成GPU设备内存的自动释放;
[0063] 其中,步骤S20中,如图2所示,单次设备初始化包括:
[0064] S21,采用C++类的构造函数对GPU变量分配GPU设备内存;
[0065] S22,创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan;将B‑Scan图像高度的每一帧数据按先后顺序依次分为第一帧和第二帧;第一异步流对应第一帧,第二异步流对应第二帧,并行交替执行数据传入、数据处理以及传出图像数据给CPU主机端。
[0066] 该实施方式,步骤S10中,固定内存的分配是为了提高数据传输吞吐量。固定内存的大小优选为B‑Scan图像宽度×B‑Scan图像高度×2字节;B‑Scan图像宽度为每次进行A‑Scan的点数,B‑Scan图像高度为包含A‑Scan的B‑Scan行数。更具体地,在CPU主机端,可以利用cudaHostAlloc(或cudaMallocHost)分配一个大小为Width×Height×2字节的固定内存,其中,Width为B‑Scan图像宽度,Height为B‑Scan图像高度,Height大小随着内窥探头转速的不同而变化,并且,更进一步优选A‑Scan固定为1024点。
[0067] 该实施方式,步骤S21中,GPU变量至少包括原始干涉信号数据、传出图像数据以及中间变量,中间变量至少包括设备端变量、数组常量、异步流、cuFFT资源等等。
[0068] 该实施方式,步骤S22中,并行交替执行,优选为包括以下步骤:当第一异步流在GPU设备端上执行将当前帧的第一帧数据进行数据处理时,第二异步流并行执行将当前帧的第二帧从CPU主机端传入GPU设备端;当第二异步流在GPU设备在设备端上执行将当前帧的第二帧数据进行数据处理时,第一异步流并行执行将下一帧的第一帧数据从CPU主机端传入GPU设备端。第一异步流绑定第一cuFFT plan、第二异步流绑定第二cuFFT plan的并行交替执行的步骤,实现了CPU主机端和GPU设备端的异步运行,达到GPU设备端在加速运算的同时,CPU主机端可以并行实现数据的双向传输,隐藏数据传输带来的时间消耗,有利于提高OCT图像处理速度。
[0069] 该实施方式,步骤S22中,数据处理包括依次的补零、加窗、FFT、取对数、归一化和极坐标变换。作为更进一步优选,数据处理还包括:为B‑Scan图像的每一个像素点创建一个线程,并且利用static关键字进行修饰,可减少重复执行次数,提高OCT成像执行效率。
[0070] 该实施方式,步骤S40中,采用C++类的析构函数完成GPU设备内存的自动释放,包括对C++类构造函数分配的GPU设备变量中的设备端变量、数组常量、异步流、cuFFT资源进行自动释放。在C++类的构造函数与C++类的析构函数配合下,每次程序运行时,C++类的构造函数只执行一次,GPU设备内存只创建一次,且不需要主动释放内存,程序运行结束利用C++类的析构函数自动释放GPU设备内存,只在GPU设备端执行算法,大大提高了GPU的利用率。
[0071] 基于上述实施方式的说明,为了避免频繁创建GPU设备内存和释放GPU设备内存而引起的耗时,本发明对OCT图像系统的内存进行优化管理和利用异步流架构对数据实现高速实时处理。具体地,在CPU主机端对原始干涉信号数据分配B‑Scan大小的固定内存,以提高数据传输吞吐量;优选C++类的方法去管理CUDA代码,利用C++类的构造函数对GPU设备变量进行单次初始化,并利用C++类的析构函数完成GPU设备内存的自动释放;即利用C++类的成员函数结合异步流架构,实现CPU主机端和GPU设备端的异步运行,达到GPU设备端在加速运算同时,CPU主机端可以并行实现数据的双向传输,在此过程中处理算法包括补零、加窗、FFT、取对数、归一化和极坐标变换,再借助全局内存带宽速率为496.064GB/s的NVIDIA GeForce RTX 2080Super显卡硬件为开发平台,单精度浮点计算能力为11.336TeraFLOP/s,最终实现达到兆赫兹(MHz)速率的OCT图像系统快速实时成像目的。
[0072] 为了更好说明上述发明的数据处理时效,下面给出一个具体应用实施例加以说明。
[0073] 一、内存分配
[0074] 如图3所示,在CPU主机端为采集的原始干涉信号数据分配固定内存。当使用默认的方式从CPU主机端向GPU设备端传输数据时,CPU主机端并不是直接将数据传输到GPU设备端,而是从虚拟内存转为固定内存,再将固定内存的数据传输到GPU设备端,大大降低了传输效率。而本发明采用在CPU主机端直接分配固定内存的方式,在CPU主机端利用cudaHostAlloc(或cudaMallocHost)分配一个大小为Width×Height×2字节的固定内存,Width为A‑Scan的点数,本发明优选A‑Scan固定为1024点,Height为包含A‑Scan的B‑Scan行数,Height大小随着内窥探头转速不同而变化,将采集卡采集到的原始干涉信号数据放入该固定内存中,GPU设备端可以直接访问CPU主机端分配的固定内存,大大提高了数据传输吞吐量。
[0075] 二、同步流和异步流对比
[0076] 具体为:将一帧数据拆分为两帧进行处理,第一异步流(stream1)对B‑Scan图像Height的前一半数据进行处理,第二异步流(stream2)对B‑Scan图像Height的后一半数据进行处理,处理OCT算法包括:补零、加窗、FFT、取对数、归一化和极坐标变换。当stream1在GPU设备端上执行当前帧B‑Scan图像前一半数据的运算处理时,stream2并行执行将当前帧B‑Scan后一半数据从CPU主机端传入GPU设备端;当stream2在GPU设备端上执行当前帧B‑Scan图像后一半数据的运算处理时,stream1并行执行将后一帧B‑Scan前一半数据从CPU主机端传入GPU设备端,stream1和stream2交替执行原始数据的传入、处理和传出图像数据,这样就能隐藏传输带来的时间消耗。通过使用同步流和异步流的结果对比,可发现,使用异步流相较于同步流性能提升29.36%。
[0077] 三、数据处理流程
[0078] 1.在CPU主机端为采集的原始干涉信号数据利用cudaHostAlloc(或cudaMallocHost)分配一个大小为Width×Height×2字节的固定内存,Width为A‑Scan的点数,Height为包含A‑Scan的B‑Scan行数,Height大小随着内窥探头转速不同而变化,本发明优选A‑Scan固定为1024点,Height为1000点创建固定内存为例。
[0079] 2.利用C++类的构造函数对GPU设备变量进行单次初始化。传入的参数为B‑Scan图像的Width和Height,在C++类的构造函数中利用cudaMalloc对原始干涉信号数据、传出的图像数据、归一化变量、FFT变量分配设备内存,分别创建第一异步流stream1、第二异步流stream2、第一cuFFT plan(cuFFT plan[1])、第二cuFFT plan(cuFFT plan[2]),并将cuFFT plan[1]与stream[1]绑定,将cuFFT plan[2]与stream[2]绑定,在GPU设备端分配窗函数的内存大小为Width,并对窗函数进行赋值。
[0080] 3.初始化i=1,表示第i次进行GPU设备端加速OCT算法处理,可以做到每次对一帧B‑Scan图像进行处理。
[0081] 4.异步流的处理:
[0082] (1)stream[1]执行:
[0083] ①利用cudaMemcpyAsync将CPU主机端固定内存前一半的数据拷贝到GPU设备端,大小Width×Height×0.5,执行完数据大小为1024×500(uint16_t);
[0084] ②将补零和加窗写在一个kernel里,减少中间参数的传递,在每一行Width后面补1024个零,执行加窗函数,并将实数转为复数,执行完数据大小为2048×500(cufftComplex);
[0085] ③利用cufftExecC2C执行cuFFTplan[1],在同一个流中并行执行500个FFT,每个FFT的点数为2048,执行完数据大小为2048×500(cufftComplex);
[0086] ④因为FFT具有对称性,将FFT以后的复数在Width方向上截取一半作为图像数据使用,再对其进行取模和取对数运算,最后进行归一化,执行完数据大小为1024×500(unsigned char);
[0087] ⑤将归一化的数据利用双线性插值算法进行极坐标变换,执行完数据大小为1024×512(unsigned char);
[0088] (2)stream[2]执行:执行过程和stream[1]除了第①和③步骤不一样,其余步骤执行算法相同。
[0089] 第①步利用cudaMemcpyAsync将CPU主机端固定内存后一半的数据拷贝到GPU设备端;第③步利用cufftExecC2C执行cuFFTplan[2]。
[0090] stream[1]和stream[2]是并行执行,当执行完stream[2]时,利用cudaMemcpyAsync将处理完成的一帧完整的B‑Scan极坐标图像传回GPU设备端。
[0091] 5.停止采集,当结束采集数据时,CPU主机端和GPU设备端传输数据终止,GPU设备端停止工作,“是”则进入第8步,“否”则返回第4步。
[0092] 6.利用C++类的析构函数自动释放GPU设备内存。释放全局内存,销毁cuFFT资源,并销毁创建的两个异步流stream1或stream2。利用C++的析构函数自动释放内存,避免了因没有主动释放内存,而导致的GPU设备内存用完,影响程序的运行。
[0093] 四、实际应用
[0094] 利用离线的100帧1000×1024×2字节的c57小鼠结直肠数据,对本发明提出的GPU算法进行了测试,处理包括从CPU主机端传入GPU设备端和GPU设备端处理数据并将极坐标变换结果从GPU设备端传回CPU主机端,处理算法包括补零、加窗、FFT、归一化、极坐标变换。测试从传入第一帧数据到传回最后一帧数据的时间为28.4ms,可以计算得GPU平均处理一帧时间为0.284ms,一秒钟可以处理3.52MHz(1000/0.284×1000)的A‑Scan点数。图5为利用本发明提供的OCT成像方法获取的c57小鼠结直肠实时扫描效果图,成像结果与病理切片结果一致,可清晰地区分小鼠结直肠组织的层析结构,结直肠壁其层次结构由里向外依次为粘膜层(ML)、粘膜下层(SM)、固有肌层(MP)及浆膜层(SS)。
[0095] 五、效果数据对比
[0096] 如图2所示,为了减少主机端和设备端的数据传输,成员函数参数只有两个,一个为输入U16原始B‑Scan固定内存数据,另一个为输出的U8图像数据,输出的数据可以直接传回CPU主机端显示图像。
[0097] 表1近几年OCT成像速度对比
[0098]Source,Pub.date A‑scan rate B‑scan size OCT speed(A‑scans)
Sanghoon et al.[1] 8.8kHz 2048×512 6.14kHz
Xiqi et al.[2] 28kHz 400×2048 64.4kHz
Wei et al.[3] 50kHz 2048×512 128kHz
Yong et al.[4] 70kHz 1000×1024 249kHz
Yifan et al.[5] 100kHz 2048×256 2.24MHz
This patent 250kHz 1024×1000 3.52MHz
[0099] 上述表1为近几年OCT成像速度对比,利用GPU对OCT成像进行数据加速处理,已有文献报道最快A‑Scan处理速率为2.24MHz,本发明中将GPU引入OCT系统进行数据处理,对系统内存进行优化管理和利用异步流架构,最终实现图像处理速率达3.52MHz(A‑Scan,16bit,1024pixels),优于近几年已报道文献中的OCT处理速度,对高速OCT系统和需要实时处理大数据量的系统具有重要意义。
[0100] <实施方式2>
[0101] 在实施方式1的基础上,本发明实施方式提供一种基于GPU的OCT成像系统。
[0102] PCIe Gen3 x16的最高传输速度为16GB/s,GPU设备端全局内存传输速度为496.064GB/s,所以数据在GPU设备内部传输的速度远远大于数据在CPU主机端和GPU设备端之间的传输速度,为了提高数据处理速度,应尽量避免GPU设备端和CPU主机端之间的数据传输。
[0103] 为了提高数据传输速度,本发明提供的OCT成像系统优选采用NVIDIA GeForce RTX 2080Super显卡硬件为开发平台,单精度浮点计算能力为11.336TeraFLOP/s,全局内存带宽速率为496.064GB/s,显卡与CPU主机端通过PCIe Gen3 x16相连接。
[0104] 为了尽量避免GPU设备端和CPU主机端之间的数据传输,如图6所示,本发明提供的OCT成像系统包括CPU主机端和GPU设备端。具体地,CPU主机端用于分配一固定内存存放采集的原始干涉信号数据、显示图像;GPU设备端通过访问CPU主机端获取GPU变量并对其进行单次设备初始化,重复GPU变量获取和单次设备初始化,直至停止采集;其中,GPU设备端还采用C++类的析构函数完成GPU设备内存的自动释放;设备单次初始化包括:采用C++类的构造函数对所述GPU变量分配所述GPU设备内存;创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan;将B‑Scan图像高度的每一帧数据按先后顺序依次分为第一帧和第二帧;所述第一异步流对应所述第一帧,所述第二异步流对应所述第二帧,并行交替执行数据传入、数据处理以及传出图像数据给所述CPU主机端。
[0105] 该实施方式中,固定内存的分配是为了提高数据传输吞吐量。固定内存的大小优选为B‑Scan图像宽度×B‑Scan图像高度×2字节;B‑Scan图像宽度为每次进行A‑Scan的点数,B‑Scan图像高度为包含A‑Scan的B‑Scan行数。更具体地,在CPU主机端,可以利用cudaHostAlloc(或cudaMallocHost)分配一个大小为Width×Height×2字节的固定内存,其中,Width为B‑Scan图像宽度,Height为B‑Scan图像高度,Height大小随着内窥探头转速的不同而变化,并且,更进一步优选A‑Scan固定为1024点。
[0106] GPU变量至少包括原始干涉信号数据、传出图像数据以及中间变量,中间变量至少包括设备端变量、数组常量、异步流、cuFFT资源等等。
[0107] 并行交替执行,指的是:当第一异步流在GPU设备端上执行将当前帧的第一帧数据进行数据处理时,第二异步流并行执行将当前帧的第二帧从CPU主机端传入GPU设备端;当第二异步流在GPU设备在设备端上执行将当前帧的第二帧数据进行数据处理时,第一异步流并行执行将下一帧的第一帧数据从CPU主机端传入GPU设备端,从而实现了CPU主机端和GPU设备端的异步运行,达到GPU设备端在加速运算的同时,CPU主机端可以并行实现数据的双向传输,隐藏数据传输带来的时间消耗,有利于提高OCT图像处理速度。
[0108] 本发明对OCT图像系统的内存进行优化管理和利用异步流架构对数据实现高速实时处理。具体地,在CPU主机端对原始干涉信号数据分配B‑Scan大小的固定内存,以提高数据传输吞吐量;优选C++类的方法去管理CUDA代码,利用C++类的构造函数对GPU设备变量进行单次初始化,并利用C++类的析构函数完成GPU设备内存的自动释放;即利用C++类的成员函数结合异步流架构,实现CPU主机端和GPU设备端的异步运行,达到GPU设备端在加速运算同时,CPU主机端可以并行实现数据的双向传输,在此过程中处理算法包括补零、加窗、FFT、取对数、归一化和极坐标变换,再借助全局内存带宽速率为496.064GB/s的NVIDIA GeForce RTX 2080Super显卡硬件为开发平台,单精度浮点计算能力为11.336TeraFLOP/s,最终实现达到兆赫兹(MHz)速率的OCT图像系统快速实时成像目的。
[0109] 作为进一步的优选,GPU设备端还包括内存释放模块和单次设备初始化模块。内存释放模块用于GPU设备内存的自动释放,具体地,采用C++类的析构函数完成GPU设备内存的自动释放,包括对C++类构造函数分配的GPU设备变量中的设备端变量、数组常量、异步流、cuFFT资源进行自动释放。在C++类的构造函数与C++类的析构函数配合下,每次程序运行时,C++类的构造函数只执行一次,GPU设备内存只创建一次,且不需要主动释放内存,程序运行结束利用C++类的析构函数自动释放GPU设备内存,只在GPU设备端执行算法,大大提高了GPU的利用率。设备初始化模块包括内存分配单元、异步流创建单元。内存分配单元采用C++类的构造函数对GPU变量分配GPU设备内存;异步流创建单元用于创建第一异步流绑定第一cuFFT plan,创建第二异步流绑定第二cuFFT plan。
[0110] 作为进一步的优选,单次设备初始化模块还包括:补零单元、加窗单元、FFT单元、取对数单元、归一化单元、极坐标单元。其中,补零单元用于对传入GPU设备端的数据进行补零处理;加窗单元用于对补零后的数据进行加窗处理;FFT单元用于对加窗处理后的数据进行FFT变换;取对数单元用于对FFT变换后的数据进行取对数处理;归一化单元用于对取对数处理后的数据进行归一化处理;极坐标单元用于对归一化处理后的数据进行极坐标变换处理。
[0111] 本发明提供的OCT成像系统,在CPU主机端对原始干涉信号数据分配B‑Scan大小的固定内存,以提高数据传输吞吐量;优选C++类的方法去管理CUDA代码,利用C++类的构造函数对GPU设备变量进行单次初始化,并利用C++类的析构函数完成GPU设备内存的自动释放;即利用C++类的成员函数结合异步流架构,实现CPU主机端和GPU设备端的异步运行,达到GPU设备端在加速运算同时,CPU主机端可以并行实现数据的双向传输,在此过程中数据处理包括补零、加窗、FFT、取对数、归一化和极坐标变换,再借助全局内存带宽速率为
496.064GB/s的NVIDIA GeForce RTX 2080Super显卡硬件为开发平台,单精度浮点计算能力为11.336TeraFLOP/s,最终实现达到兆赫兹(MHz)速率的OCT图像系统快速实时成像目的。
[0112] 显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其他不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引申的显而易见的变化或变动仍处于本发明创造的保护范围之中。