微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > 用FPGA来加速采用OpenCL的多功能打印机图像处理

用FPGA来加速采用OpenCL的多功能打印机图像处理

时间:03-10 来源:互联网 点击:

        摘要:在高性能计算、娱乐和科学计算市场,OpenCL的采用在持续增长。OpenCL的灵活性和便携性使之成为了一个开发图像处理应用的优秀平台。然而,OpenCL尚未应用到硬拷贝打印机和多功能打印机(MFP)市场。传统上,打印机/MFP市场使用全定制系统级芯片(SoC或ASIC)、专用集成电路进行图像处理。在本文中,我们探讨了配合Altera SoC FPGA(现场可编程门阵列)的OpenCL在核心MFP图像处理流水线中的应用。核心图像处理流水线以每分钟大于90页信纸大小的全色RGB持续速率运行,图像分辨率为600DPI(每英寸点数),同时采用了成本有效的FPGA器件。相比运行在嵌入式CPU上的基于C语言的软件流水线,OpenCL流水线可实现至少40倍的性能提升,在高端台式CPU上的运行改善了5倍。
I. 引言
历史上,MFP和打印机厂商都是开发定制ASIC或SoC器件来执行图像处理操作。这些ASIC/SoC器件包括图像流水线,用以接受来自CCD或CIS传感器的RGB数据,执行滤波、缩小/放大、色彩空间转换、图像分割和半色调操作。然后,由此产生的经处理的图像使用减色着色剂进行打印:青色、品红、黄色和黑色。其目标是在打印副本上精确地再现原始文档,而不引入视觉假像。
在底层技术(如DDR内存和USB连接)变得过时之前,ASIC/SoC器件通常有三年的有限寿命。随着硅技术的不断萎缩,开发一个定制ASIC/SoC所需的投资在继续增加。一个采用双核处理器、必要的连接、DDR3内存控制器、图像处理、GPU、LCD控制器等的28纳米SoC的设计、开发和交付需要花费超过1000万美元的成本。
取决于许多因素,大型SoC/ASIC器件的开发周期要花18至30个月,包括新IP的数量和大小、利用以往设计的能力、设计团队经验和成熟的有针对性的硅技术。
打印机/MFP市场的产品周期是24到36个月的时间。打印机/MFP市场成长速度平缓,增加了以较低成本和较短开发周期提供更多功能的竞争压力[1]。
随着ASIC/SoC开发周期接近同一时间MFP产品的生命周期,MFP/打印机厂商需要一个新的平台来缩短开发和部署周期。基于SoC的OpenCL和FPGA的组合为解决这一难题提供了一个有趣的解决方案。
II. MFP图像处理流水线背景
一个重要的研究机构已经在文档图像处理领域积累了近20年的经验[2][3]。大部分早期工作都侧重于图像处理的基础知识,包括提供统一色彩的校准输入传感器数据、去除来自传感器噪声的滤波,实现图像尺寸缩小或放大的缩放算法,以及实现使用二进制像素打印连续色调图像数据的半色调。当前的文档图像处理研究和开发处于图像分析、内容提取和数据压缩技术领域。[4][5][6]
所有MFP文档图像处理产品都可执行一系列基本功能——复印、扫描和打印。图1用图形说明了一台个MFP设备的基本功能或流水线。复印和扫描的操作相类似,开始于从一个扫描设备到设备无关的彩色空间的原始RGB数据转换。复印操作进一步处理设备无关的色彩空间图像,并创建用于打印的CMYK图像。扫描操作在设备无关的色彩空间图像上执行一组不同的图像处理操作。这些操作可以包括:图像分析、用不同频率内容将图像分割为多个图像层、OCR、光学字符识别和数据压缩。然后,所产生的图像转被移到任一本地存储介质,如USB闪存驱动器或网络设备。


图1:简化的MFP图像处理流水线

图字:
来自CCD或基于CIS扫描仪的RGB;分割
扫描仪接口;校准和调整;CST(RGB到Lab);滤波器;缩放R & E;CST(Lab到CMYK);调整;误差扩散;无损或有损压缩;解压缩调整和/或操作
来自网络的PS/PCL/其他PDL;解译;显示列表;渲染器;位图或字节图;调整;半色调;无损压缩;图像存储;无损解压缩;图像调整;引擎接口
有损解压缩;有损压缩;至引擎
出口处理;至网络
外部接口;微观图像处理操作;图像存储;通用CPU操作;宏观图像处理操作
打印功能接收一个采用PDL(页面描述语言)的编码,或图形显示接口格式的文件。在采用PDL文件的情况下,MFP设备必须首先解释文档语言,并创建一个原始对象列表。渲染器捕获这些对象,并将其转换成数字CMYK位图/位图图像。所产生的数字图像可被进一步处理和随意压缩。GDI打印机不需要解释过程,因为传送到打印机的图像是一个显示对象的列表。
一旦打印或复印流水线创建了CMYK位图/位图图像,图像即被发送到引擎在所需介质上打印。
本文的重点是一个OpenCL MFP核心复印流水线(CCP)的开发,如图2所示。


图2:核心复印流水线

图字:
滤波器;缩放R & E;CST(Lab到CMYK);调整;误差扩散
图像存储
源图像5100x6600x24位LAB;目标图像5100x6600x32位CMYK


       
III. MFP核心复印流水线
CCP由5个内核组成:7×7滤波器;用pad/crop缩放或减小与放大;色彩空间转换;调整和误差扩散。我们将简要地回顾各个算法和相关的内存需求。
A. 7×7滤波器
7×7滤波器是一个2D对称滤波器,可降低图像噪声。它的每一行需要跨连续7行乘连续7个像素的49个像素的上下文(context)。MFP应用通常使用一组系数来实现一个平均或锐化滤波器。7×7滤波器的一般形式是:



图3示出了该系数阵列和输入像素阵列。系数C0 - C9足以定义一个7×7滤波器。


7×7系数阵列


7×7输入像素阵列

图3:7×7系数和输入滤波器阵列
由于系数值经常重复,滤波处理可以避免重复的乘法和加法。相反,乘以相同系数的像素可首先加入,然后与滤波器系数相乘一次。图4直观地显示了潜在的优化。这个数字仅为了清晰起见,并不代表OpenCL设计。


图4:滤波器工作矩阵

图字:
M每页扫描线
N每扫描线像素
像素;减少的滤波矩阵;有相同颜色的条目分享共同系数
工作矩阵对称滤波器计算的高度概括,针对左到右滑动进行了优化,包括:
1. 针对每一个加载的新的像素栏3种加法A
2. 针对属于图4所示4×7矩阵中相同滤波器系数像素的18种加法
3. 针对每个系数一个C0至C9的10种乘法M
4. 计算系数乘法最终结果的9种加法
那么,计算的总数是10M + 3A + 18A + 9A = 10M + 30A。图5示出了计算树。


图5:滤波算法的图形表示

随着滤波器在图像上从左至右的滑动,仅需要加载最右侧像素列,即7个像素。逻辑上,这涉及将内部像素列移到左边,并在右侧加上新的像素列。
B. 缩放
缩放模块使用双线性插值来减小和/或放大一幅图像。双线性插值是一个众所周知的算法,在所需的新输出像素周围使用了4个输入像素。图6示出了要测试像素的双线性插值输入和输出网格。


图6:双线性插值

图字:输入网格;输出网格;输入像素;输出像素
输出像素OP1,1可以用下面的公式来计算:



C. 色彩空间转换
CCP采用设备无关的色彩空间数据,通常是LAB格式,并将其转换为设备相关的CMYK色彩空间。不幸的是,没有公式化的方法来直接转换L*a*b*至CMYK。每台打印机的着色剂以非线性方式进行交互。打印行业的公认方法是打印测试斑点,测量所得色,并创建一组C、M、Y和K查找表,即LUT。关键是要尽量减少LUT的大小,同时提供最高的色彩保真度。为了计算这些存储在LUT之间的值,我们必须使用一个插值方案。有许多方法来执行插值,但四面体插值法被广泛认为是最准确的。
顾名思义,四面体插值法使用4个已知点来计算一个中间点。在我们的L*a*b*情况下,这些已知点的每一个都具有对应于输入色彩空间的三个维度。三个输入维度L、a、b形成一个我们可以用来确定输出像素的立方体。图7示出了色彩空间和LUT概念。注意每个输出彩色平面都有独立的LUT。


图7:CMYK LUT和单位正方体

图字:
第一张图:
L*a*b* 色彩空间
下方注解:
对于每24位输入L*a*b*像素,可能有224个32位CMYK输出像素。这相当于64MB LUT!
第二张图:
青色点阵
单位立方体
格点——凭经验测量
感兴趣的像
要使LUT大小降低到一个合理水平,我们可执行以下操作:       
每彩色平面有各自的LUT       
每个LUT有代表点阵点的4096个条目       
算法首先发现期望像素点驻留的单位立方体
一旦算法确定了哪一个单位立方体包含要测试的输出像素,我们必须从一组8个已知像素中计算出输出像素。这是三线性插值的实际情形。四面体插值法利用一个单位立方体可以被划分成一组6个非重叠四面体的方法,其每个终点都位于单位立方体的顶点。使用一个四面体(有4个点)内插来削减一半像素数时,我们必须使用插值结果。图8以图形示出了六个四面体。


图8:CST四面体

CST算法首先确定了输出像素(P)驻留在哪个四面体中,并使用了4个已知输出像素插入最终结果——见图7。图9示出了四面体5中的像素P。该算法计算了每个单位立方体轴端点和像素dx、dy、dz之间的距离,并使用了已知点之间的线性插值距离。


图9:CST四面体5分解图

D. TRC调整
TRC调整算法是一个简单的LUT。它允许C、M、Y、K值的进一步调整,以校正非线性色调再现。具体C、M、Y、K LUT条目凭经验来测量。
E. 误差扩散
最后阶段执行半色调功能。彩色激光MFP产品使用一个激光系统来消除感光介质上的电荷。无论电荷清除的是C、M、Y、K,墨粉都不能转移到感光体。激光束扫过移动的感光体,被调制来创建一个倒置的图像。调制的最小时间周期是一个像素。在反转图像被写入感光体后,它经过一个墨粉分配器附近。然后,带有相反电荷的墨粉被吸引到电荷存在的感光区。墨粉“粘”到感光体上。最后一个步骤是将感光体上的图像转印到纸张或其他介质上。单个像素或开或关,实现二进制的1过程。来自TRC内核的8位CMYK像素必须半色调或二进制化,以驱动打印机中的激光系统。有许多算法可以将连续色调数据转换为二进制数据。误差扩散是MFP/打印机中使用的一种通用算法。我们选择了实施众所周知的弗洛伊德-斯坦伯格(Floyd-Steinberg)误差扩散算法的一个变种,它有简单的算术修正系数[7]。
弗洛伊德-斯坦伯格误差扩散量化了基于一个阈值阵列的输入像素,然后将剩余误差分配到相邻像素。在我们的案例中,我们将一个8位输入像素减少到二进制输出像素。因此,我们的阈值阵列是一个127的值。大于127的输入像素成为了逻辑1。≤127的像素成为了0。该算法定义如下:



1. IP(x,y)是当前输入像素
2. EPP是来自以前像素的剩余阈值误差,IP(x-1,y)
3. EP是来自以前扫描线的误差矢量,y-1。


       
IV. ALTERA OpenCL编译器
超出实际OpenCL代码的OpenCL系统的最关键部分是编译器。针对OpenCL 13.1,Altera SDK提供了一些独特的功能,包括[8]:
A. 通道
B. I/O通道
C. 内存访问合并(coalescing)
D. 自动循环流水线
E. 移位寄存器推理
A. 通道
标准OpenCL模型假设内核运行在基于全局内存的数据集。由内核#1从全局内存读取一个输入块,经处理将其结果写回全局内存的不同部分。如果第二个内核需要进一步处理来自内核#1的结果,就必须等待,直到内核#1完成,所有输出数据被写回全局内存。只有这样,内核#2才能读取和处理数据。显然,这个连续过程导致了流水线延迟,每个额外内核都以最佳线性增加的。而且,内存的每一次进出都增加了全局内存带宽,并降低了流水线吞吐量。为了解决这个问题,Altera提供了内核通道的概念,它允许来自内核#1的输出结果直接转到内核#2的输入。Altera离线编译(AOC)增加了所有必要的同步逻辑和FIFO存储器,允许数据从子内核n传递给内核n+1。图10显示了标准OpenCL和Altera厂商扩展通道数据流。


图10:OpenCL数据流与Altera的通道扩展

图字:
标准OpenCL模型:
系统内存
主机CPU
核心1;核心N
全局内存DDR3;内核接口
FIFO、DMA、DDR控制器、内存聚结器、结构总线转向、PLL时钟交错,等
内核N;内核;内核;内核1;内核M;内核;内核;内核N
本地内存——RAM块
内核
FPGA
有通道厂商扩展的OpenCL:
系统内存
主机CPU
核心1;核心N
全局内存DDR3;内核接口
FIFO、DMA、DDR控制器、内存聚结器、结构总线转向、PLL时钟交错,等
内核N;内核2;内核3;内核4;内核N;内核M;内核N+1;内核N+2
本地内存——RAM块
内核
FPGA
B. IO通道
IO通道是一个扩展通道概念,它允许外部IO直接连接到OpenCL内核。IO通道允许外部端口,如以太网、串行LVDS或OEM专用接口连接到内核,而无需首先进入全局内存。
在我们的MFP例子中,IO通道可以允许RGB扫描仪数据馈送到校准内核,然后连接到CCP。此外,CCP误差扩散输出视频数据可以馈送到在彩色打印机上打印图像数据的一个引擎内核。(请注意,我们尚未实现IO通道。这是留给未来的工作。)图11示出了IO通道数据流。


图11:Altera直接IO通道扩展的OpenCL数据流

图字:
有通道和直接IO通道厂商扩展的OpenCL
系统内存
主机CPU
核心1;核心N
全局内存DDR3;内核接口
FIFO、DMA、DDR控制器、内存聚结器、结构总线转向、PLL时钟交错,等
IO接口
IO接口
内核1;内核2;内核3;内核4;内核N;内核M;内核N+1;内核N+2
本地内存——RAM块
内核
FPGA
左边红字注解:直接IO通道允许外部IO(如以太网或串行Lite)和内核之间的直接连接
右边红字注解:通道允许内核之间的直接连接,而不需要访问全局内存
C. 内存访问合并
DDR内存对于随机访问非常低效。它对长脉冲串顺序数据效果最好。Altera的OpenCL编译器提供静态和动态内存合并。编译器将尝试静态识别OpenCL内核代码中的多个连续请求,并创建硬件来发出一个宽请求。例如,如果一个整数阵列被连续访问,则编译器将创建硬件用一个DDR控制器请求来一次抓取八个整数。此外,Altera的OpenCL内存系统提供动态数据重新排序。DDR输入队列按顺序接受它们收到的来自不同内核的内存访问请求。内部数据重新排序模块,检查输入队列地址和操作类型,然后动态重新排序请求。重新排序请求以优化排序存储在重新排序缓冲器中。内存控制器器读取重新排序缓冲器,并以优化形式存储/检索数据。图12示出了有排序缓冲器的高电平DDR控制器。


图12:Altera DDR控制器重新排序

图字:
全局内存DDR3;DDR控制器;DDR队列重新排序;DDR输入重新排序;全局内存总线        PCIe
内核接口
FIFO、DMA、DDR控制器、内存聚结器、结构总线转向、PLL时钟交错,等
IO接口
IO接口
内核1;内核2;内核3;内核4;内核N;内核M;内核N+1;内核N+2
本地内存——RAM块
FPGA
输入队列检查器
D. 自动循环流水线 - ALP
OpenCL内核通常描述一个单线程的工作,目的在于启动大量这样的线程来处理一个数据集。但是,一些问题最好表达为单线程算法。滤波和误差扩散是两个这样的例子。使用多线程进行滤波要么将需要过多的内存读取,这将在稍后讨论,要么需要线程之间过多的通信。由于从当前像素到其邻近像素的误差传播,用在CCP的佛洛伊德-斯坦伯格误差扩散算法很难并行化。
Altera OpenCL编译器以单线程算法提供了自动流水线循环。ALP允许以自然方式表达这类算法,并仍然获得了FPGA加速的全部好处。对于这个项目,滤波和误差扩散内核都通过编译器形成了自动流水线,实现了每个时钟周期一个像素的理想流水线效率。
E. 移位寄存器推理
Altera的OpenCL编译支持所谓移位寄存器推理(SRI)的优化。SRI对于滤波等滑动窗口操作特别有用,通常适用于上述循环流水线功能。从软件的角度来看,一个滑动窗口操作由一个固定大小阵列(通常比要处理的数据量小得多)和定义在该阵列中固定位置的元素操作组成。此时,要处理的数据被转换成阵列的一个元素,固定大小阵列的每个值下移一个位置,以容纳新的值。每个转移的数据值出现一个输出值。图13示出了用于7×7滤波器的移位寄存器阵列概念。


图13:移位寄存器阵列的例子

图字:
Line Buffer 行缓冲区
乘法器/加法器树——流水线的性能
结果
以黄色显示了移位寄存器阵列、D型触发器
通用时钟到所有逻辑没有显示
7×7滤波器要求来自7条输入线的7个输入像素来计算一个输出像素。一种简单方法是读取所有49个像素,计算一个输出像素,然后重复上述过程,读取接下来的49个像素等。但是这非常低效,因为你最终会读取图像N×M*49次,其中N是图像宽度,M是图像长度。
减少内存带宽的理想解决方案是一次读取一个图像像素,并把它们存储在本地移位寄存器的末端。在每个读取的像素上,移位寄存器被左移一位,滤波值是通过访问49个抽头点(tap point)来计算的。要执行7×7滤波器,移位寄存器必须是6条扫描线加7个像素长。一个新输出像素计算的是每个输入像素读取,除了第6条扫描线读取。另外,图像读取正好一次。不过,FPGA片上存储器的成本是很高的。对于一个7×7滤波器和宽度为5100像素的扫描线,6条扫描线+7个像素移位寄存器阵列是5100×6+7 = 30,607像素。在每个像素3个字节时,片上RAM块几乎是90KB或717Kbits。图14是编译器如何实例化一个移位寄存器和行缓冲阵列,减少了全局内存带宽的框图:


图14:采用SRI和SLB阵列的CCP滤波

图字:
全局内存;DMA读取通道;7×7滤波器矩阵
乘法器/加法器树——流水线的性能
Altera OpenCL编译器可自动识别来自OpenCL内核代码的移位寄存器设计模式,而无需编译器提示(如程序)的帮助。你可以简单断言用作代码中移位寄存器的一个固定大小阵列,而AOC将创建所需的硬件。
F. CCP数据流
CCP利用了所有Altera OpenCL编译器的改进,以提供最佳的性能。第一个CCP阶段是滤波,在逻辑上实现了3个并联滤波器操作。每个滤波器处理3个输入色彩空间(L*、a*和b*)中的一个。7×7滤波器从全局内存提取数据,填补移位寄存器,执行滤波功能,最终结果存回全局内存。存储在全局内存中的原始输入数据以隔行扫描线(SI)格式结构化。SI数据被定义为连续存储的一个彩色平面接着下一个彩色平面的整个扫描线,即N个像素。SI数据是突发读取全局内存的理想选择。我们选择这个格式实现未来的CCP增强,其中的输入数据将直接来自扫描仪。所有CCP数据均作为uchar4读取。
CCP缩放算法目前不能进行结构化来接受SI数据。由于缩放内核在滤波器输出上运行,我们要确保滤波结果以像素隔行格式写入全局内存。此外,后续内核、CST、调整和ED都需要像素隔行数据。像素隔行数据被定义为一个连续存储像素的所有四个彩色平面——Ci、Mi、Yi Ki Ci+1、Mi+1、Yi+1 Ki+1。图15示出了CCP数据流和数据格式。


图15:CCP内核数据流

图字:
LAB输入图像(扫描线交错);LAB过滤后的图像(像素交错);存储在内存中的CMYK半色调图像(像素交错)
EHPS DDR内存
可选FPGA DDR内存
uchar4(L1,A1,B1,X1)
为了保持内存BW像素隔行数据随uchar4写入,
第4像素未使用。虽然这增加了33%的内存缓
冲区,仍会大大改善内存BW
BWuchar4(Ci,Mi,Yi,Ki)
为了便于观看PC上的结果,误差扩散位没有被打包成二进制8位量,
而是留作字节,无论是0x00或0xFF(uchar4)。在一台真正的MFP
应用中,二进制输出将打包成字节,然后进行存储
滤波器;缩放R&E;CST(Lab到CMYK);调整;误差扩散
通道数据通路
全局内存数据通路


       

V. OPENCL系统级接口
一旦OpenCL内核代码被写入并进行了编译,它必须加以打包、加载并在参考板上执行。Altera提供了完整的SW架构来实现FPGA的汇编构建、加载和利用[8][9]。Altera OpenCL编译器采用OpenCL内核,并创建了一个优化的Verilog RTL映射。然后,采用Altera的AOC设计流程来处理Verilog代码,从而得到FPGA二进制编程文件,名为.sof。与创建FPGA.sof文件并行,一个标准C编译器(如gcc)用来编译与OpenCL内核通信的C主机代码。通信机制是通过一组链接到主机可执行文件的Altera OpenCL运行程序库实现的。图16示出了创建.sof和.exe文件的Altera OpenCL工具流程[9][10]。


图16:Altera OpenCL工具流程

图字:
LLVM前端;系统描述;C编译器;AC运行程序库
未优化LLVM IR
优化程序
优化的LLVM IR
RTL发生器;Verilog       
A. Altera参考板
Altera提供与OpenCL兼容的多种解决方案:可作为PCIe子卡的FPGA板和独立的SoC/FPGA板。我们选择了Altera Cyclone V SoC FPGA作为开发平台[11]。OpenCL Cyclone V SoC参考平台包含以下内容:
● 双核ARM Cortex A9 - 800MHz
● 1GB的DDR3 HPS,硬处理器系统,内存采用Linux,也可以直接访问FPGA。它是OpenCL全局内存的首选地点。
● 1GB的DDR31GB只可访问FPGA。它可用作OpenCL内核的“暂存(scratch pad)”全局内存。
● 千兆以太网与外部PC的通信
● Cyclone V FPGA5CSXFC6D6F31C8N FPGA
图17是我们的设计和测试中所使用的Altera参考板的框图[12]:


图17:Cyclone V SoC参考板框图

B. Altera OpenCL接口
OpenCL定义了4个一组的模型:平台;执行;内存和编程[13]。在平台模型级别,主机是Cyclone V SoC ARM内核,器件是FPGA架构。在器件内,我们采用了多个计算单元(CU)。
Altera OpenCL将内核模拟为通过其工作项目流动的深度流水线硬件架构。它定义了作为1个计算单元的内核流水线实例。程序员可以选择指定计算单元内核实例化的数量,以实现空间与吞吐量的权衡。指定较大数量的计算单元可消耗更多的FPGA架构,并在提高有效吞吐量的同时带来了全局内存争用和恒定缓存争用。在CCP例子中,我们采用了5个OpenCL内核,即7×7滤波器、缩放、CST、调整和误差扩散,每个都同时作为1个计算单元运行。
执行模型采用Altera的OpenCL上下文、命令队列和内存对象。CCP流水线是在一个ARM内核上运行的基于C语言的程序。它管理FPGA加速器架构中的主机程序和CU之间的所有切换。图18是一个简化系统软件接口图,示出了哪些单元是由用户提供的,Altera公司又提供了什么。


图18:OpenCL系统软件接口

图字:
应用SW MFP复印流水线
程序;OpenCL上下文;OpenCL命令队列;内存对象
内核;内核
OpenCL HAL
OpenCL用户空间驱动程序
FPGA非OpenCL部分Linux内核空间驱动程序;OpenCLLinux内核空间驱动程序
器件——FPGA
内核;本地内存;内核;本地内存;内核;本地内存


       
VI. 效果
所有CCP算法都是采用运行在x86 PC的标准C语言开发的。我们创建了一个简单的基于C语言的CCP流水线来顺序执行算法。然后,在x86和Cyclone V SoC ARM Cortex A9 CPU上同时执行基于C语言的流水线。基于C语言的流水线性能和效果是我们的标准参考。
之后,将每个基于C语言的CCP算法移植到OpenCL,并在x86上重新测试内核。然后,使用AOC重新编译标准OpenCL内核,并在Cyclone V SoC开发平台上进行测试。最后一步是修改OpenCL内核和包括Altera的通道厂商特定优化。
基于C语言的CCP运行于频率为3.1GHz的单核i7-3770,以及输出16.6 PPM的32GB的DDR3内存。同样基于C语言的CCP在一个Cyclone V SoC Cortex A9内核上执行,运行频率为800MHz,还有输出1.4PPM的1GB的DDR3内存。



请注意,在基于C语言的CCP实验中,我们使用了最高水平的GCC Linux优化——O3选项。不过没有尝试使用GPU/NEON协处理器。
在一个CSXFC6D6F31C8N Cyclone V器件上以74MHz运行的标准OpenCL内核输出10PPM。包括Altera的厂商增强的优化的CCP实现了72PPM。由于Altera的通道最大限度地减少了进/出全局内存的读取/写入结果,以及内核中的循环流水线,性能提升了7倍。



A. CCP多页性能
利用Altera通道扩展,具体内核执行时间不再是叠加性的。一旦数据进行了处理,并由内核N生成了结果,内核N+1即可开始其处理。这种并行处理使得CCP以最缓慢的内核速度执行,可忽略因流水线充填和排空造成的延迟。图19 CCP通道排序显示了这些通道的性能优势。
由于非顺序输入访问模式,我们当前的缩放内核实现方法不能接收来自通道的数据。像这样的滤波器结果必须首先写入内存,然后可以启动缩放内核。进一步的通道优化有可能消除中间全局内存存储/检索操作。三个通道和每个通道2行缓冲阵列将消除滤波器到定标器(Scaler)全局内存操作。


图19:CCP通道排序

图字:
输入图像;每幅图像约100MB
滤波器内核
缩放内核
CST内核
TRC内核;每幅图像约132MB
误差扩散内核;每幅图像约16MB
FCOT;2-N COT;流水线完成延迟
N份总时间;时间

首次复印时间(FCOT)是测量完成第一张图像处理需要多长时间。2-N-COT是处理第二张和任何后续图像所需要的时间。在图19中我们看到,在滤波器和扩展内核处理完第一张图像后,它们可以立即开始处理第二张图像。随着处理的图像数目增加,CCP启动延迟和空延迟可以分摊到图像总数N。


图20:OpenCCL CCP PPM与输入图像数的关系

图字:
OpenCL复印流水线加速
输入页数
在C8速度等级测量的OpenCL CCP性能是最低成本/最低性能的Cyclone V系列。图20示出了作为输入页面数量函数的基准CCP性能。Cyclone V C6速度等级最快,会增加20%的性能。
相比Cyclone V C6,Altera的Arria V SoC系列FPGA预计将提高15%的性能。图21显示了三个速度等级的实际和预期性能。


图21:Cyclone V SoC C8/C6和Arria V SoC CCP性能

图字:
OpenCL复印流水线加速
Cyclone V PPM C6速度等级                                                                Cyclone V PPM C8速度等级
Cyclone V PPM C6速度等级
Arria V SoC PPM
输入页数
B. 器件利用率
与所有Altera的扩展一起优化的CCP消耗83%的5CSXFC6D6F31C8N逻辑资源。崩溃(breakdown)总结于表3中。




       
VII. 扩展和增强
A. 扩展CCP到整个系统
下一步骤是采用CCP并将其连接到数据输入的扫描装置和数据输出的打印装置。这将需要增加一个校准内核和简单的CST将RGB转换为L*a*b*。根据在扫描设备中使用的传感器阵列类型,即电荷耦合器件或接触式图像传感器,红、绿和蓝行数据可能无法在垂直方向对准。行数据的对准可能需要几十行缓冲区,这在FPGA内存资源方面是非常昂贵的。为了缓解这一问题,原始RGB数据将使用DMA暂时保存在HPS内存中。然后,红、绿、蓝、行数据的对准可以使用DMA指针和偏移来完成。然后校准对准的RGB数据,并通过通道传递到基本CST内核。
基本CST内核将依次使用通道直接将数据传递到滤波器输入模块。我们的期望是,这些额外内核将适合未使用的逻辑和内存资源。图22显示了完整的复印流水线。请注意,除了有全扫描仪接口的CCP,分割、无损压缩模块和引擎级都不适合Cyclone V SoC器件。完整的图像路径将需要更大型的FPGA。
B. ARM内核和NEON协处理
除了FPGA架构和OpenCL,Altera SoC系列器件还采用了双核ARM Cortex A9内核和NEON协处理器。图像处理流水线的某些模块可以卸载到CPU。在分割操作和完成压缩/解压缩功能的特定部分可以使用NEON提供的有SIMD加速的CPU来完成。
C. 动态FPGA可重编程性
Altera SoC FPGA提供的动态重新配置允许用户重新编程FPGA架构,同时CPU运算继续运行。这个特点在MFP中特别有用,而其中的一些操作永远不可能同时发生。例如,扫描和复印操作共享6个共同输入功能,如图22所示。其余的复印操作、CST压缩,以及剩下的扫描输入功能、JPEG压缩将永远不会同时运行。因此,我们可以创建两套内核,其中包括共同的扫描仪功能和多种后端功能。这些流水线可以在给定所需时间基于MFP操作来动态加载。在一个传统ASIC中,这些模块和数据通路都必须包括在内。动态图像路径的重新配置可以实现更小的FPGA,从而实现更低成本的图像路径。
D. Arria V和Arria 10 SoC
Altera的Arria V和最近发布的Arria10 SoC为功能齐全的MFP图像路径解决方案提供了一个可扩展平台。增加的内存、更快的时钟速度,加上更高性能ARM内核的大型FPGA架构为图像处理和一般计算要求提供了完整解决方案。


图22:完整的复印和扫描流水线

图字:
复印流水线
来自CCD或基于CIS扫描仪的RGB;分割;图像内存;无损解压缩;图像调整;引擎接口
扫描仪接口;校准和调整;CST(RGB到Lab);滤波器;缩放R & E;CST(Lab到CMYK);调整;误差扩散;无损压缩;至引擎
扫描出口流水线
来自CCD或基于CIS扫描仪的RGB;分割;图像内存;JGEG解压缩;至网络
扫描仪接口;校准和调整;CST(RGB到Lab);滤波器;缩放R & E;JGEG压缩;JGEG压缩;出口处理;无损压缩
通用内核/模块;流水线特定内核/模块
VIII. 总结和结论
OpenCL和Altera的工具链有助于2名全职OpenCL软件工程师、1名全职硬件工程师和其他兼职人员的一个小型团队在约4.5个月内实现CCP。团队可从C语言算法开始,创建一个高水平的基于C语言的CCP图像流水线,将算法移植到OpenCL,在x86平台上测试OpenCL以验证基本功能,增加厂商特定扩展,学会Altera OpenCL工具流程,最后在Altera的参考平台上测试结果。团队还可开发一个测试环境来验证位级别OpenCL结果的正确性。此外,团队可创建一个基于Web的应用,允许用户选择源图像,通过一个基于C语言的CCP和OpenCL加速的CCP运行图像,显示半色调图像,并提供计时结果。软件工程师可以没有以往的FPGA经验,硬件工程师也可以没有以往的OpenCL经验。
这种新模式演示了一个小型团队如何可以快速从一组算法到全面功能,优化以硬件实现的流水线。大约50%的开发时间专注于优化,包括最大限度地提高性能和最大限度地减少FPGA资源利用。该团队预计,后续项目开发时间可减少50%。
MFP厂商不再需要投入数百万美元和多年时间来开发ASIC或SoC。OpenCL和Altera SoC器件提供了一种在最短时间内实现高性能、低成本MFP控制器的新模式。
IX. 参考文献
        [1] 全球季度硬拷贝设备跟踪,2013年8月,国际数据公司,美国马萨诸塞州弗雷明汉
        [2] Rafael C. Gonzalez,数字图像处理(第3版),Prentice Hall,2007年
        [3] Ted Dillard,彩色流水线:控制数码彩色革命路径(A Lark Photography Book)平装,Sterling,2009年
        [4] 多种办公应用的高性价比图像路径,Xing Li,Ramesh Nagarajan,Clara Cuciurean-Zapan,Francis Tse。(2012年3月6日)美国专利8,130,389
        [5] R. L. Queiroz,“扫描图像MRC多层的预处理,”IEEE ICIP 2006,3093-3096页,2006年10月
        [6] 混合光栅内容(MRC)图像数据的压缩,Xing Li,Ramesh Nagarajan,Ammal Z. Malik。(2007年3月13日)美国专利7,190,837
        [7] R.W. Floyd,L. Steinberg,“一种空间灰度自适应算法,”信息显示学会论文集,第17卷,75–77页,1976年
        [8] Altera,Altera SoC SoC嵌入式设计套件,2013年。
        [9] Altera,针对OpenCL的Altera SDK编程指南,2013年。
        [10] Altera,针对OpenCL的Altera SDK优化指南,2013年。
        [11] Altera,Cyclone V SoC开发板参考手册,2013年。
        [12] Altera,Altera用户可定制基于ARM的SoC,2013年]。
        [13] Khronos OpenCL工作组,OpenCL规范,版本1.0.29,2008年12月8日。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top