ARM嵌入式系统上OpenCL测试

标签: ARM OpenCL embedded NXP iMX6
1615人阅读 评论(0) 收藏 举报

By Toradex Giovanni Bauermeister

1). 简介

相比曾经,如今科技设备对处理性能和速度要求越来越高。为了应对这种技术需求,许多公司发明了不少方法来获得更好的处理性能。例如苹果公司,发明了 Open Computing Language (OpenCL)。2008年6月,苹果公司向 Khronos Group 提交了 OpenCL 工作建议。历经五个月的研发,OpenCL 1.0 于 2008 年 11 月发布。

 

OpenCL 是为个人电脑、服务器、移动设备以及嵌入式设备的多核系统提供并行编程开发的底层 API。OpenCL的编程语言类似于 C 语言。其可以用于包含 CPU、GPU 以及来自主流制造商如NXP®、NVIDIA®、Intel®、AMD、IBM 等的处理器的异构平台。OpenCL 旨在提高应用软件如游戏、娱乐以及科研和医疗软件的运行速度和响应。

 

在本博文中,我们使用 Toradex公司基于NXP iMX6Q SoC的计算机模块产品Apalis iMX6Q 来测试 OpenCL,对比两个应用 - 一个运行在 GPU 上,另一个则在 CPU。最后我们将分享本次测试的结果。

 

2). 测试硬件平台

Toradex 的 Apalis iMX6Q 计算机模块采用 NXP 的 iMX6 四核处理器,其提供的处理性能特别适合于多媒体应用。该处理器具有 4 个 ARM® Cortex®-A9 核,最高主频为 800MHz。除了处理器,Apalis 系统模块还具有高达 2GB DDR3 RAM(64bit)和 4GB eMMC Flash。

 

除了具备出色的图形和多媒体处理能力,该处理器还具有 Vivante GC2000 3D GPU,其能够支持 OpenCL EP (Embedded Profile)。因此,我们能充分够利用 i.MX6Q GPU 处理能力。

 

3). Toradex Embedded Linux 镜像中添加 OpenCL

我们假设你已经具有能够编译 Apalis iMX6 镜像的 OpenEmbedded 编译环境。你可以参考Toradex开发者中心 OpenEmbedded (core) 文章。

为编译支持 OpenCL 以及相关库文件的嵌入式 Linux 镜像,需要采取以下步骤:

 

4). GPU 和 CPU 代码

我们使用数列求和应用作为基本的演示例程。第一部分代码运行在 GPU 上,第二部分则在 CPU 上。应用执行完毕后打印其所消耗的时间。使用 OpenCL 所需的头文件是 cl.h,位于文件系统的 /usr/include/CL 目录。链接程序所需的库文件是 libGAL.so 和 libOpenCL.so,位于 /usr/lib 目录。

 

为了计算消耗的时间,我们创建带分析功能的队列,在结束的时候获取分析的结果。

 

OpenCL 代码见如下GitHub链接:

https://github.com/giobauermeister/OpenCL-test-apps/tree/master/cl_sample_timer

CPU 代码是简单的 C 程序,和上面一样计算同样的队列求和。为了计算消耗的时间,我们使用 time.h中的库。代码见如下链接:

https://github.com/giobauermeister/OpenCL-test-apps/tree/master/proc_sample

 

5). 交叉编译应用

同一个 Makefile 可以用于交叉编译 GPU 和 CPU 应用,如以下面链接Makefile为例,不过你需要注意下面的三个变量。根据你的系统做相应的调整:

https://github.com/giobauermeister/OpenCL-test-apps/blob/master/proc_sample/Makefile

 

a). ROOTFS_DIR -> Apalis iMX6 文件系统路径

b). APPNAME -> 应用的名字

c). TOOLCHAIN -> 交叉编译工具的路径

 

在应用所在的目录中保持 Makefile 文件,然后运行 make。 最后将编译生成的文件复制到 Apalis iMX6 开发板上。

 

6). 在执行两个应用程序后,我们得到以下结果:

--------------------------------

### Processor time

Execution time in miliseconds = 778.999 ms

Execution time in seconds = 0.779 s

 

### GPU time

Execution time in milliseconds = 12.324 ms

Execution time in seconds = 0.012 s

--------------------------------


根据以上结果,我们可以很清楚地看到在 Apalis iMX6Q GPU 上使用 OpenCL 能够加速队列求和运算。

 

7). 总结

用户想要使用 Apalis iMX6Q GPU ,除了其他的方法,还可以使用 OpenCL 提高计算性能。正如本博文所描述,借助 OpenCL,可以在不同设备从图形显卡到超级计算机以及嵌入式设备,运行代码。用户还可以进一步结合,例如在 OpenCV 中使用 OpenCL 提高计算机视觉的性能。这个演示可以作为开发无图形界面应用的例程。

 

参考

https://www.khronos.org/opencl/

https://en.wikipedia.org/wiki/OpenCL

http://www.drdobbs.com/parallel/a-gentle-introduction-to-opencl/231002854

https://community.freescale.com/docs/DOC-93984

https://community.freescale.com/docs/DOC-100694

http://developer.toradex.com/products/apalis-imx6

https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetEventProfilingInfo.html

http://parallelis.com/how-to-measure-opencl-kernel-execution-time/

https://software.intel.com/en-us/articles/intel-sdk-for-opencl-applications-performance-debugging-intro

 

本文最初以葡萄牙语在 Embarcados.com 上发表,请参考这里。

查看评论

安卓平台下ARM Mali OpenCL编程-GPU信息检测

对于ARM Mali GPU,目前是支持OpenCL1.1,所以我们可以利用OpenCL来计算我们的计算。               一直以来,对于Mali GPU的OpenCL编程,一直没有环境来...
  • wcj0626
  • wcj0626
  • 2015-04-08 01:14:28
  • 6279

安卓平台ARM Mali OpenCL例子-灰度转换

手头一块RK3288的板子,在板子上测试了1080p一个灰度转换的OpenCL例子。OpenCL没有任何优化。例子请移步这里。 该例子是编译成安卓平台下的可执行程序。     进入jni文件夹,进行如...
  • wcj0626
  • wcj0626
  • 2015-04-09 00:50:53
  • 2654

OpenCL嵌入式图像处理

手上拿到同事给的 飞思卡尔  imx6. zhiq
  • huangcanjun187
  • huangcanjun187
  • 2014-11-06 12:28:22
  • 2272

Ubuntu14.04配置OpenCL开发环境

参考资料 [1]ubuntu下搭建OpenCL开发环境
  • Q1302182594
  • Q1302182594
  • 2016-08-23 13:35:53
  • 2842

嵌入式深度学习之NCNN交叉编译Arm Linux

参考文档 NCNN在RK3288 Linux系统的原生编译问题解决 本文档涉及到的目标硬件为英伟达JetsonTX1(4核Cortex-A53,Armv8.0架构),但是对其他Arm芯片也有一...
  • sanallen
  • sanallen
  • 2018-01-10 13:36:22
  • 767

OpenCL编译环境配置(VS+Nvidia)

英伟达的显卡首先要下载安装CUDA开发包,可以参考这里的步骤:   VS2015编译环境下CUDA安装配置 安装好CUDA之后,OpenCL的配置就已经完成了80%了,剩下的工作就是把OpenCL的路...
  • dcrmg
  • dcrmg
  • 2017-02-16 07:17:27
  • 3089

LINUX 下查看GPU信息

http://www.pcpop.com/doc/1/1456/1456899.shtml?t=1450719603873
  • u010794281
  • u010794281
  • 2016-04-16 15:58:37
  • 366

OpenCL性能对比测试案例,合理使用clfinish()函数,充分发挥指令队列(commandqueue)特性。

用的公司的电脑,配置如下: CPU: AMD Athlon X4 830 (3.0GHz 四核) 内存: 8GB GPU: nVIDIA GT710 (0.954GHz 192cores 1CU...
  • jinxiu0406
  • jinxiu0406
  • 2017-09-20 10:19:39
  • 693

测量OpenCL 执行时间

如何使用OpenCL 自带的API来测量执行时间,因为执行时间很快,无法用秒表测量到执行过程中的时间。OpenCL API 提供了正确的测试内核执行时间的方法。Create Queue with Pr...
  • u013625961
  • u013625961
  • 2017-02-28 15:08:49
  • 769

【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案。似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对...
  • LG1259156776
  • LG1259156776
  • 2017-06-15 07:45:04
  • 1018
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 1890
    排名: 2万+
    文章分类
    最新评论