OpenCL

【视频】Demo -- 借助PowerVR GPU和OpenCL实现人脸检测和识别

下面的视频展示了视觉处理方面更实际的一个Demo的运行情况,还使用了PowerVR深度神经网络(DNN)库,这两者都是由PowerVR研究团队和视觉团队开发的。这个深度神经网络库采用高级指令、权值和偏差并转换成GPU可以处理的数据,然后我们继续采用OpenCL库对这个网络进行实时处理。
文章链接:借助PowerVR GPU和OpenCL实现人脸检测和识别

测试GPU的计算性能

在探讨给PowerVR Rogue GPU编写OpenCLkernels的快速指南以及分析针对图像卷积滤波的多种计算方案学习后,接下来我将花些时间来谈谈开发人员如何测量他们在PowerVR Rogue GPU上编写的OpenCL kernel的性能。

运行在CPU上的标量代码的性能取决于处理器执行汇编指令的速度。其次取决于诸如数据类型的选择(和ALU的性能有关)和编译器标志(例如,循环展开)

GPU上运行的矢量代码的性能却很难量化。正如这篇文章上讲到的,Rogue GPU包含了一些列并发的,多线程处理器。在这种条件下,每个任务都是单线程执行并且拥有一定数量的效率,这和在标量处理器比如CPU上运行代码类似。然而,除此之外,这里也有和使用率相关的性能指标 (由于多个warp的并发调度导致如此多的内存延迟被掩盖),占用率 (对于多处理器是多么的容易掩盖延迟)和并行化(什么样程度的线程在warp执行时可以锁步而不偏离).

下图展示了3个kernel在GPU上超时运行的情况。每个内核都有一个绝对执行时间,甚至在在更大的系统当中,一个内核多次执行时可能会有延迟,比如为CPU腾出时间来准备下一批数据的处理。除了这些绝对时间,每个内核都有三个效率指标,正如上面所提到的。接下来我们将会详细的进行讨论。

PowerVR成像框架内支持零拷贝流

在先前的一篇文章中,我介绍了PowerVR成像框架,即OpenCL和EGL API的扩展,其可使PowerVR GPU和其他系统部件如CPU、ISP和VDE之间实现有效的零拷贝内存共享。

大多数流使用EGL来促进多个客户机API之间的对象共享,这便需要Khronos扩展CL_KHR_EGL_IMAGE。以下示例展示了PowerVR成像框架内支持的不同的零拷贝流。

本地YUV半平面图像的GPU采样

下图展示了硬件组件将YUV半平面图像写入内存的配置,该配置使用Android gralloc缓冲区,且GPU直接对亮度和色度值采样。

本地YUV半平面图像的GPU采样

主机代码应两次调用eglCreateImageKHR,以将Gralloc缓冲区的两个EGL图像实例化。以0(用于Y面)和1(用于UV面)两个值来传递选项EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG和CL_NATIVE_BUFFER_PLANE_OFFSET_IMG。

深潜水:在PowerVR上进行OpenCL人脸检测

Imagination的研发小组开发了一种人脸检测算法,它是基于一个分类器迭代以及优化运行在移动设备上其中包括一个CPU和PowerVR GPU构成。该算法使用几种优化以提高性能和精度。特别是,代替为脸谱搜寻一整个帧, 检测器将搜索区域限制在那些以前检测的加上一些随机选择的区域。追踪以前发现的脸以确保他们不会被遗失,同时测试各种各样的其他区域以确保新面孔能够被迅速找到。

在下图中所示的主要步骤如下:

在CPU和GPU上实现人脸检测的模块图

在CPU和GPU上实现人脸检测的模块图

异构计算案例研究:图像卷积滤波

在先前发表的一篇文章中,我为PowerVR Rogue GPU上如何编写OpenCL内核作了简单的介绍;这篇文章也为下一步奠定了基础:实用案例研究,解析如何使用OpenCL来编写图像卷积内核。

许多图像处理任务,比如模糊、锐化和边界检测可以通过图像与数字矩阵(或内核)的卷积来实现。下图显示了一个3X3的内核,实现了一个平滑滤波器,将图片中每个像素的值替换为包括其自身在内的周边像素的平均值。

内核卷积

内核卷积通常需要图像边界之外的像素值。有很多方法可以用来处理图像边界,比如为卷积扩充最近边界的像素值,或者是排除掉输出图像中需要输入图像边界之外像素值的部分像素,这种方法将降低输出图像的大小。

下表上半部分显示了该滤波器算法的伪代码,下半部分是C代码实现。在C程序中,假设每个像素表示为四个分别代表R、G、B、A的8位数组成的32位整数,宏MUL4执行四个独立乘法,每个乘法对应这四个8位值中的一个。

视频:PowerVR 5XT和6系列运行OpenCL (图像调整)

OpenCL的图像调整演示demo允许用户通过一系列图像编缉软件中的通用工具修改图像,选择的是被认为在许多图像编辑程序通用工具来修改图像。该demo能够在运行OpenCL的GPU,单线程CPU,和用多线程的CPU之间进行切换。通过比较展示了使用PowerVR硬件计算相比于单独使用CPU的性能优势。

PowerVR Rogue图形处理器内核编写快速指南(一)

本文及下月发布的后续文章会介绍关于PowerVRRogue系列架构的OpenCL编程。

首先,我会向你展示OpenCL的编程基础(其使用基本程序),和Rogue图形处理器的语言执行说明。

接下来我会用图像过滤程序案例来说明Rogue构架的编程指南。

OpenCL概述

设想一个简单的C程序,使两个二维阵列的对应元素相乘:
voidmatrix_mul_cpu(const float *a, const float *b, float *c, int l, int h)
{
inti;
for (i=0; i for (j=0; j c[i][j] = a[i][j] * b[i][j];
}

该for循环由两部分组成:向量(包含l*h个元素的二维向量)及乘法运算。各个循环迭代相互独立,之间不存在数据相关。这意味着这些乘法运算可在GPU的无数线程中并行运算:

OpenCL程序由两部分构成:一个在主机CPU上运行,另一个在图形处理器上运行。要想在GPU上执行代码,首先要定义OpenCL内核,内核由含有额外关键字及数据类型的变体C语言写成。接着前面的案例,一个OpenCL内核实现简单乘法的方式如下:

适用于Android的PowerVR影像架构

在建置低功耗的计算机视觉算法时,存储器带宽是主要面临的瓶颈。幸运的是,Imagination开发了一套创新的解决方案,可解决行动和嵌入式装置的常见问题 ─ 这套解决方案称为 PowerVR Imaging Framework (PowerVR影像架构)。

适用于Android的PowerVR影像架构包含一组OpenCL和EGL应用程序接口(API)的延伸程序,可使在PowerVR GPU上执行的软件能与CPU、ISP和VDE等其它元件有效的互通。这些延伸程序能在横跨多个硬件元件上实现共享的存储器分配与软件的管线建置,而且无需冗余的存储器复制(称为零复制;zero-copy)

此外,延伸程序能实现YUV影像的直接操作,这是许多计算机视觉算法所需要的,同时,还能让GPU原生地读取YUV影像,并在资料从存储器读取到硬件缓存器时直接转换到RGB 格式,因此可避免带宽成本,与其它必须在转换时先在存储器中以RGB格式建立影像复本的方式不同。

图一:Android中的影像处理软件管线 ,在ISP和GPU间建置了零复制流程。

compute 异构计算的完整术语

过去十年,Imagination一直走在异构计算的前沿。Imagination不仅是HAS基金的创始成员之一,同时,很多当下可用的开放异构计算标准也由其制定,包括OpenCL、OpenGL ES和Vulkan在内。

我们的MIPS处理器、PowerVR多媒体技术和Ensigma连接IP集成在很多移动和嵌入式计算平台中。每个硅IP系列已进行优化,使之保持最佳性能的同时,又能节省功率和空间。

在我们即将发布的系列文章中,我的同事道格•瓦特将探讨SoC设计师和软件开发人员如何利用协调效应,在芯片内多个引擎中实现异构计算。为方便大家浏览异构计算相关术语,有必要对要使用的技术词汇提供简单的指导。

下表大部分的术语都涉及到PowerVR Rogue GPU、OpenCL或GPU计算概念:

Term术语

深入解读Khronos联盟的 OpenCL---一种另类计算API

计算API是移动系统和嵌入式市场空间的新趋势,与3D图形API的开发相比,它经历了大量的差异化概念研究。用于3D图形移动系统经优化的OpenGL ES API自用于桌面PC且经过市场测试的OpenGL API发展而成;这使得API发展迅速,且风险度相当低。在移动领域当中,以下两个开发方法均引起开发人员的关注:Khronos开发的OpenCL API(不受操作系统的限制),谷歌开发的Android专用Renderscript API。虽然在显示并行计算功能方面,这两种API目标相同,但这两种API所使用的方法及背后的设想却差异很大,我将在下文进行说明。

同步内容
--电子创新网--
粤ICP备12070055号