Halide:简化图像编程

本文为转载,原博客地址为:https://blog.csdn.net/JackyTintin/article/details/7833774

原文来自MIT News

只要我们稍微留意一下Instagram便不难发现,图像处理软件有着的广阔的市场前景。Facebook正在试图用10亿元收购这家从事图像处理业务的公司。以往人们主要通过计算机来向网络上传照片;但现在,越来越多的人却选择直接通过手机发送。因此图像处理也逐渐在移动终端变得流行。同时,现在的数码图片普遍非常大,不借助好的软件工具,即使是在台式机上也需要花费很长的时间业处理。工程师可以通过一定的技巧来加速图像处理算法,但不幸的是,这些技巧会使代码几乎没有可读性,也很难被复用。想要向图像处理程序中增加一个函数,或者将算法移植到一个不同的平台上,往往需要彻底地修改整个代码。


MIT计算机科学和人工智能实验室(CSAIL)的研究人员开发了一门名为“ Hlaide ”的新的编程语言,旨在改变图像处理编程的现状。比起用传统语言编写的代码,用Halide编写的程序不仅更容易阅读、编写和修改,而且,由于Halide能够自动优化代码(对常规的编程语言,这个过程需要花费数小时来手工完成),因此,程序的运行速度也显著提高。
在测试中,MIT的研究人员用Halide重写了几个常用的图像处理算法(这些算法都事先经过熟练的程序员优化)。Halide版本的算法在代码量上大体要多出1/3,但性能却有极大的提升,加速比能够加速达2倍、3倍甚至6倍。在一个算法中,Halide程序虽然比原程序长,但却取得是了70倍的加速比。

Jonathan Ragan-Kelley(电子工程与计算机科学技术学院研究生)和Andrew Adams(CSAIL博士后)领导了Halide的开发,并且还将原代码在网上公布。在这个月的Siggraph(最重要的图形会议)上,他们提交了一篇关于Halide的文章,这篇文章由他俩与MIT计算工教授Saman Amarasingh、Fredo Durand,以及他们在Adobe和斯坦福的同事共同写的。


并行流水线

图像处理之所以需要如此大的计算量的原因之一是,它通常需要一系列离散操作。当光打到手机摄像头的传感器上之后,手机扫描图像数据,查找可能导致异常像素点的数据并加以纠正。之后,将传感器信息转化为像素的颜色信息,并进行颜色校正以和比对度高速高速,以使图像更接近人眼的观看效果。至此,手机已经进行了大量的处理工作,最后还要再对所有数据进行一次清理处理。

这么工作也仅仅是使图像在手机屏幕上得以显示。之后,我们还需要更多的处理步骤,以便用软件完成诸去除红眼、柔化阴影或增加饱和度(甚至是使图像看起来更有老式一次性照片的感觉)等操作。此外,高级的修改操作常常需要软件能够撤销现有操作,恢复到上一阶段的状态。
在今天的多核心芯片上,将图像的不同区域分配到不同的计算核心上并行执行,能够使图像处理更加高效。但是,通常各个核心在完成计算任务后,会将结果返回给主存。由于数据传输要比计算慢很多,所以这会抵销并行化带来的性能提升。

因此,软件工程师试图使每个核心在将它们的计算结果返回到主存前,尽可能的保持忙碌。这意味着,在最终汇总所有数据前,每个计算核心都必须在它所分得的数据上,执行图像处理流水线中的若干个步骤。高效的图像处理代码之所以难以编写,原因在于我们必须跟踪不同核心上处理的像素点之间的所有依赖关系。计算核心数量、计算核心的处理能力、分配给每个核心的局部内存大小以及核心何时将数据移出芯片外,在这些因素的选择之间必须作出折衷,而折衷方案则会因机器而异。因此一台设备而言优化的程序,换在另一台机器上可能起不到加速效果。


分而治之

使用Halide,程序员也还得自己考虑在特定机器上高效实现并行化的方案,但是仅就描述图像处理算法而言,程序员则完全不用担心这些。一个Halide程序有两部分组成:一部分是算法,另部分是“调度“(schedule)。调度指定了每个计算核心在各个处理步骤中需要处理的图像块的大小和形状。同时,它还指定的数据的依赖性——例如,某个核心上的某个处理步骤需要用到在另外的核心上之前步骤的计算结果。一旦调度确定,Halide将自动处理调度中描述的操作。
程序员如果想要将程序移植到一台不同的机器上,他不需要改变算法描述,只需变更调度。程序员如果想要向流水线中增加一个新的处理步骤,也只需要插入一个关于这个操作过程的新的描述,而无需修改已有的代码。(但是,流水线中的新步骤需要在调度中有一个与之对应的设定)
“当你有一个想法,想要将某个操作步骤而并行化,或者需要将某些步骤作某种修改时,如果你需要手动编码实现,那么你会发现,想要正确地表达自己的这个想法是件很困难的事情。”Ragan_Kelley说,“如果你有一个最的优化思路想要应用,很可能你必须花上三天时间去调度,因为你必须将原算法的操作步骤打散。而利用Halide,你只需理性一行代码就能正确地表达出你的想法。”
虽然比起普通的画像处理程序,Halide程序更易于编写和阅读,但是,由于对并行化的调度是自动完成的,因此,相当比大多数精心手工编写的代码,它们仍然能够经常获得性能上的提升。更重要的是,Halide代码非常容易修改,它使程序员能够轻松地通过实验去验证自己初步的想法能否提升性能。
“你可以随心所欲的尝试不同的整改,并且你总会发现一些好的东西,”Adams说,“之后,当你经过深思熟虑之后,你将会发现它们为什么好的道理。”
“使用一个领域相关的语言——像他们现在选择去研究开发的这门语言——能够带来许多激动人心的事情,但是,成功的例子屈指可数,”John Owens,加州理工大学戴维斯分校的一位电气与计算机工程助理教授如是说,“我认为这将会是一个美妙的成功故事。它具备你期望从一个完整系统上找到的所有的部件,而且它所针对的确实一个非常重要的领域。”
“我也能预计它在未来将激发一系列的工作,这项目将具有重大的影响力”Owens补充道。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值