PowerVR与BeagleBoneBlack开发的乐趣:让低成本开发更容易

作者:Benny Har-Even


开发板很酷, BeagleBone®Black(BBB)是最有趣的开发板之一。这种广泛使用的微型电路板价格约为35英镑,启动Linux只需10秒,让任何有兴趣的开发者快速入手。

为此,Imagination公司一直与 BeagleBoard.org®基金会合作,使用户能够从 BBB 中获益。BeagleBone®黑色 (BBB) 板上的主要处理器为Arm®Cortex®A8和PowerVR SGXTM 530 图形处理单元 (GPU),从教育角度来看,开发者可利用标准 OpenGL® ES 2.0 和 Open CL TM1.1 ABI更好地开发应用程序。


新发布的 OpenCL 库和文档允许 BBB 用于探索 OpenCL。尽管它不是一个高性能的解决方案,但好处是让学生能够以相对较低的成本学习如何在BBB平台上编程。一些应用程序具有宽松的延迟要求和大量的信号处理,这将受益于卸载的A8核。例如,文档包中包含 ALSA 示例率转换器 ,如果延迟放宽,A8 负载将从 55% 降低到 20%。希望通过提供这个库,BeagleBone社区可以找到其他有用的地方来利用OpenCL。

在PowerVR SGX530上运行OpenCL——真的吗?

PowerVR SGX530 是Imagination最成功的 GPU 设计之一,目前仍被广泛使用中。不过,SGX530 是10年前的设计,并在Open CL成为标准前设计的。尽管如此,Imagination还是在PowerVR SGX530上为OpenCL 1.1提供了支持,鉴于BeagleBone Black的广泛使用,我们重新启动了这项工作,并在这里介绍它。

此包中的 SGX530 OpenCL 二进制仍然是一个正在进行的工作,必须注意的是,这些二进制文件尚未完全符合OpenCL 1.1 一致性。我们不应认为 OpenCL 驱动程序是"原样"的,并且有在示例中描述了局限性。

使用OpenGL ES2.0

有一个特定的 BBB 映像 AM3358 Debian 9.12 2020-04-06 4GB SD ImgTec 附带 TI SGX 图形驱动程序和PowerVR SDK 预装。这是探索开放GL和OpenCL的基础。

BBB 映像下载地址:https://debian.beagleboard.org/images/bone-debian-9.12-imgtec-armhf-2020...

PowerVR SDK 提供了一些示例,从将三角形绘制为最基本的图形元素(图 1)开始,直至使用顶点和片段着色器来生成更复杂的图像(图 2)。这可用于自学。或者,BBB 也可以用作移动图形入门课程的开发平台。

图1:基本三角形

图2:添加顶点和片段着色器

理解OpenCL1.1

OpenCL软件包可以在Imagination Technology 大学项目网站(https://university.imgtec.com/)下载。此软件包包含一个构建脚本,该脚本将安装OpenCL 库并修补 PowerVR SDK,仅允许为 BBB 构建 OpenCL 1.1 矩阵示例。

OpenCL 矩阵乘法示例用于教育目的,以了解OpenCL如何在嵌入式平台(如BBB)上运行。要理解的关键点是,在Arm A8和PowerVR SGX530之间传递数据缓冲区以及管理它们之间的数据缓存一致性所隐含的开销。在这段开销时间内,没有有用的处理工作完成,因此可以认为是“浪费”时间。与开销相比,图 3 中显示的处理时间非常大,例如,当 A8在 SGX 处理时释放以执行其他任务时,BBB 上的 OpenCL 变得非常有用。

图3:OpenCL开销和处理时间

使用多个 OpenCL 核来说明如何使用float4 类型(四包 32 位数据值包)上的单指令多重数据 (SIMD) 指令来提高SGX的处理性能。

必须指出,如果目标是 BBB 上最快的处理时间,那么最佳解决方案是使用 Arm® NEONTM内部指令,因为不涉及开销。

使用OpenCL 1.1

矩阵乘法示例有助于理解 OpenCL。下一步是在一个真实的示例中使用OpenCL,该示例具有高处理和宽松延迟的正确组合。所选示例是音频播放器应用程序中使用的 ALSA 采样率转换器(SRC)。高处理要求来自 44.1kHz 到48kHz 的上采样,事实上,它是一个播放器,这意味着延迟要求可以放宽。OpenCL 实现适合 ALSA 软件,如图 4 所示,修改libspeexdsp层以调用OpenCL。

图 4:ALSA 软件架构与 libspeexdsp 修改为调用 OpenCL

这个例子是通过运行一个脚本来构建的,这个脚本将下载并修补ALSA包。OpenCL 库是作为C++库提供,因此 ALSA 需要与 g++编译,以确保 OpenCL构造函数/析构函数被正确调用。g++编译器比 GCC 更严格,因此大多数补丁都是为了纠正指针上的类型转换,确保初始化的结构完全初始化,并顺序正确。

要利用 OpenCL,所使用的算法必须完全并行,每个输出样本都执行相同的操作。libspeexdsp中的SRC 算法实际上并没有做到这一点,因为内循环计算的索引值将用于外循环的下一次迭代。这意味着需要对ALSA-SRC算法进行重新分解,以便可以将索引计算步骤从处理循环中析构出并优先实现,从而使处理循环在每次迭代中都是相同的。

由于aplay只是一个回放应用程序,因此可以放宽延迟要求。结果证明这是必要的,因为处理160个样本的标准输入音频缓冲区大小的开销阻止了OpenCL调用的实时执行。缓冲尺寸为 640 个或更多样本,实现了可靠的操作。通过 1600 个样本缓冲区,在A8上运行SRC时的A8负载从55%降低到20%。此 CPU 卸载是在 BBB 上使用 OpenCL 的主要优势,我们希望社区能够找到其他能够提高基于 BBB 系统的性能的使用案例。

OpenCL下载包中的文档更加详细,以帮助读者了解 OpenCL 操作并能够有效地使用它。

英文链接:https://www.imaginationtech.com/blog/fun-with-powervr-and-the-beaglebone-black-low-cost-development-made-easy/

声明:本文为原创文章,转载需注明作者、出处及原文链接。

最新文章