By Toradex胡珊逢

1). 简介

伴随着 4G 网络的大范围覆盖,已经即将到来的 5G 网络,边缘计算越来越多地开始进入人们的视野。相比于云计算的云端集中处理,边缘计算能够就地进行复杂数据的计算,并迅速作出决策。由于免去了数据的远程传输,边缘计算能够带来更低的延时、更可靠的数据安全。但这也对边缘计算设备带来更大的挑战,特别是计算性能。下面我们将介绍如何在NXP 最新的 iMX8X ARM处理器上面利用 GPU 加速运算快速傅里叶变换 FFT。

本文所演示的ARM平台来自于Toradex Colibri iMX8X 计算机模块,此模块是 Toradex 基于 NXP iMX8 X 推出的紧凑型 Arm 核心板。iMX8X 具有最高4核 64-bit Armv8-A Cortex-A35,主频1.2GHz。Colibri iMX8X板载 WIFI 和蓝牙,使其能够便捷地连接网络和移动设备。集成 Cortex-M4 处理器, iMX8X 除了支持 Linux 等高级操作系统外,还可以同时运行 FreeRTOS,执行低功耗或者实时应用。丰富的工业接口如 CAN、SPI、UART、双以太网等,便于连接外部设备。 GC7000Lite GPU 图形处理单元,峰值算力 64 GFLOPS,支持OpenCL、OpenGL 以及 Vulkan ,方便用户利用 GPU 资源。使用 GPU 处理计算密集型数据,除了能够提高效率外,还可以有效降低 CPU 负荷,保证用户应用流畅运行。接下来你将会了解如何使用 OpenCL 在 iMX8X 上的 GPU 实现 FFT 计算。

2). 搭建开发环境

在撰写本文时,Toradex 基于 imx-4.9.123 Linux BSP 提供 Colibri iMX8X 的支持。由于是早期发布阶段,Toradex SDK 并没有集成使用 OpenCL 在 GPU 计算FFT的库文件,如 GLi、Tclap 等。为了生成完整的 SDK ,我们将使用NXP 标准的 Yocto 环境来生成 SDK 和 FFT demo。

./ 初始化 Yocto

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

$ mkdir imx-yocto-bsp
$ cd imx-yocto-bsp
$ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-rocko -m imx-4.9.123-2.3.0-8mm_ga.xml
$ repo sync

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

./ 修改 local.conf.org,添加下面内容

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

IMAGE_INSTALL_append = " devil devil-dev imx-gpu-sdk libzip"
CONF_VERSION = "1"
TOOLCHAIN_TARGET_TASK += " devil-dev imx-gpu-sdk libzip"

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

./ 编译文件系统和交叉编译工具

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

$ bitbake fsl-image-gui
$ bitbake meta-toolchain

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

./ 提取文件系统文件,其中包括编译所需的头文件等

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

$ runqemu-extract-sdk ~/imx-yocto-bsp/build-imx8qxpmek/tmp/deploy/images/imx8qxpmek/
fsl-image-gui-imx8qxpmek-20190315085707.rootfs.tar.bz2 ~/imx8qxpmek-rootfs

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

./ 添加 OpenCL 头文件
可以从下面下面链接下载 https://github.com/KhronosGroup/OpenCL-Headers,解压后将其复制到 .../imx8qxpmek-rootfs/usr/include/

./ 建立 libzip 库软链接

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

$ cd ~/imx8qxpmek-rootfs/usr/lib
$ ln -s ../../lib/libz.so.1.2.11 libz.so.1

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

./ Colibri IMX8X SD 卡文件系统构建和烧写方法请参考这里。

3). OpenCL FFT demo 编译

NXP 的 DemoFramework 提供了大量基于 GPU 的demo,包括使用OpenCL、OpenGL 和 Vulkan,用户通过这些 demo 快速了解 iMX GPU 的开发使用方法。下载地址 https://github.com/NXPmicro/gtec-demo-framework

./ Toradex Colibri iMX8X 的 imx-4.9.123 Linux BSP 采用 DemoFramework v5.1.1。下载后解压,并进入该目录,设置编译的环境。

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

$ cd gtec-demo-framework-5.1.1
$ pushd ~/imx-yocto-bsp/build-imx8qxpmek/tmp
$ source environment-setup-aarch64-poky-linux
$ export ROOTFS=~/imx8qxpmek-rootfs
$ export FSL_PLATFORM_NAME=Yocto
$ popd

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

./ 编译 FastFourierTransform

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

$ source prepare.sh
$ cd DemoApps/OpenCL/FastFourierTransform
$ FslBuild.py

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

在 Yocto 编译环境中,系统会根据依赖关系自动下载所需的软件包。

4). 运行 FFT demo

./ 为了便于观察 FFT 结果,我们修改输入信号,使用单频率的正弦函数。例如以 44.1KHz 频率采样一个 1KHz 的信号,采样点数4096,并对采样结果做 FFT 变换。
https://github.com/NXPmicro/gtec-demo-framework/blob/master/DemoApps/OpenCL/FastFourierTransform/source/FastFourierTransform.cpp#L432
中的三角波修改正弦信号。

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

m_Freal[i] = m_intime[2 * i] = sin(1000 * (2 * 3.1415926) * i / 44100);
m_Fimag[i] = m_intime[2 * i + 1] = 0;
m_outfft[2 * i] = m_outfft[2 * i + 1] = 0;

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

./ 将编译好的 FastFourierTransform 和 Content 目录以及其中的 fft.cl 文件一起复制到 Coliri IMX8X上。fft.cl 是OpenCL 内核文件。执行后生成 fft_input.csv、fft_output.csv 两个文件,分别保存输入信号和FFT运算结果。


输入信号


FFT 运算结果

./ 从输出结果看,在第93点模值达到最大,该点对应的频率为44100/4096*93=1001.2Hz,即输入正弦信号的频率。

./ 下面是demo的运行日志。GPU 会根据采样点数,分解成多个蝶型运算模型,并将每个模型并行在 GPU 上执行,从而有效降低运算时间。从日志看到每个模型耗时都在1ms以内,GPU 累计耗时为0.004604 秒。但由于是并行计算,最终的时间则是小于该值。

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

Compiling radix-2 FFT Program for GPU...
creating radix-2 kernels...
Creating kernel fft_radix2 0 (p=1)...
Creating kernel fft_radix2 1 (p=2)...
……
Creating kernel fft_radix2 10 (p=1024)...
Creating kernel fft_radix2 11 (p=2048)...
Setting kernel args for kernel 0 (p=1)...
Setting kernel args for kernel 1 (p=2)...
……
Setting kernel args for kernel 10 (p=1024)...
Setting kernel args for kernel 11 (p=2048)...
running kernel 0 (p=1)...
running kernel 1 (p=2)...
……
running kernel 10 (p=1024)...
running kernel 11 (p=2048)...
Kernel execution time on GPU (kernel 0): 0.000209 seconds
Kernel execution time on GPU (kernel 1): 0.000279 seconds
Kernel execution time on GPU (kernel 2): 0.000507 seconds
Kernel execution time on GPU (kernel 3): 0.000505 seconds
Kernel execution time on GPU (kernel 4): 0.000065 seconds
Kernel execution time on GPU (kernel 5): 0.000550 seconds
Kernel execution time on GPU (kernel 6): 0.000457 seconds
Kernel execution time on GPU (kernel 7): 0.000534 seconds
Kernel execution time on GPU (kernel 8): 0.000413 seconds
Kernel execution time on GPU (kernel 9): 0.000037 seconds
Kernel execution time on GPU (kernel 10): 0.000524 seconds
Kernel execution time on GPU (kernel 11): 0.000524 seconds
Total Kernel execution time on GPU: 0.004604 seconds
Successful.

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

./ 在Toradex 基于NXP iMX6Q处理器的 Apalis iMX6Q 2GB IT 模块上,我们使用 FFTW 库在 CPU 上同样进行 4096 点 FFT 运算,并将 CPU 的时钟调整至最高频率进行对比。测试代码从这里下载。

运行耗时为 12.4ms。

5). 总结

Colibri iMX8X 异构多核构架包含 Cortex-A35、GC7000Lite GPU和 Cortex-M4。GPU 可以发挥其并计算的能力,除了实现 FFT 外,还可以用于图形处理运算和深度学习模型推理。通过 Cortex-M4实现实时数据采集,并由GPU完成数据处理,最后在 Cortex-A35 上的操作系统如Linux 完成数据保存、呈现和传输任务,以及用户交互。Colibri iMX8X 是边缘计算设备的理想平台。后续我们会向你展示更多 Colibri iMX8X 的应用开发。

基于 NXP iMX8X 测试 GPU FFT 运算相关推荐

  1. C语言使用CUDA中cufft函数做GPU加速FFT运算,与调用fftw函数的FFT做运算速度对比

    目录 任务介绍 环境所需相关软件下载与安装 C语言:不调用库的GPU加速FFT代码 C语言:调用fftw库的未使用GPU的FFT代码 C语言:调用cufft库的GPU加速FFT gnuplot安装画图 ...

  2. STM32F4使用FPU+DSP库进行FFT运算的测试过程一

    测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...

  3. 嵌入式基础测试手册——基于NXP iMX6ULL开发板(3)

    前 言 本文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ubuntu18.04.4 ...

  4. CUDA: GPU高性能运算

    CUDA: GPU高性能运算 2013-10-11 22:23 5650人阅读 评论(0) 收藏 举报 分类: CUDA(106) 目录(?)[+] 0 序言 CUDA是异构编程的一个大头,洋洋洒洒的 ...

  5. 多核处理器_基于NXP i.MX8MM多核应用处理器设计的智能加油机

    随着近几年信息技术的不断发展,智能化的概念逐渐渗透到各行各业以及我们的生活里,智能化.自助设备随处可见.在人来人往.车来车往的城市建设中,节省时间.免去排队百脸茫然.一脸懵圈的痛苦过程成为智能设备发展 ...

  6. android 系统gpu 调试_基于Android系统的GPU动态调频方案 | Imagination中文技术社区

    针对移动终端上GPU的高功耗问题,提出一种基于Android系统的GPU动态调频方案.方案根据各种应用对GPU的性能需求,引入了GPU的频率一性能模型,包括选择工作频率和测量相对性能的方法.动态调频算 ...

  7. 华大半导体HC32F4A0笔记(五),使用CMSIS-DSP库进行FFT运算

    一.开启FPU功能 点这个麻将牌四筒,展开CMSIS,把DSP勾了. 点开后 然后点这个锤子 No Auto Includes的勾不要打,让它自动include,因为CMSIS-DSP库在KEIL的安 ...

  8. ac和av的结构linux系统,基于nxp MCIMX6S6AVM08AC的汽车电子主板解析之软件系统等设置!...

    续接上篇文章:基于nxp MCIMX6S6AVM08AC的汽车电子主板解析之硬件系统.调试串口(两篇文章衔接的有点久,还望谅解) 3.UBoot Hack 他的这个UBoot并不是SDK里面的Uboo ...

  9. 全相位算法c语言表达,基于DSP的全相位FFT频率计设计.pdf

    基于DSP的全相位FFT频率计设计 学兔兔 l 匐 化 基于DSP的全相位FFT频率计设计 The all-phase FFT cymometer based on DSP 董翠英 DoNG Cui- ...

最新文章

  1. 【SpringCloud】Ribbon:负载均衡
  2. 浅谈二次元场景特征和绘制手法
  3. iis php 假死 nginx,网站假死 重启NGINX无效 必须重启PHP 原因分析
  4. leetcode 1047. 删除字符串中的所有相邻重复项(栈)
  5. 【模型加速】关于模型加速的总结
  6. 微博转发的内容如何实现点击人名跳转到个人主页
  7. java取整和四舍五入方法
  8. 索尼音乐牵手UNLEASH厂牌 实力新星LiCong李聪 Veegee正式加盟
  9. Nginx DNS resolver配置实例
  10. 微信小程序 通过百度API接口实现汉译英翻译
  11. 原生JS封装拖动验证滑块方法
  12. [BTS] Unable to create the transform
  13. Learning Compact Binary Descriptors with Unsupervised Deep Neural Networks
  14. 中国知名科幻网站列表
  15. ubuntu 12.04下安装adobe flash
  16. 【高并发高性能高可用之海量数据MySQL实战-3】-MySQL逻辑架构图
  17. 2022年软件设计师考试复习资料(1)
  18. Python调用R出现“UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb2” 问题
  19. 开源团队聊天工具——RocketChat的介绍及部署
  20. 22个高阶布局+配色技巧,才能造就如此高颜值的数据可视化

热门文章

  1. Adobe After Effects 2022 Carck 中文版
  2. 微信小程序用vant组件制作通讯录
  3. zstuacm数据结构基础12-瓷砖
  4. Linux C/C++开发、嵌入式软件开发面试记录 ( 五)
  5. 核希尔伯特空间(RKHS)
  6. 疏附木亚格杏亮相第七届亚欧博览会
  7. .NET 面试题 - C#基础
  8. 在牛客网爆火的Java岗25大技术栈!(含答案)
  9. 判断两条轨迹的相似性方法
  10. 建站就用这个方法,无需购买服务器10分钟快速部署你的静态网页