DirectCompute加速图像处理方法的研究
摘 要:当代图像处理,特别是基于大量密集科学计算的数据处理,需要用高度的并行处理技术来解决计算效率问题。然而处理速度更多依赖于具体的算法和系统实现间的相互联系,这就对进行并行处理的工作人员的并行技术及相关经验提出了一定的要求。为完成并行处理并加大并行计算效益,采用了DirectCompute方法。针对工程中的角点匹配计算时延问题,凭借有效的硬件资源,对其进行了并行处理,提高了程序执行ฆ效率,并缩短了计算延时。
关键词:图像三维重建; 并行计算; GPU; DirectCompute
中图分类号:TN91934; TP391 文献标识码:A 文章编号:1004373X(2012)22005504
随着并行处理机及并行处理技术的飞速发展,并行计算已逐步应用于科学计算领域及相关工程领域,并不断取得卓越成果。图像并行处理技术是一种将并行计算应用于图像处理中以提高图像处理速度的技术。如何设计算法并通过系统实现完成并行处理并使得并行计算效益最大,这是图像并行处理技术应用的一个难题。对于工程中的角点匹配计算时延问题ツ,DirectCompute方法有效地缩短了计算时延。
1 图像三维重建简介
图像三维重建是图像工程中的研究对象。通过使用多台摄像机,从360°对一个做自转运动的物体进行拍摄,从得到的同一时刻该物体的图像以及图像间的关联信息计算该运动物体的三维结构并重建出来。图1是某一时刻对各摄像机单帧图像组处理的流程图。
图1 三维重建在整个图像三维重建过程中,特征点检测与匹配[1](图1中第2步)是工程开始阶段非常重要的一步。它将不同摄像机同一时刻拍到的运动物体图像,经过多尺度Harris角点HH检测算法[24]找出图像之间关联的角点组,并通过宽基线匹配算法[5]对这些角点进行粗匹配最后再由引导匹配[6]算法根据不同图像之间角点的相似性匹配图像。
对于待匹配的2幅图像,通过Harris角点检测得到的每一组角点p1(x,y)、 p2(x,y),分别以它们作为中心原点画边长为w的正方形,并以该正方形为窗口对两幅图像进行截取,由这样得到的2个二维矩阵MAW×W,MBW×W计算出关于该两组角点的相关系数。由这样计算出的所有角点的相关系数组成了相关系数矩阵CK×L,其中K为图像1中的角点组数,L为图像2中的角点组数。最后再通过相关系数矩阵找出图像1与图像2中相似性最高的对应角点,从而实现粗匹配。引导匹配则是根据粗匹配的结果,通过相对应角点的位置对图像划定一个范围,并将范围内每一个元素作为新的角点进行粗匹配过程,从而使匹配更精确。
实验测得,通过Harris角点检测算出的两幅待匹配图像角点数目一般为800组左右。截取窗口边长w= 41时,匹配效果最好。由于进行初始匹配时并不能确定两幅图像的角点组间的相关性,因此需要对其进行两两匹配。经计算,仅完成一次粗匹配中的窗口矩阵点乘的操作就需要大约11亿次的浮点运算,而后续的引导匹配则更是重复这样的计算过程。由此可以看出,整个角点的匹配工作不仅占用内存资源,而且耗时严重。实验测得,特征点检测与匹配过程大约耗时800 s,不用说实时显示,对于图像三维重建工程的后续工作也是一种漫长的等待。要寻求一种解决方案,在不影响数据计算结果的情况下,尽可能加快其计算过程。
2 DirectCompute简介
图形处理器(Graphics Processing Unit,GPU)又称图形处理单元,是一种专用图形渲染设备,是显卡的计算核心。GPU所拥有的计算核心数目远远大于CPU,这样的硬件设计架构决定了GPU拥有比CPU强大得多的浮点运算能力[79]。
DirectCompute是微软开发和推广的一种用于GPU通用计算的应用程序接口,集成在Microsoft DirectX(微软创建的多媒体编程接口)内。除了GPU通用计算,DirectCompute还支持CPU+GPU异构运算,即CPU运算复杂的串行序列代码,而GPU运行大规模的并行应用程序,CPU与GPU分工合作,异步执行,组成协同处理环境[10]。DirectCompute的编程模型基于Direct3D着色器模型架构,并且采用高级渲染语言HLSL(High Level Shader Language)进行编程。
相比于一般的GPU通用计算,DirectCompute拥有以下特点:
(1) 由于是集成在DirectX中,因此与其中的D3D图形资源(纹理、缓存等)可以进行有效的互操作;
(2) 包含立方环境贴图cubemap和多级贴图mipmapping在内的所有纹理映射技术;
(3) 使用类HLSL渲染语言;
(4) 在Windows平台上对所有显卡供应商提供统一图形API;
(5) 对于不同硬件及产生的超时,DirectCompute尽量保证它们的结果一致性;
(6) 提供存储溢出检测。
在DirectX[11]结构中有很多种着色器模型,而微软在DirectCompute中增添了一种新的着色器类型――Compute Shader,计算着色器――用来处理更广泛的通用计算问题。计算着色器并不属于图形流水线中的某一级,它通过其中的图形ฌ资源(例如渲染目标、缓存或纹理)来与流水线中的其他模块进行交互。不同于向量着色器与像素着色器,计算着色器不必对处理的数据和线程完成一对一的映射。一条线程可以处理多个数据,并且应用程序可以根据计算的规模来直接分配所需的线程数。此外,计算着色器允许乱序内存访问,即可以实现对缓存中任意位置的写操作。
3 DirectCompute方法的实现
计算着色器通过名为“Dispatch”的函数来规划和分配参与计算的线程数,如图2所示,Dispatch(X,Y,Z)表示线程组在x,y和z维度的线程块数分别为X,Y和Z。线程组中每一个元素被看做一个线程块,用HLSL语言表示成:numthreads(nx, ny, nz),其中nx,ny,nz分别是线程块中每个维度上线程的数量。SV_GroupID表示线程组中每个维度上线程块的索引ID,SV_GroupThreadID表示线程块中每个线程的索引ID,它们都是三维的,SV_DispatchThreadID则是线程在整个线程组中完整的索引ID映射。SV_GroupIndex则是将线程在线程组内索引ID转换成一维的形式,其计算方法为: groupIndex= groupThreadID.x*dimx*dimy+groupThreadID.y*dim+groupThreadID.x。
使用计算着色器进行通用计算一般分为以下几个步骤:
(1) 创建D3D设备和用来切换的上下文;
(2) 创建计算着色器CS并对其进行编译;
(3) 创建输入资源对象Input Resource并向其填充输入数据;
(4) 创建资源视图SRV,绑定输入资源对象;
(5) 创建输出资源对象Output Resource;
(6) 创建资源视图UAV,绑定输出资源对象;
(7) 利用计算着色器CS进行多线程计算;
(8) 将计算结果传回资源视图UAV绑定的输出资源对象中;
(9) 从输出资源对象中取出数据,释放资源。
#define W_SIZE 41
#define NUM_IN_GROUP_X 850
//X维度线程组数量
#define NUM_IN_BLOCK_X 850
//X维度线程组中线程数量
structBufType{
//定义结构体
float data;
}
//初始化工作
CreateComputeDevice(pDevice, pContext);
//创建D3D设备和上下文
CompileFromFile(pSrcFile, pDevice, pBlob);
//从HLSL文件编译计算着色器
CreateStructureBuffer(pDevice, InputBuffer0, pInBuf0);
//创建结构体缓存并传入数据
CreateStructureBuffer(pDevice, InputBuffer1, pInBuf1);
CreateStructureBuffer(pDevice, OutputBuffer, pOutBuf);
CreateBufferSRV(pDevice, pInBuf0, pInBuf1, &pInputBufferSRV);
//输入缓存绑定SRV
CreateBufferUAV(pDevice, pOutBuf, &pOutputBufferUAV);
//输出缓存绑定UAV
pContext->Dispath(NUM_IN_GROUP_X, 1, 1);
//分配线程组
CreateAndCopyToDebugBuf(pDevice, pContext, pOutBuf);
//将计算结果传回CPU
//释放资源
图2 通过“dispatch”进行线程规划按照这个步骤开始进行对角点组的匹配工作。着色器模型中的缓存类型选用structured buffer,当然之前要先定义一个结构体,缓存中每个元素都是这个结构体的对象。在处理窗口矩阵相关系数矩阵计算的时候,将所有窗口矩阵均按行顺序存储方式存为2个大矩阵Matrix_A和Matrix_B中。创建两个结构体缓存InputBuffer0和InputBuffer1并将这两个矩阵存入,同时创建两个资源视图InputBufferSRV0和InputBufferSRV1对缓存进行绑定。另外创建一个读写结构体缓存OutputBuffer并绑定到资源视图OutputBufferUAV上。接下来利用Dispatch分配线程数,考虑需要进行匹配的角点组数量以及计算着色器模型中对线程数目的限定,在x维度上分配850个线程组,y维度和z维度为1,每个线程组中在x维度上分配850个线程数,y维度和z维度也均为1。这样做的目的是,每个线程组内的线程数量对应一个大矩阵的元素,使其每个线程完成一次窗口矩阵的2范数与点乘运算;所有线程组数量对应另一个大矩阵的元素,从而使得这些计算并发进行,达到加速优化的效果。利用DirectCompute进行并行匹配计算的一些核心代码请见上图。
4 性能测试
CPU与DirectCompute加速方案测试结果对比如表1所示。
由表1可知,在实验中,利用DirectCompute进行粗匹配的加速效果是十分显著的,对于GeForce GTX 460显卡来说,整个匹配工作几乎是“瞬间”完成的。根据GTX460的工作手册,可以看到其支持的DirectX的版本为11.0,对应计算着色器的模型为CS5.0,对于DirectCompute的支持也更充分。
为了更好地测试DirectCompute的加速性能,对基于GTX 460加速的整个运行流程进行了分段测试,包括窗口矩阵2范数的计算时间、窗口矩阵点乘的时间以及数据传输的时间,如表2所示。从表中可以看到,利用DirectCompute进行计算的时间大约为4.5 ms,数据传输时间大约为40 ms,也就是说整个角点粗匹配过程中,利用DirectCompute加速后的计算时间所占百分比不到1%,数据传输的时间占整个执行时间的8%。就是说GPU的执行效率是比较低的,这也是基于GPU的通用计算上所需要解决的典型问题。另外可以看到,大矩阵Matrix_A的2范数计算阶段总时间和大矩阵相乘阶段总时间很长,特别是后者,这是创建D3D设备和相关图形资源以及释放资源造成的延时。
5 结 语
目前并行计算已经迅速发展为与众多工程类学科交叉的一门计算科学,并已成为许多科研和工程技术人员进行科学研究和开发的重要手段。并行处理技术也在众多领域取得显著成果,图像并行处理技术更是在传统的图像处理领域发挥着重要作用。然而并行处理技术在图像处理方面的发展也面临许多挑战,其中最主要的就是如何提高解决实际复杂问题的综合能力,包括图像处理中复杂问题求解和处理速度高速化问题。 本文主要是将基于GPU的高性能并行计算技术(DirectCompute方法)应用于实际处理的图像工程中。针对工程中具体的角点匹配计算时延问题,依照并行处理规则,凭借有效的硬件资源,对其进行并行处理,提高程序执行效率,缩短计算延时。随着并行计算的不断发展以及图像并行处理技术的日益成熟,相信高性能并行计算必将成为图像处理不可或缺的组成部分并将不断推动其走向新的阶段。
参 考 文 献
[1] 聂晓桃,王慧.一种改进的特征点匹配算法[J].科技广场,2010(1):9899.
[2] 薛翠红,于洋,梁艳,等.多摄像机视野分界线恢复算法[J].无线电通信技术,2012(2):6668.
[3] 陈白帆,蔡自兴.基于尺度空间理论的Harris角点检测[J].中南大学学报,2005,36(5):751753.
[4] 蔡胜利,张会清.基于Harris角点检测的图像旋转测量[J].计算机测量与控制,2011(1):3032.
[5] 左森,郭晓松.宽基线视察图像的拼接算法[J].计算机工程,2007,33(10):175176.
[6] 梁栋,童强,屈磊,等.一种基于极几何和单应约束的图像匹配算法[J].系统仿真学报,2006(7):4446.
[7] 厉旭杰.GPU加速的图像匹配技术[J].计算机工程与应用,2012(2):173176.
[8] LI Ping, SUN Hanqiu, SHENG Bin, et al. Image stylization with enhanced structure on GPU(英文版)[J].中国科学信息科学,2012(5):10931105.
[9] 韩博,周秉锋.GPGPU性能模型及应用实例分析[J].计算机辅助设计与图形学学报,2009,21(9):12201223.
[10] CHANG Janlen.异构计算:计算巨头的下一个十年[J].个人电脑☼,2011(11):8288.
[11] 陈希棠.基于DirectX的图像旋转算法的研究与实现[J].电脑知识与技术,2011(7):46254627.
[12] 张聪,邢同举,罗颖,等.基于GPU的数学形态学运算并行加速研究\[J\].电子设计工程,2011(19):141143.
[★13] 张晓东,孔祥辉,张欢阳.利用GPU实现SAR图像的并行处理\[J\].电子科技,2011(11):9495.
[14] 程飞,黄曦.基于OGRE的三维红外云仿真\[J\].电子科技,2010(6):47.