精华内容
下载资源
问答
  • 该平台通过提供可配的功能IP模块和灵活完善的软硬件架构,使得异构双核SoC设计更为准确高效。实验证明,GEM-SoC平台可以有效地加快Ogg解码应用的双核软件程序设计开发。原型芯片在37.68 MHz时钟频率时运行,即可实现...
  •  基于ARM+DSP的双核架构,很多工程师不知道如何入手进行开发,提出了很多的疑问,比如对ARM工程师,很困惑的是如何使用DSP的资源?如何进行数据的交互?如何保持双核之间的同步?对DSP工程师,则问到如何进行ARM...

    1 通信结构简介

    针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算法的灵活性,又能提供强大的处理能力。德州仪器(TI)继第一系列Davinci芯片DM644x之后,又陆续推出了DM643x,DM35x/36x,DM6467,OMAP35x,OMAPLx等一系列ARM+DSP或ARM+视频协处理器的多媒体处理器平台。众多有很强DSP开发经验的工程师,以及应用处理开发经验的工程师都转到使用达芬奇或OMAP平台上开发视频监控、视频会议及便携式多媒体终端等产品。基于ARM+DSP的芯片架构,如何进行开发实现做期望的嵌入式应用呢? 
    传统的芯片,基本是一个处理器内核,或者是通用处理器如ARM,或者是DSP。对于控制和用户接口,一般用通用处理器实现,算法处理或者媒体处理则依赖于DSP或者硬件芯片,很多系统都是双芯片的架构。开发模式也比较单纯,比如ARM芯片,有ARM的的仿真工具,基于OS之上进行应用开发;DSP有DSP的开发工具,如TI的CCS以及510、560的仿真器,可以进行算法的移植、优化、跟踪、调试等。这时,所需要的经验也比较单一。 

              基于ARM+DSP的双核架构,很多工程师不知道如何入手进行开发,提出了很多的疑问,比如对ARM工程师,很困惑的是如何使用DSP的资源?如何进行数据的交互?如何保持双核之间的同步?对DSP工程师,则问到如何进行ARM调试?如何启动DSP?如果进行媒体加速,如何操作外设获取或发送数据等。基于不同的开发经验和基础,ARM工程师和DSP工程师会从完全不同的角度来看SOC的芯片,以至于拿到SOC的芯片根本不知道如何入手,这里就本人的经验与大家分享一下。 

             首先ARM+DSP的芯片,他是一个双核的,对应ARM和DSP分别是不同的指令集和编译器,可以把SOC的芯片看成是两个单芯片的合成,需要两套不同的开发工具,CCS3.3可以进行芯片级的调试和仿真,但是对应ARM和DSP需要选择不同的平台。一般来说,ARM上面跑操作系统,比如Linux,Wince等,在ARM上的开发,除了bootloader以外,基本都是基于OS的开发,比如驱动,内核裁减,以及上层应用等,需要的调试和仿真主要靠log或者OS提供的调试器,如KGDB,Platform Builder等。基于DSP核的开发和传统单核DSP一样,需要用CCS+仿真器来进行开发调试。 

         其次,对于芯片的外设接口,ARM核和DSP核都可以访问,典型的情况是ARM控制所有的外设,通过OS上的驱动去控制和管理,这部分和传统的ARM芯片类似;DSP主要是进行算法加速,只是和memory打交道,为了保持芯片的资源管理的一致性,尽量避免由DSP去访问外设。当然,根据具体的应用需求,DSP也是可以控制外设接口进行数据的收发,这时,需要做好系统的管理,避免双核操作的冲突。 
         

              对memory的使用,非易失的存储空间,比如NAND、NOR Flash,基本也是由ARM访问,DSP的算法代码作为ARM端OS文件系统的一个文件存在,通过应用程序进行DSP程序的下载和DSP芯片的控制。外部RAM空间,即DDR存储区,是ARM和DSP共享存在的,但是在系统设计的时候,需要把ARM和DSP使用的内存严格物理地址分开,以及预留出一部分用来交互的内存空间。一般情况,ARM是用低端地址,DSP通过CMD文件分配高端地址,中间预留部分空间用来做数据交互,比如在OMAP3的Linux下的DVSDK中,128MB的DDR空间被分成三部分,低端地址从0x8000000到0x85800000-1的88MB空间给Linux内核使用;从0x85800000到0x86800000-1的16MB给CMEM的驱动,用来做ARM和DSP的大块数据交互,从0x86800000到0x88000000-1的24MB是DSP的代码和数据空间。 

          芯片的启动也是需要重点考虑的问题,一般情况下,是ARM启动,和传统的单核ARM一样,支持不同的启动方式,比如可以支持NAND,NOR,UART,SPI,USB,PCI等接口启动。DSP默认处于复位状态,只有通过ARM的应用下载代码并且解除复位以后,DSP才能跑起来。有些应用场景,需要DSP直接从外部上电就自启动,有些芯片也是支持这种模式的。 

            最后,关于芯片的通信和同步,这个是困扰很多工程师的问题,为了便于客户的开发和使用,TI提供了DSPLINK,CODEC ENGINE的DVSDK开发套件,基于DVSDK可以很方便的进行ARM+DSP的应用开发,下面对DVSDK的软件架构,各个软件模块的功能等做简要介绍。 

            DVSDK是多个软件模块的集成,包括纯DSP端的软件模块,ARM的软件模块和双核交互的软件模块。DVSDK的软件包都是基于实时软件模块(Real-Time-Software-Component:RTSC)的,还需要安装RTSC的工具XDC,XDC是TI开源的一个工具,可以支持跨平台的开发,能够最大程度的代码重用;如果需要进行纯ARM的开发,还需要ARM的编译工具以及Linux内核或者Wince的BSP;如果需要进行DSP的算法开发或者DSP端开执行代码生成,还需要安装DSP的编译器cgtools和DSP/BIOS;为了便于配置生成DSP端的可执行代码,通过向导生成Codec的RTSC包和可执行代码,还可以选装ceutils和cg_xml。 

             DVSDK的核心是Codec Engine,所有的其他软件模块基本都是围绕Codec Engine的。Codec Engine是连接ARM和DSP的桥梁,是介于应用层(ARM侧的应用程序)和信号处理层(DSP侧的算法)之间的软件模块,在编译DSP端可执行代码和ARM端应用程序时,都需要Codec Engine的支持。Codec Engine主要有两部分: 
     ARM端应用适配层,提供了精简的API和对应的库给应用层使用。 
     DSP的算法调用层,提供了DSP算法的接口封装规范,是的所有的算法通过简单的配置就可以编译到DSP的可执行程序中。 
    最终的应用程序需要通过Codec Engine的API接口来下载DSP代码,调用DSP端的封装好的算法,以及进行ARM和DSP的通信。 

        关于Codec Engine的介绍,可以参考《帮您快速入门Codec Engine》。 

            Codec Engine底层ARM和DSP的通信是建立在DSP/BIOS Link之上的,DSP/BIOS Link真正实现ARM和DSP交互的软件模块。由于DSP/BIOS Link是跨平台的,也是有ARM部分和DSP部分组成,其中在ARM端,包括基于OS的驱动和供应用调用的库文件,DSP端,必须要用DSP/BIOS,DSP的可执行代码需要包含DSP/BIOS Link的库文件。DSP/BIOS

    Link常用的主要有如下几部分的软件模块: 
     PROC相关的,主要是用来做DSP芯片的控制,比如启动,停止等,下载DSP的可执行代码,以及直接读写DSP端的memory空间等 
     MSGQ相关,ARM和DSP的通信是基于MSGQ的,MSGQ有轮询等待的方式或者中断的方式,MSG是基于共享内存池的方式。Codec Engine通过MSGQ交互一些关键数据,比如控制,和一些大块数据的地址指针等。大量的数据交互需要通过cmem实现。 

     在ARM端,配合Codec Engine使用的软件模块有LinuxUtils或者WinceUtils,包含cmem,SDMA等,cmem是用来在OS之外分配连续物理内存空间,进行物理地址到虚地址,以及虚地址到物理地址空间转化的。为了避免数据的多次复制,需要开辟一块ARM和DSP共享的数据空间,ARM和DSP都可以直接访问,这部分空间需要通过CMEM管理。对ARM来说,CMEM是OS上的一个驱动程序,需要通过IOCTL来实现内存分配或者地址空间转化。由于DSP可以访问任何物理地址空间,通过ARM传给DSP的指针必须是物理地址。 

     为了适配一些播放器的接口,DVSDK还提供了DMAI(Digital Media Application Interface),DMAI提供了更为精简的媒体接口和基于OS的音视频捕捉、回放等接口,在Linux下的gstreamer和Wince下的dshow filter都是基于DMAI的。并且DMAI也提供了最基本的测试应用例子,可以很方便的进行修改和测试。 

    如果只是调用现成的或者第三方的算法库,可以只了解ARM端的软件模块,Codec Engine或者DMAI已经提供了丰富的应用接口,DSP可以认为是个单纯的媒体加速器,把ARM+DSP的芯片当作ASIC一样使用。如果要充分发挥DSP的性能,就需要对DSP进行开发了。Codec Engine对DSP的算法只是规范了接口,以便于和Codec Engine一起生成DSP的可执行程序。 

      开发DSP算法的工程师,和传统的单核的DSP开发模式类似,只需要操作DSP核,基于CCS进行算法开发,最后封装成xDM的接口就可以了。具体如何进行DSP的打包,如何生成DSP的可执行程序,在后续的文章继续讨论。

    1.OMAP-L138+FPGA开发板简介
            深圳信迈设计的XM138F-IDK-V3是一款DSP+ARM+FPGA三核高速数据采集处理开发板,适用于电力、通信、工控、医疗和音视频等数据采集处理领域。

    此设计采用OMAP-L138+Spartan-6平台,其中OMAP-L138是德州仪器(TI)低功耗高性能浮点DSP C6748+ARM9双核处理器,而Spartan-6是赛灵思(Xilinx)平台升级灵活、性价比极高的FPGA处理器。此设计通过OMAP-L138的uPP、EMIF等通信接口将两个芯片结合在一起,而OMAP-L138内部的DSP和ARM通过DSPLINK/SYSLINK进行双核通信,实现了需求独特、灵活、功能强大的DSP+ARM+FPGA三核高速数据采集处理系统。

    2.OMAP-L138+FPGA开发板资源框图 


      

     

    图1 OMAP-L138+FPGA三核高速数据采集处理资源框图

    框架解析:

    前端由Xilinx Spartan-6 XC6SLX9/16/25/45 FPGA采集两路AD数据,采样率最高可达65MHz。AD数据通过uPP或者EMIF总线传输至OMAP-L138的DSP。 
    D数据被DSP处理之后,通过DSPLINK或者SYSLINK双核通信组件被送往ARM,用于应用界面开发、网络转发、SATA硬盘存储等应用。
    OMAP-L138的DSP或者ARM根据处理结果,将得到的逻辑控制命令送往FPGA,由FPGA控制板载DA实现逻辑输出,更新速率175MSPS。
    (1) 高速数据采集前端部分由Xilinx Spartan-6 XC6SLX9/16/25/45 FPGA同步采集两路AD模拟输入信号,可实现对AD数据进行预滤波处理,AD采样率最高可达65MSPS。另外一路DAC可输出任意幅值和任意波形的并行DA数据,更新速率175MSPS。

    (2) 高速数据传输部分由uPP、EMIF、SPI和I2C通信总线构成。大规模吞吐量的AD和DA数据,可通过uPP总线在DSP和FPGA之间进行高速稳定传输;DSP可通过EMIF总线对FPGA进行并行逻辑控制和进行中等规模吞吐量的数据交换;ARM可通过SPI和I2C对FPGA端进行初始化设置和参数配置。

    (3) 高速数据处理部分由DSP核和算法库构成。可实现对AD和DA数据进行时域、频域、幅值等信号参数进行实时变换处理(如FFT变换、FIR滤波等)。

    (4) DSP+ARM双核通信部分由DSP核、ARM核和DSPLINK/SYSLINK双核通信组件构成。通过内存共享方式,实现DSP和ARM双核之间的数据交换和通信。

    (5) 数据显示存储拓展部分由ARM核、图形显示、网络和SATA硬盘等部分构成。通过ARM的应用界面可实时显示AD和DA的时域和频域波形;并可实现大数据存储和远程网络通信。

     4.Xilinx Spartan-6 FPGA高速数据采集前端逻辑实现

     

    Xilinx Spartan-6 FPGA——XC6SLXx

    XC6SLXx是Xilinx Spartan-6系列应用广泛、性价比极高的FPGA平台,共有324个管脚,提供了大量可用IO 、具有良好的平台升级能力、合理的硬件成本差异和平滑的规模提升特性,可根据实际需求使用LX9、LX16、LX25、LX45等型号。此外,四个CPU型号之间Pin to Pin兼容。

    (1) XC6SLX9:接口级,具备接口编程能力及时钟控制能力。 

    (2) XC6SLX16:算法级,可进行简单的算法处理。 

    (3) XC6SLX25:算法级,可进行中级算法处理。 

    (4) XC6SLX45:系统级,可满足更加复杂的算法和系统逻辑处理需求。

    高速ADC——AD9238

    AD9238是ADI公司推出的业界采样率最快12Bit双通道A/D转换器,电压输入范围1Vp-p和2Vp-p可选,广泛应用于电力、通信、工控、医疗等高速数据采集应用场合。

    AD9238分3种型号,采样率分别是20 MS/s、40 MS/s和65 MS/s。不仅可提供与单通道A/D转换器同等优异的动态性能,并且与使用两个单通道A/D转换器相比,AD9238还具有更好的抗串扰性能,三种型号可实现Pin to Pin兼容,可根据实际需求灵活配置。

    AD9238的3种型号功耗分别为180mW、330mW和600mW,只有同类A/D转换器一半的功耗,采用64脚LQFP封装(尺寸只有9mm x 9mm),非常适合在对尺寸要求严格的场合中使用。

    高速DAC——AD9706

    AD9706是ADI公司推出的12Bit、更新速率为175MSPS 的D/A转换器,输出电流范围1mA~5mA,广泛应用于通信、工控、医疗、电力等高速数据输出应用场合。 

    ///均为175MSPS更新速率的D/A转换器,并且此4款DAC芯片Pin to Pin兼容,分辨率分别为8/10/12/14位。此系列器件针对低功耗特性进行了优化,同时保持出色的动态性能,具有灵活的电源电压范围(1.7V~3.6V),十分适合便携式和低功耗应用。通过降低满量程电流输出,功耗可以降至15 mW,在省电模式下,待机功耗可降至2.2 mW。 

    AD9748/AD9740/AD9742/AD9744系列D/A转换器与以上系列D/A转换器也是Pin to Pin兼容(LFCSP_VQ封装),专门针对通信系统的发射信号路径进行了优化。用户可根据性能、分辨率和成本要求,向上或向下选择适合的器件。

    5.Xilinx Spartan-6 FPGA和TI OMAP-L138通信实现


    图6 FPGA与OMAP-L138通信原理

     

    高速通信总线——uPP

    uPP(Universal Parallel Port)是OMAP-L138 CPU颇具特色的高速并行数据传输总线,可以单独发送和接受数据,也可以同时接收和发送数据,常用于和FPGA以及其他并口设备数据传输。

    OMAP-L138的uPP 共有2个通道(通道A和通道B),共有32位数据线,控制简单,配置灵活,数据吞吐量大。uPP时钟速率可高达处理器时钟速率的一半,对于在456MHz下运行的OMAP-L138处理器,uPP单通道吞吐量理论值可高达228MB/s。

    6.TI OMAP-L138的DSP和ARM双核通信实现


    图14 OMAP-L138 DSP+ARM双核通信原理

     

    基本原理

    TI官方的DSPLINK/SYSLINK双核通信组件提供了一套通用的API,从应用层抽象出ARM与DSP的物理连接特性,从而降低用户开发程序的复杂度。其中DSPLINK使用DSP/BIOS操作系统,SYSLINK使用SYS/BIOS操作系统,SYSLINK属于DSPLINK的新版本双核通信组件。

    在ARM和DSP的双核通信开发中,ARM端运行HLOS操作系统(一般是Linux),DSP端运行RTOS实时操作系统(一般是DSP/BIOS或者SYS/BIOS),双核主频456MHz。

    优势

    (1) SOC 片上DSP+ARM架构可实现稳定的双核通信,缩短了双核通信开发时间。

    (2) DSPLINK/SYSLINK双核通信组件突破了双核开发瓶颈,节约了研发成本。

    (3) SOC上的DSP和ARM架构简化了硬件设计,降低了产品功耗和硬件成本。

     
    =================================================================

    后面介绍两款DSP+ARM的开发板, 一款是AM5728,另一款是OMAPL138。

    2 OMPAL138评估板简介

    基于TI OMAP-L138(定点/浮点 DSP C674x+ARM9)+ Xilinx Spartan-6 FPGA处理器;

    • OMAP-L138 FPGA 通过uPP、EMIFA、I2C总线连接,通信速度可高达 228MByte/s;OMAP-L138主频456MHz,高达3648MIPS和2746MFLOPS的运算能力;
    • FPGA 兼容 Xilinx Spartan-6 XC6SLX9/16/25/45,平台升级能力强;
    • 开发板引出丰富的外设,包含千兆网口、SATA、EMIFA、uPP、USB 2.0 等高速数据传输接口,同时也引出 GPIO、I2C、RS232、PWM、McBSP 等常见接口;
    • 通过高低温测试认证,适合各种恶劣的工作环境;
    • DSP+ARM+FPGA三核核心板,尺寸为 66mm*38.6mm,采用工业级B2B连接器,保证信号完整性; Ø
    • 支持裸机、SYS/BIOS 操作系统、Linux 操作系统。

    图1 开发板正面和侧视图

    XM138F-IDK-V3.0 是一款基于深圳信迈XM138-SP6-SOM核心板设计的开发板,采用沉金无铅工艺的4层板设计,它为用户提供了 XM138-SP6-SOM核心板的测试平台,用于快速评估XM138-SP6-SOM核心板的整体性能。

    XM138-SP6-SOM引出CPU全部资源信号引脚,二次开发极其容易,客户只需要专注上层应用,大大降低了开发难度和时间成本,让产品快速上市,及时抢占市场先机。不仅提供丰富的 Demo 程序,还提供详细的开发教程,全面的技术支持,协助客户进行底板设计、调试以及软件开发。

    2 典型运用领域

    数据采集处理显示系统
    智能电力系统
    图像处理设备
    高精度仪器仪表
    中高端数控系统
    通信设备
    音视频数据处理

    图2 典型应用领域

    3 软硬件参数


    开发板外设资源框图示意图

    图3 开发板接口示意图

    图4 开发板接口示意图

    3 AM5728开发板XM5728-IDK-V3。

    功能介绍:

    • 基于 TI AM5728 浮点双 DSP C66x +双 ARM Cortex-A15 工业控制及高性能音视频处理器;
    • 多核异构 CPU,集成双核 Cortex-A15、双核 C66x 浮点 DSP、双核 PRU-ICSS、双核 Cortex-M4 IPU、双核 GPU 等处理单元,支持 OpenCL、OpenMP、SysLink IPC 多核开发;
    • 强劲的视频编解码能力,支持 1 路 1080P60 或 2 路 720P60 或 4 路 720P30 视频硬件编解码,支持 H.265 视频软解码;
    • 支持高达 1 路 1080P60 全高清视频输入和 1 路 LCD + 1 路 HDMI 1.4a 输出;
    • 双核 PRU-ICSS 工业实时控制子系统,支持 EtherCAT、EtherNet/IP、PROFIBUS 等工业协议;
    • 高性能 GPU,双核 SGX544 3D 加速器和 GC320 2D 图形加速引擎,支持 OpenGL ES2.0;
    • 外设接口丰富,集成双千兆网、PCIe、GPMC、USB 2.0、UART、SPI、QSPI、SATA 2.0、I2C、DCAN 等工业控制总线和接口,支持极速接口 USB 3.0;
    • 开发板引出 V-PORT 视频接口,可以灵活接入视频输入模块;
    • 体积极小,大小仅 86.5mm*60.5mm;
    • 工业级精密 B2B 连接器,0.5mm 间距,稳定,易插拔,防反插,关键大数据接口使用高速连接器,保证信号完整性。


    二、典型应用领域

    工业 PC&HMI
    工业机器人
    机器视觉
    医疗影像
    电力自动化
    EtherCAT 主/从控制器
    工业多协议智能网关
    高端数控系统

    展开全文
  • 基于异构双核FPGA系统验证设计与实现.pdf
  • OpenCL:一种异构计算架构

    千次阅读 2017-11-20 16:21:37
    OpenCL:一种异构计算架构 https://www.cnblogs.com/wangshide/archive/2012/01/07/2315830.html 目录 1 摘要2 为什么需要OpenCL?3 OpenCL架构 3.1 介绍3.2 平台模型3.3 执行模型 3.3.1 内核3.3.2 ...

    OpenCL:一种异构计算架构

    https://www.cnblogs.com/wangshide/archive/2012/01/07/2315830.html

    1 摘要

    由于晶体管功耗、物理性能的限制,CPU的发展受到了很大约束。 人们转而寻找其它方式来提高系统性能,如多核处理器,异构平台等。 开放式计算语言(OpenCL)的出现为当前大量存在的异构系统的并行计算提供了一个 标准。OpenCL通过一系列API的定义,提供硬件独立的编程语言,为程序员提供 了灵活而又高效的编程环境。 本文通过对OpenCL计算架构的深入讨论,指出了OpenCL编程的优势及不足。并进行了 相关编程实践,通过对不同设备的并行编程测试,表明如果采用OpenCL并行编程架构, 能显著提高程序的运行效率。

    就目前的情况来看,异构系统有很高的性价比。相信在不久的将来,OpenCL将会成为 计算机并行、异构计算的重要组成部分。

    关键字:OpenCL,异构计算,CPU/GPU计算,并行计算

    2 为什么需要OpenCL?

    在过去的几十年里,计算机产业发生了巨大的变化。计算机性能 的不断提高为当前各种应用提供了有力的保障。对于计算机的速度 而言,正如摩尔定律描述的那样,是通过晶体管数目增加来提高频率 的方式实现的。但是到了二十一世纪初期以后,这种增长方式受到 了一些限制,晶体管尺寸变得已经很小,其物理特性决定了很难再通 过大规模地增加晶体管的数目来提升频率,且由于功耗也以非线性 的速度增加,因此这种方式受到很大的限制。在未来,这一趋势会继续 成为影响计算机系统最为重要的因素之一。

    为了解决这一问题通常有两种方式,第一种是通过 增加处理器的核心数目来为多任务,多线程等提供支持,从整体 上提升系统的性能。第二种方式是通过异构的方式,例如可 利用CPU(Central Processing Unit)、GPU(Graphic Processing Unit)、甚至APU(Accelerated Processing Units, CPU与GPU的融合)等计算设备的计算能力从而 来既提高系统的速度。

    异构系统越来越普遍,对于支持这种环境的计算而言,也正受到越来越多 的关注。当前,不同厂商通常仅仅提供对于自己设备编程的实现。对于异 构系统一般很难用同种风格的编程语言来实现机构编程,而且将不同的设备 作为统一的计算单元来处理的难度也是非常大的。

    开放式计算语言(Open Computing Language:OpenCL),旨在满足这一重要需求。 通过定义一套机制,来实现硬件独立的软件开发环境。利用OpenCL可以充分利 用设备的并行特性,支持不同级别的并行,并且能有效映射到由CPU,GPU, FPGA(Field-Programmable Gate Array)和将来出现的设备 所组成的同构或异构,单设备或多设备的系统。OpenCL定义了运行时, 允许用来管理资源,将不同类型的硬件结合在同种执行环境中,并且很有希望 在不久的将来,以更加自然的方式支持动态地平衡计算,功耗和其他资源。

    我相信在不久的将来,OpenCL将在异构并行编程中得到广泛的应用。

    3 OpenCL架构

     

    3.1 介绍

    OpenCL为异构平台提供了一个编写程序,尤其是并行程序的开放的框架标准。 OpenCL所支持的异构平台可由多核CPU、GPU或其他类型的处理器组成。 OpenCL由两部分组成,一是用于编写内核程序(在OpenCL设备上运行的代码) 的语 言,二是定义并控制平台的API。OpenCL提供了基于任务和基于数据两种并行计 算机制,它极大地扩展了GPU 的应用范围,使之不再局限于图形领域。

    OpenCL由Khronos Group维护。Khronos Group是一个非盈利性技术组织,维护着 多个开放的工业标准,例如OpenGL和OpenAL。这两个标准分别用于三维图形和计 算机音频方面。

    OpenCL源程序既可以在多核CPU上也可以在GPU上编译执行,这大大提高了代码的 性能和可移植性。OpenCL标准由相应的标准委员会制订,委员会的成员来自业界 各个重要厂商(主要有:AMD,Intel,IBM和NVIDIA)。作为用户和程序员期待 已久的东西,OpenCL带来两个重要变化: 一个跨厂商的非专有软件解决方案;一个跨平台的异构框架以同时发挥系统中 所有计算单元的能力。

    OpenCL支持广泛的应用,将开发应用的过程一般化比较困难, 但是,通常来说,一个基于异构平台的应用主要包含下面的 步骤[ 3 ]:

    1. 找出组成异构平台的所有组件。
    2. 考察组件的特征,这样就能使得软件根据不同的硬件特征来实现。
    3. 创建在平台上运行的一组内核。
    4. 设置与计算相关的存储对象。
    5. 在合适的组件上以正确的顺序执行内核。
    6. 收集结果。

    这些步骤通过在OpenCL内部的一系列API和内核编程环境来实现。 这一实现采用“分治”策略。 可将问题分解为下面的模型[ 1 ] 平台模型 执行模型 存储模型 编程模型

    这些概念是OpenCL整体架构的核心。 这四个模型将贯穿在整个OpenCL的编程过程中。

    下面就简要介绍这四个模型的相关内容。

    3.2 平台模型

    平台模型(如图1)指定有一个处理器(主机Host)来协调程序的执行, 一个或多个处理器(设备Devices)来执行OpenCL C代码。 在这里其实仅仅是一种抽象的硬件模型,这样就能方便程序员 编写OpenCL C函数(称之为内核)并在不同的设备上执行。 

    platform

    图中的设备可以被看成是CPU/GPU,而设备中的计算单元可以被看成是 CPU/GPU的核,计算单元的所有处理节点作为SIMD单元或SPMD单元(每个 处理节点维护自己的程序计数器)执行单个指令流。 抽象的平台模型更与当前的GPU的架构接近。

    平台可被认为是不同厂商提供的OpenCL API的实现。如果一个平台选定之后一般只能 运行该平台所支持的设备。就当前的情况来看,如果选择了Intel的OpenCL SDK 就只能使用Intel的CPU来进行计算了,如果选择AMD的APP SDK则能进行AMD的CPU和AMD的 GPU来进行计算。一般而言,A公司的平台选定之后不能与B公司的平台进行通信。

    3.3 执行模型

    在执行模型中最重要的是内核,上下文和命令队列的概念。上下文管理多个设备, 每个设备有一个命令队列,主机程序将内核程序提交到不同的命令队列上执行。

    3.3.1 内核

    内核是执行模型的核心,能在设备上执行。当一个内核执行之前,需要指定一个 N-维的范围(NDRange)。一个NDRange是一个一维、二维或三维的索引空间。 还需要指定全局工作节点的数目,工作组中节点的数目。如图NDRange所示, 全局工作节点的范围为{12, 12},工作组的节点范围为{4, 4},总共有9个工作组。

     

    NDRange

    例如一个向量相加的内核程序:

    __kernel void VectorAdd(__global int *A, __global int *B, __global int *C){
        int id = get_global_id(0);
        C[id]  = A[id] + B[id];
    }

    如果定义向量为1024维,特别地,我们可以定义全局工作节点为1024, 工作组中节点为128,则总共有8个组。定义工作组主要是为有些仅需在 组内交换数据的程序提供方便。当然工作节点数目的多少要受到设备的限制。 如果一个设备有1024个处理节点,则1024维的向量,每个节点计算一次就能完成。 而如果一个设备仅有128个处理节点,那么每个节点需要计算8次。合理设置 节点数目,工作组数目能提高程序的并行度。

    3.3.2 上下文

    一个主机要使得内核运行在设备上,必须要有一个上下文来与设备进行交互。 一个上下文就是一个抽象的容器,管理在设备上的内存对象,跟踪在设备上 创建的程序和内核。

    3.3.3 命令队列

    主机程序使用命令队列向设备提交命令,一个设备有一个命令队列,且与上下文 相关。命令队列对在设备上执行的命令进行调度。这些命令在主机程序和设备上 异步执行。执行时,命令间的关系有两种模式:(1)顺序执行,(2)乱序执行。

    内核的执行和提交给一个队列的内存命令会生成事件对象。 这用来控制命令的执行、协调宿主机和设备的运行。

    3.4 内存模型

    一般而言,不同的平台之间有不同的存储系统。例如,CPU有高速缓存而GPU就没有。 为了程序的可移植性,OpenCL定义了抽象的内存模型,程序实现的时候只需关注抽 象的内存模型,具体向硬件上的映射由驱动来完成。内存空间的定义及与硬件的映 射大致如图所示。 

    memory

    内存空间在程序内部可以用关键字的方式指定,不同的定义与数据存在的位置 相关,主要有如下几个基本概念[ 2 ]:

    • 全局内存:所有工作组中的所有工作项都可以对其进行读写。工作项可以 读写此中内存对象的任意元素。对全局内存的读写可能会被缓存,这取决于设备 的能力。
    • 不变内存:全局内存中的一块区域,在内核的执行过程中保持不变。 宿主机负责对此中内存对象的分配和初始化。
    • 局部内存:隶属于一个工作组的内存区域。它可以用来分配一些变量, 这些变量由此工作组中的所有工作项共享。在OpenCL设备上,可能会将 其实现成一块专有的内存区域,也可能将其映射到全局内存中。
    • 私有内存:隶属于一个工作项的内存区域。 一个工作项的私有内存中所定义的变量对另外一个工作项来说是不可见的。

    3.5 编程模型

    OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合。对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步。

    4 基于OpenCL的编程示例

    在本小节中以图像旋转的实例,具体介绍OpenCL编程的步骤。 首先给出实现流程,然后给出实现图像旋转的C循环实现和OpenCL C kernel实现。

     

    4.1 流程

    flow

    4.2 图像旋转

     

    4.2.1 图像旋转原理

    图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度, 通常是指绕图像的中心以逆时针方向旋转。假设图像的左上角为(l, t), 右下角为(r, b),则图像上任意点(x, y) 绕其中心(xcenter, ycenter)逆时针旋转θ角度后, 新的坐标位置(x',y')的计算公式为:

    x′ = (x - xcenter) cosθ - (y - ycenter) sinθ + xcenter,

    y′ = (x - xcenter) sinθ + (y - ycenter) cosθ + ycenter.

    C代码:

    void rotate(
          unsigned char* inbuf,
          unsigned char* outbuf,
          int w, int h,
          float sinTheta,
          float cosTheta)
    {
       int i, j;
       int xc = w/2;
       int yc = h/2;
       for(i = 0; i < h; i++)
       {
         for(j=0; j< w; j++)
         {
           int xpos =  (j-xc)*cosTheta - (i - yc) * sinTheta + xc;
           int ypos =  (j-xc)*sinTheta + (i - yc) * cosTheta + yc;
           if(xpos>=0&&ypos>=0&&xpos<w&&ypos<h)
              outbuf[ypos*w + xpos] = inbuf[i*w+j];
         }
       }
    }

    OpenCL C kernel代码:
    #pragma OPENCL EXTENSION cl_amd_printf : enable
    __kernel  void image_rotate(
          __global uchar * src_data,
          __global uchar * dest_data,        //Data in global memory
          int W,    int H,                   //Image Dimensions
          float sinTheta, float cosTheta )   //Rotation Parameters
    {
       const int ix = get_global_id(0);
       const int iy = get_global_id(1);
       int xc = W/2;
       int yc = H/2;
       int xpos =  ( ix-xc)*cosTheta - (iy-yc)*sinTheta+xc;
       int ypos =  (ix-xc)*sinTheta + ( iy-yc)*cosTheta+yc;
       if ((xpos>=0) && (xpos< W)   && (ypos>=0) && (ypos< H))
          dest_data[ypos*W+xpos]= src_data[iy*W+ix];
    }

    旋转45度
    sky_rot
     

     

    正如上面代码中所给出的那样,在C代码中需要两重循环来计算横纵坐标上新的 坐标位置。其实,在图像旋转的算法中每个点的计算可以独立进行,与其它点的 坐标位置没有关系,所以并行处理较为方便。OpenCL C kernel代码中用了并行 处理。

    上面的代码在Intel的OpenCL平台上进行了测试,处理器为双核处理器,图像大小 为4288*3216,如果用循环的方式运行时间稳定在0.256s左右,而如果用OpenCL C kernel并行的方式,运行时间稳定在0.132秒左右。GPU的测试在NVIDIA的GeForce G105M显卡 上进行,运行时间稳定在0.0810s左右。从循环的方式,双核CPU并行以及GPU并行计算 已经可以看出,OpenCL编程的确能大大提高执行效率。

    5 总结

    通过对OpenCL编程的分析和实验可以得出,用OpenCL编写的应用具有很好的移 植性,能在不同的设备上运行。OpenCL C kernel一般用并行的方式处理,所以能极大地提高程序的运行效率。

    异构并行计算变得越来越普遍,然而对于现今存在的OpenCL版本来说,的确还存在 很多不足,例如编写内核,需要对问题的并行情况做较为深入的分析,对于内存的 管理还是需要程序员来显式地申明、显式地在主存和设备的存储器之间进行移动, 还不能完全交给系统自动完成。从这些方面,OpenCL的确还需加强,要使得人们能高 效而又灵活地开发应用,还有很多工作要完成。

    6 参考文献

    【1】 Aaftab Munshi. The OpenCL Specification Version1.1 Document Revision:44[M]. Khronos OpenCL Working Group. 2011.6.1.

    【2】Aaftab Munshi. 倪庆亮译. OpenCL规范 Version1.0 Document Revision:48[M]. Khronos OpenCL Working Group. 2009.10.6.

    【3】Aaftab Munshi, Benedict R. Gaster, Timothy G. Mattson, James Fung, Dan Ginsburg. OpenCL Programming Guide [M]. Addison-Wesley Professional. 2011.7.23.

    【4】Benedict Gaster, Lee Howes, David R. Kaeli and Perhaad Mistry. Heterogeneous Computing with OpenCL[M]. Morgan Kaufmann, 1 edition. 2011.8.31.

    【5】Slo-Li Chu, Chih-Chieh Hsiao. OpenCL: Make Ubiquitous Supercomputing Possible[J]. IEEE International Conference on High Performance Computing and Communications. 2010 12th 556-561.

    【6】John E. Stone, David Gohara, Guochun Shi. OpenCL: A parallel programming standard for heterogeneous computing systems[J]. Copublished by the IEEE CS and the AIP. 2010.5/6 66-72.

    【7】Kyle Spafford, Jeremy Meredith, Jeffrey Vetter. Maestro:Data Orchestration and Tuning for OpenCL Devices[J]. P. D'Ambra,M.Guarracino, and D.Talia (Eds.):Euro-Par 2010,Part II,LNCS6272, pp. 275–286, 2010. \copyright Springer-Verlag Berlin Heidelberg 2010.

     

    展开全文
  • 双剑合璧:CPU+GPU异构计算完全解析

    千次阅读 2017-07-24 01:10:27
     “天河一号”耗资6亿元,连接了上万个美国英特尔和Nvidia公司制造的CPU和GPU,属异构混合架构。在过去一年里,天河一号进行了大升级,目前的配置是14336颗英特尔六核至强X5670 2.93GHz CPU和7168颗Nvidia Tesla M...

    并行计算:让处理的速度变得更快

      相对于串行计算,并行计算可以划分成时间并行和空间并行。时间并行即流水线技术,空间并行使用多个处理器执行并发计算,当前研究的主要是空间的并行问题。以程序和算法设计人员的角度看,并行计算又可分为数据并行和任务并行。数据并行把大的任务化解成若干个相同的子任务,处理起来比任务并行简单。

    双剑合璧:CPU+GPU异构计算完全解析

    并行计算,解放不堪重负的处理器

      空间上的并行导致两类并行机的产生,按照麦克·弗莱因(Michael Flynn)的说法分为单指令流多数据流(SIMD)和多指令流多数据流(MIMD),而常用的串行机也称为单指令流单数据流(SISD)。MIMD类的机器又可分为常见的五类:并行向量处理机(PVP)、对称多处理机(SMP)、大规模并行处理机(MPP)、工作站机群(COW)、分布式共享存储处理机(DSM)。

      从自然哲学层面上来讲:任何最为复杂的事情,都可以被拆分成若干个小问题去解决。这就是当今并行计算的哲学理论依据。然而在当今的双路、四路、八路甚至多路处理器系统中,并行计算的概念早已得到广泛应用。目前业界最为普及的并行计算规范就是OpenMP

    双剑合璧:CPU+GPU异构计算完全解析

    OpenMP:同构计算最为普及的标准

    双剑合璧:CPU+GPU异构计算完全解析

      OpenMP(Open Multi-Processing)是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。OpenMP支持的编程语言包括C语言、C++和Fortran;而支持OpenMP的编译器包括Sun Studio和Intel Compiler,以及开放源码的GCC和Open64编译器。OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMP时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。

    双剑合璧:CPU+GPU异构计算完全解析

    OpenMP的特色

      OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作。

    OpenMP的缺点

      作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。由此如果我们想将不同类型的计算器、计算机联和起来,协同工作。我们就需要使用异构计算技术。

    双剑岂可合璧:什么是异构计算?

      异构计算(Heterogeneous computing)主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。常见的计算单元类别包括CPU、GPU等协处理器、DSP、ASIC、FPGA等。

      异构计算近年来得到更多关注,主要是因为通过提升CPU时钟频率和内核数量而提高计算能力的传统方式遇到了散热和能耗瓶颈。而与此同时,GPU等专用计算单元虽然工作频率较低,具有更多的内核数和并行计算能力,总体性能-芯片面积比和性能-功耗比都很高,却远远没有得到充分利用。

      广义上,不同计算平台的各个层次上都存在异构现象,除硬件层的指令集、互联方式、内存层次之外,软件层中应用二进制接口、API、语言特性底层实现等的不同,对于上层应用和服务而言,都是异构的。

      从实现的角度来说,异构计算就是制定出一系列的软件与硬件的标准,让不同类型的计算设备能够共享计算的过程和结果。同时不断优化和加速计算的过程,使其具备更高的计算效能。

    双剑合璧:CPU+GPU异构计算完全解析

    计算的发展历程:从32bit到异构计算(上)

      2003年以前,是32bit的时代。处理器制造厂商,不断提升制造工艺技术,使用更精细的制程来制造处理器。同时也不断提高处理器的时脉,如133MHz、166MHz、200MHz、300MHz……最终频率提升到了3GHz后,就难作寸进了。到目前为止我们也未曾见到Intel和AMD发布高于4GHz主频的处理器产品。

      2003年出现了x86-64,有时会简称为“x64”,是64位微处理器架构及其相应指令集的一种,也是Intel x86架构的延伸产品。“x86-64”1999由AMD设计,AMD首次公开64位集以扩充给IA-32,称为x86-64(后来改名为AMD64)。其后也为英特尔所采用,现时英特尔称之为“Intel 64”,在之前曾使用过Clackamas Technology (CT)、IA-32e及EM64T。外界多使用"x86-64"或"x64"去称呼此64位架构,从而保持中立,不偏袒任何厂商。

      AMD64代表AMD放弃了跟随Intel标准的一贯作风,选择了像把16位的Intel 8086扩充成32位的80386般,去把x86架构扩充成64位版本,且兼容原有标准。

      AMD64架构在IA-32上新增了64位暂存器,并兼容早期的16位和32位软件,可使现有以x86为对象的编译器容易转为AMD64版本。除此之外,NX bit也是引人注目的特色之一。

      不少人认为,像DEC Alpha般的64位RISC芯片,最终会取代现有过时及多变的x86架构。但事实上,为x86系统而设的应用软件实在太庞大,成为Alpha不能取代x86的主要原因,AMD64能有效地把x86架构移至64位的环境,并且能兼容原有的x86应用程序。

    双剑合璧:CPU+GPU异构计算完全解析

    计算的发展历程:从32bit到异构计算(下)

      2006年出现了双核心多核心。多核心,也叫多微处理器核心是将两个或更多的独立处理器封装在一起的方案,通常在一个集成电路(IC)中。双核心设备只有两个独立的微处理器。一般说来,多核心微处理器允许一个计算设备在不需要将多核心包括在独立物理封装时执行某些形式的线程级并发处理(Thread-Level Parallelism,TLP)这种形式的TLP通常被认为是芯片级多处理。在游戏中你必须要使用驱动程序来利用第二颗核心。

      此后处理器制造厂商发现,利用多核心架构可以在不提升处理器频率的情况下,继续不断提升处理器的效能。

    2008年通用计算GPGPU

      通用图形处理器(General-purpose computing on graphics processing units,简称GPGPU),是一种利用处理图形任务的图形处理器来计算原本由中央处理器处理的通用计算任务。这些通用计算常常与图形处理没有任何关系。由于现代图形处理器强大的并行处理能力和可编程流水线,令流处理器可以处理非图形数据。特别在面对单指令流多数据流(SIMD),且数据处理的运算量远大于数据调度和传输的需要时,通用图形处理器在性能上大大超越了传统的中央处理器应用程序。

      3D显示卡的性能从NVIDIA的GeForce256时代就颇受瞩目,时间到了2008年,显示卡的计算能力开始被用在实际的计算当中。并且其处理的速度也远远超越了传统的x86处理器。

    双剑合璧:CPU+GPU异构计算完全解析

    2010年CPU+GPU异构计算

      对于GPGPU表现出的惊人计算能力叫人为之折服,但是在显卡进行计算的同时,处理器处于闲置状态。由此处理器厂商也想参与到计算中来,他们希望CPU和GPU能够协同运算,完成那些对计算量有着苛刻要求的应用。同时也希望将计算机的处理能力再推上一个新的高峰。

    双剑合璧:CPU+GPU异构计算完全解析

    异构计算要求CPU和GPU协同运算

    天河星云:异构计算大显神威

      国际TOP500组织TOP500.org在网站上公布了最新全球超级计算机TOP500强排行榜,由国防科学技术大学研制,部署在国家超级计算天津中心,中国千万亿次超级计算机“天河一号”位居第一位,实测运算速度可以达到每秒2570万亿次。

      “天河一号”耗资6亿元,连接了上万个美国英特尔和Nvidia公司制造的CPU和GPU,属异构混合架构。在过去一年里,天河一号进行了大升级,目前的配置是14336颗英特尔六核至强X5670 2.93GHz CPU和7168颗Nvidia Tesla M2050 GPU和2048颗自主研发的八核飞腾FT-1000 CPU。处理内核数突破20万颗,是去年24576颗的8.25倍。

    双剑合璧:CPU+GPU异构计算完全解析

      排名第三的是曙光公司研制的“星云”高性能计算机,其实测运算速度达到每秒1270万亿次。petaflop/s,千万亿次计算单位。星云系统峰值为每秒3000万亿次(3PFlops),实测Linpack值每秒1271万亿次(1.271PFlops),是中国第一台、世界第三台实测双精度浮点计算超千万亿次的超级计算机。

      星云超级计算机采用自主设计的HPP体系结构,处理器是32nm工艺的六核至强X5650,并且采用了Nvidia Tesla C2050 GPU做协处理,由4640个计算单元组成。它采用了高效异构协同计算技术,系统包括了9280颗通用CPU和4640颗专用GPGPU组成。计算网络采用了单向40Gbps QDR Infiniband技术,核心存储采用了自主设计的Parastor高速I/O系统。

      美国橡树岭国家实验室的“美洲虎”超级计算机此前排名第一,在新榜单中,其排名下滑一位。“美洲虎”的实测运算速度可达每秒1750万亿次。有趣的是中国的两套系统和东京工业大学的系统,所使用的都是NVIDIA的GPU通用计算加速方案。事实上,在Top 500强超级计算机榜单中,有28套系统采用的是图形处理器作为通用计算加速。有16套系统采用的是Cell处理器,其中有10套采用的是NVIDIA的芯片,有2套采用的是AMD的Radeon芯片。目前的Top 500强中有10大系统超越了千万亿次大关。这些超级计算机中有五套来自美国,而其他则来自中国,日本,法国,德国。

    迥异:不同计算架构的特点

      上文提到的采用的异构计算架构都属于大型计算机的范畴。对于个人计算机而言,尤其是x86架构的计算机,异构计算的步伐则要慢许多。这是因为,无论是处理器还是显示卡,又或者其他运算部件,都有其自身的架构和特性。他们是针对不同领域,面向不同应用所设计的芯片。所以他们在功能性方面千差万别。要想将他们都统一起来,除了需要制定共同的规范和标准之外,还要针对其计算的特点设计软件。

    双剑合璧:CPU+GPU异构计算完全解析

      举例来说,CPU和GPU在进行计算时,就有许多不同。对于处理器来说,它是一颗通用处理器。它要应对各种类型的计算应用。无论是数学方面的,还是逻辑方面的运算。我们可以看到,一颗比较常规的处理器其中的ALU计算单元仅仅占据整个核心面积的25%以内。在处理器中,超过50%的核心面积用来制作Cache高速缓存,无论是L1、L2还是片上的L3。而另外还有25%的核心面积用来作为控制器。它控制着处理管线的运作,控制着各种分支预测,让多核心处理器可以更有效率。

      而我们再反观GPU,其结构要简单的多。GPU的任务是加速3D像素的计算。因此我们在显卡中可以看到数以百计的流处理器单元或者是CUDA核心。而在整个计算过程中,GPU承担的逻辑计算任务非常小。同时它有着更宽的显存带宽,有着更高速的显存。所以在GPU芯片中,也就无需更大容量的片上缓存机制。

      通过上文的分析,我们可以看到CPU的在处理时,适合作所有工作,各个方面都比较平均。逻辑处理能力要比GPU快,但是对于数学计算方面,其速度不如具有海量处理核心的GPU快。而GPU方面,数学计算性能强大,大规模并行处理机制强大,但是逻辑处理能力不足,仅仅能在某些计算领域应用。

    Llano核心解析:一个真正的异构计算芯片

      AMD前不久发布的新一代Llano处理器,是一颗真正意义上的异构计算处理器。从这张这新架构图中,我们可以看到Llano具备四个处理核心,每一颗核心具有不同类型的L1高速缓存。同时每一个处理核心具备512KB X 2的容量为1MB的L2高速缓存。由此在处理器的部分,构成了4MB的二级缓存。

      在整个芯片接近50%的面积上,是GPU的部分。一颗处理芯片同时包含了CPU和GPU的部分,这可以说是非常典型的异构计算架构。同时,在芯片的两边我们也可以看到高度集成的4个PCIe总线控制器,还有一个128bit位宽的DDR3内存控制器。

      这样的异构计算芯片可以充分发挥不同计算部件的优势。当需要进行较多逻辑计算时,可以使用CPU部分完成。当需要大量的浮点运算时,可以借用GPU的浮点运算处理管线来完成。同时如果处理器的某些核心正处于空闲,也可以让其加入到计算中来。由此可见异构计算不仅仅是需要统一起不同类型的计算部件,同时也需要有针对性的让更适合的硬件作适用的计算工作。

    双剑合璧:CPU+GPU异构计算完全解析

    新的计算架构需要全新的软件标准

      对于异构计算来说,更重要的软件。虽然现在我们看到许多计算机中都应用了GPGPU的通用计算,使用显卡来进行大规模的并行计算任务,但是在这个过程中,处理器就被闲置了。例如许多转码程序在运行的时候,仅仅是显卡在跑,而处理器并未参与到转码加速中来。将异构的运算部件,全部有效的调用起来,这是一件困难的编程工作。

      如下图所示,传统意义上的多路处理器计算时,仅仅使用的是处理器的并行计算。并未让GPU加入到其中。而现在我们常说的GPGPU通用计算,包括NVIDIA的CUDA和AMD的Stream在计算的时候,也仅仅是GPU在跑,处理器是闲置的。

    双剑合璧:CPU+GPU异构计算完全解析

      除了应用软件之外,曾经我们耳熟能详的评测软件,也并未对异构计算作出优化。无论是PCmark还是3Dmark,在这些软体进行测试的时候,会将CPU和GPU利用不同的测试项目分别进行测试。并没有将它们合并在一起,进行有效的异构计算。

    双剑合璧:CPU+GPU异构计算完全解析

      Sysmark仅仅是建立许多计算任务,然后让系统来跑,这仅仅是针对的是处理器的部分。而Chinebench系列的软体,仅仅是考察的CPU的渲染性能。对于多核心和超线程虽然有很好的支持,但是并未让GPU加入测试。如你所见,目前针对x86或者台式机平台的异构计算软件少之甚少,甚至连一款像样的异构计算评测软件都无有。

    CUDA:在夹缝中挣扎求存

      CUDA(Compute Unified Device Architecture,统一计算架构)是由NVIDIA所推出的一种集成技术,是该公司对于GPGPU的正式名称。通过这个技术,用户可利用NVIDIA的GeForce 8以后的GPU和较新的Quadro GPU进行计算。亦是首次可以利用GPU作为C-编译器的开发环境。NVIDIA营销的时候,往往将编译器与架构混合推广,造成混乱。实际上,CUDA架构可以兼容OpenCL或者自家的C-编译器。无论是CUDA C-语言或是OpenCL,指令最终都会被驱动程序转换成PTX代码,交由显示核心计算。

    双剑合璧:CPU+GPU异构计算完全解析

      以GeForce 8800 GTX为例,其核心拥有128个内处理器。利用CUDA技术,就可以将那些内处理器串通起来,成为线程处理器去解决数据密集的计算。而各个内处理器能够交换、同步和共享数据。利用NVIDIA的C-编译器,通过驱动程序,就能利用这些功能。亦能成为流处理器,让应用程序利用进行运算。GeForce 8800 GTX显示卡的运算能力可达到520GFlops,如果建设SLI系统,就可以达到1TFlops。

      利用CUDA技术,配合适当的软件(例如MediaCoder),就可以利用显示核心进行高清视频编码加速。视频解码方面,同样可以利用CUDA技术实现。此前,NVIDIA的显示核心本身已集成PureVideo单元。可是,实现相关加速功能的一个微软API-DXVA,偶尔会有加速失效问题。所以利用CoreAVC配合CUDA,变相在显示核心上实现软件解码,解决兼容性问题。另外,配合适当的引擎,显示核心就可以计算光线跟踪。NVIDIA就放出了自家的Optix实时光线跟踪引擎,通过CUDA技术利用GPU计算光线跟踪。

    FireStream:慢慢淡出我们的视野

      Firestream,是AMD旗下的品牌系列之一。与Radeon(用于消费级显卡)和FirePro(用于专业显卡)不同,FireStream主要用于AMD的高性能计算卡系列。FireStream产品中的GPU不是用来作3D加速用途,而是利用GPU内置的流处理器变成一群并行处理器,作为浮点运算协处理器,协助中央处理器计算复杂的浮点运算程序,例如复杂的科学运算。Firestream的竞争对手是nVIDIA的Tesla系列高性能计算卡。

      早在数年前,人们就意识到GPU不但可以处理图形数据,还可以处理其他数据。BionicFX就试过利用GeForce 6800处理音频数据,ATI亦做过同样的试验。而且史丹佛大学的Folding@Home研究项目亦可利用Radeon X1900作运算加速;通过GPU来模拟蛋白质合成,进而找寻有关蛋白质的疾病。

    双剑合璧:CPU+GPU异构计算完全解析

      第一个产品,FireStream 580,是建基于R580图形芯片。它将是一块采用R580显核的特殊显示卡,R580显示核心中的48个独立的像素处理器能带来强大的浮点运算性能。该产品采用PCI Express x16作为接口,流处理器的频率是600 MHz,可以同时运行512线程,并配备了1GB GDDR3存储器,频率是1300 MHz。并有可能使用多个核心并发处理数据。这个流处理器的功耗为165瓦特。

    双剑合璧:CPU+GPU异构计算完全解析

    FireStream 580

    NVIDIA PhysX:最出色的GPGPU应用实例

    PPU (Physics Processing Unit)

      物理处理单元,即 PPU,是一种特别为减轻 CPU 计算,尤其是物理运算部分的处理器。这概念类似于对上10年间GPU。在现代 计算机中,GPU用于处理 矢量图形,并且延伸到3D图形。但GPU对物理处理无能为力,故目前大部分物理处理都交给CPU处理,这无疑是加重了CPU本来就不轻的负担。

    双剑合璧:CPU+GPU异构计算完全解析

    NVIDIA PhysX

      PhysX 是一套由 AGEIA 设计的执行复杂的物理运算的PPU,又可以代表一款物理引擎。AGEIA 声称,PhysX 将会使设计师在开发游戏的过程中,使用复杂的物理效果,而不需要像以往那样,耗费漫长的时间开发一套物理引擎。以往使用了物理引擎,还会使一些配置较低的电脑,无法流畅运行游戏。AGEIA 更宣称 PhysX 执行物理运算的效率,比当前的 CPU 与物理处理软件的组合高出 100 倍。游戏设计语言 Dark Basic Pro 将会支持 PhysX,并允许其用户利用 PhysX 执行物理运算。在 2005年7月20日,索尼同意在即将发售的 PlayStation 3 中使用 AGEIA 的 PhysX 和它的 SDK —— NovodeX 。现时,AGEIA公司己被NVIDIA收购,相关的显卡亦可以加速该物理引擎。

    双剑合璧:CPU+GPU异构计算完全解析

      NVIDIA PhysX是一种功能强大的物理加速引擎,可在顶级PC和游戏中实现实时的物理学计算。PhysX软件被广泛应用于数百个游戏中,软件注册用户数量已超过20,000名。索尼的Playstation 3、微软的Xbox 360、任天堂的Wii以及个人计算机均支持PhysX。

      PhysX设计用途是利用具备数百个内核的强大处理器来进行硬件加速。加上GPU超强的并行处理能力,PhysX将使物理加速处理能力呈指数倍增长并将您的游戏体验提升至一个全新的水平,在游戏中呈现丰富多彩、身临其境的物理学游戏环境。

    OpenCL:无人能模仿 很难被超越

      2008年6月的WWDC大会上,苹果提出了OpenCL规范,旨在提供一个通用的开放API,在此基础上开发GPU通用计算软件。随后,Khronos Group宣布成立GPU通用计算开放行业标准工作组,以苹果的提案为基础创立OpenCL行业规范。

      OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels(在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分区和数据分区的并行计算机制。

      OpenCL类似于另外两个开放的工业标准OpenGL和OpenAL,这两个标准分别用于三维图形和计算机音频方面。OpenCL扩展了GPU用于图形生成之外的能力。OpenCL由非盈利性技术组织Khronos Group掌管。

    双剑合璧:CPU+GPU异构计算完全解析

    OpenCL最初苹果公司开发,拥有其商标权,并在与AMD,IBM,英特尔和nVIDIA技术团队的合作之下初步完善。随后,苹果将这一草案提交至Khronos Group。2010年6月14日,OpenCL 1.1 发布。

    OpenCL:奠定了异构计算的基础

      虽然苹果制定OpenCL的私心路人皆知,希望通过OpenGL来让自家的Mac电脑可以顺利的使用两个显卡巨头的产品做GPGPU运算。但是苹果的这一举措却为未来的x86平台异构计算奠定了坚实的基础。因为无论是CUDA还是FireStream,无论是CUDA核心还是流处理器,软件开发人员都可以通过OpenCL来支持。

    双剑合璧:CPU+GPU异构计算完全解析

      中国用户可以登录英伟达中文官方网站上下载到最新的驱动程序,只要您下载的驱动是195.62版本或更高,就可以在Geforce 8系列或更高级的显卡中开启OpenCL,在安装好新版本的显卡驱动程序并重新启动后,OpenCL就自动开启了。当有需要使用CPU来完成的工作如转换视频时,GPU代替CPU进行运算,以提高转换速度。但是在3D游戏中应该是不会调用OpenCL的,因为显卡有自己的硬件加速功能以及物理引擎。

    双剑合璧:CPU+GPU异构计算完全解析

      当然同样,在NVIDIA的Quadro系列专业显卡中,同样能够使用OpenCL技术。只要您的显卡能够达到CUDA的要求,就能够正常使用OpenCL,以获得优异的CPU运算效率。

      在AMD-ATI的Stream技术中,已经为日常使用、办公、游戏等提供物理加速。原理与OpenCL基本相同,但是,目前AMD-ATI还没有进行推广,但是官方承诺,在日后会逐渐增多Stream支持的游戏。但是Stream使用的显卡平台还是比较高,而性能非常优异的显卡无疑带来更高昂的价格,我们也同样希望AMD能够做到像NVIDIA那样,只需要支持DirectX10的显卡就能开启OpenCL,以方便更多的AMD-ATI用户。Geforce 8系列以上的显卡能完美支持DirectX10,所以官方将开启OpenCL的显卡最低定为8系列。

    DirectCompute:立足DX11,应用广泛

      Microsoft DirectCompute是一个应用程序接口(API),允许Windows Vista或Windows 7平台上运行的程序利用图形处理器(GPU)进行通用计算,DirectCompute是Microsoft DirectX的一部分。虽然DirectCompute最初在DirectX 11 API中得以实现,但支持DX10的GPU可以利用此API的一个子集进行通用计算,支持DX11的GPU则可以使用完整的DirectCompute功能。

    双剑合璧:CPU+GPU异构计算完全解析

    显卡对DirectX的支持程度影响可用的DirectCompute版本:

    DirectX 10:DirectCompute 4.0 
    DirectX 10.1:DirectCompute 4.1 
    DirectX 11:DirectCompute 5.0

    双剑合璧:CPU+GPU异构计算完全解析

    AMD开始全面支持异构计算

      相比OpenGL丰富的功能和体系化的SDK来说,DirectCompute仅仅是以一个简单的API存于世上,显然不能赢得更多厂商的关注。由此微软又酝酿了C++ AMP……且看下文分解。

    Llano:融聚今宵 真正的异构计算平台

      这是AMD近期发布的最强Llano处理器,具有划时代的意义,具备真正的异构计算架构。AMD A8-3850配备了四个主频2.9GHz的CPU核心,不过遗憾的是A8-3850并不支持Turbo Core自动超频。在GPU方面,A8-3850配备的是一颗完整功能的Radeon HD 6550D,该GPU核心配备了400个流处理器,核心频率为600MHz。

    双剑合璧:CPU+GPU异构计算完全解析

    A8-3850 APU处理器,采用Llano核心

      实际上A8-3850 APU处理器的集成GPU核心性能平均要比Core i5 2500K快58%左右。如果我们只考虑在游戏里的峰值性能的话,在类似于《现代战争2》这样的游戏里,最新Llano桌面APU的GPU在帧频表现上是可以达到Sandy Bridge两倍的,这也再次证明了英特尔集成GPU在游戏领域的尴尬。至于Llano的GPU性能,相信这才是玩家们最喜闻乐见的。

      虽然我们也认为Sandy Bridge在集成GPU性能方面是不错的入门选择,但是至少在2011年,Llano桌面APU仍然是懂行玩家最该做出的选择。值得注意的在这些测试里,测试方随后还为Core i5 2500K GPU安装了最新的2372驱动程序,结果证明大部分的结果仍然没有改变,不过在少数领域英特尔发掘出了更多的潜力。无论如何,在GPU测试里,AMD的Llano桌面APU A8-3850发挥出了令人印象深刻的性能。

    双剑合璧:CPU+GPU异构计算完全解析

    Socket-FM1接口

    C++ AMP:微软发布异构计算编程语言

    双剑合璧:CPU+GPU异构计算完全解析

      自从AMD发布了Llano处理器,异构计算就真正进入了寻常百姓的家中。虽然OpenCL作为通用大规模并行计算的行业领军标准,得到了AMD、Intel、NVIDIA等芯片业巨头和大量行业厂商的支持,但唯独缺少了微软。

      近日在AMD Fusion开发者峰会上,微软终于拿出了自己的异构计算编程语言:“C++ AMP”,其中AMP三个字母是“accelerated massive parallelism”的缩写,也就是加速大规模并行的意思。

    双剑合璧:CPU+GPU异构计算完全解析

    微软的“异构并行计算”

      C++ AMP是微软Visual Studio和C++编程语言的新扩展包,用于辅助开发人员充分适应现在和未来的高度并行和异构计算环境。它使用C++语言的句法,将捆绑在下个版本的Visual Studio中发布,预计会在今年晚些时候放出测试版本。

      为了与OpenCL相抗衡,微软宣布C++ AMP标准将是一种开放的规范,允许其它编译器集成和支持。这无疑是对OpenCL的最直接挑战。

    双剑合璧:CPU+GPU异构计算完全解析

    C++ AMP的威力:刚体模拟性能绽放(上)

      为了展示了C++ AMP的威力,微软现场运行了一个“刚体模拟”程序。一个可执行文件能够在多台计算机和设备上同时运行。这里我们可以看到,Llano APU x86处理器可以贡献出3GFlops的计算量。Llano APU的显示核心与处理核心协同工作,可以提供500GFlops的计算量。另外,Llano APU和Radeon HD 5800可以提供1000多GFlops的计算量,模拟4万多个粒子。即使是AMD的E-350这样的仅有18W的低功耗笔记本处理器也可以提供16GFlops的计算量,能够模拟16000多个粒子。

    双剑合璧:CPU+GPU异构计算完全解析

    E-350的CPU部分,可以得到3.2GFlops的计算量

    双剑合璧:CPU+GPU异构计算完全解析

    仅仅可以模拟4096多个刚体粒子

    双剑合璧:CPU+GPU异构计算完全解析

    请注意这里鼠标所指示的运算量

    C++ AMP的威力:刚体模拟性能绽放(中)

    双剑合璧:CPU+GPU异构计算完全解析

    模拟的刚体粒子数量增加到5120个

    双剑合璧:CPU+GPU异构计算完全解析

    CPU与GPU核心,联合运算,可以提供60GFlops的运算量

    双剑合璧:CPU+GPU异构计算完全解析

    下面加入更多刚体粒子

    双剑合璧:CPU+GPU异构计算完全解析

    小贴士:什么是刚体?

      在任何力的作用下,体积和形状都不发生改变的物体叫做刚体(Rigid body)。在物理学内,理想的刚体是一个固体的,尺寸值有限的,形变情况可以被忽略的物体。不论有否受力,在刚体内任意两点的距离都不会改变。在运动中,刚体上任意一条直线在各个时刻的位置都保持平行。

    C++ AMP的威力:刚体模拟性能绽放(下)

    双剑合璧:CPU+GPU异构计算完全解析

    加入更多刚体粒子,模拟20160个

    双剑合璧:CPU+GPU异构计算完全解析

    Llano APU可以贡献出500GFlops的计算量,这与AMD之前宣称的个人超级计算机的口号属实

    双剑合璧:CPU+GPU异构计算完全解析

      刚体的模拟数量达到了40960个的时候,就需要极大的计算量才能保证稳定输出30fps的帧率。下面这张图,你可以看到在联合了两台台式机之后,计算量接近1TFlops。

    双剑合璧:CPU+GPU异构计算完全解析

    一触即发:异构计算行业标准大战

      NVIDIA并未获得Intel关于x86架构的授权,就连开发x86的模拟器的自由都被封杀。无奈之下CUDA也仅仅是GPGPU的单独运算。OpenCL是免费开放的,也是目前异构计算的唯一选择。

      而微软的C++ AMP会与Windows紧密贴合起来。虽然也属于开放性的标准,但是微软对其未来方向的掌控,其执行应该更有效力。OpenCL有多家主力厂商支持,技术纷争不断,为了自家产品的利益难免在新版本制定方面出现歧路。现在的局面就有点类似曾经OpenGL对决DirectX的时代,不知道这次微软是否还能够全面胜出。

    双剑合璧:CPU+GPU异构计算完全解析

      上面这张图表明,如果你的计算量仅有630GFlops的话,你的帧数仅仅能维持在19fps左右。

    展开全文
  • NXP iMX7 异构双核心开发调试

    千次阅读 2018-10-26 11:33:26
    ./ StrEchoTask主要通过OPAMP/Rpmsg实现和A7消息的接收,另外通过Semaphore来实现几个task之间的切换,关于Semaphore的使用是异构双核架构下M4编程的重点,具体可以参考下面FreeRTOS官方文档说明: ...

    By Toradex秦海

    1). 简介

    在工业领域,很多时候会遇到实时任务和主控界面同时需要的场景,比如工业自动化的控制器等,通常情况下传统做法是分别使用两个独立的处理器,比如一个Cortex-M4 ARM处理器来完成实时任务,另外再使用一个Cortex-A系列的ARM处理器来处理主控界面和命令控制,两个处理器之间再通过某种通讯总线来互联互通,比如串口,SPI之类。

     

    这样做的好处是两个处理器相对分隔独立,但缺点也很明显,系统复杂性提高,数据面和控制面要单独建立,正式基于此NXP提出了一个新的思路,就是在一个芯片中集成这两个功能核心。

     

    而本文所演示的ARM平台来自于Toradex Apalis iMX7 ARM嵌入式平台,这是一个基于NXP iMX7 ARM处理器的ARM计算机模块,在这个芯片中,NXP将Cortex-A7 ARM核心和Cortex-M4 ARM核心集成到了同一个芯片里面,并且两个核心共享存储和外设资源,这使得对于上面提到的应用模式可以更精巧,高效的实现,接下来本文会基于这个平台进行一个简单的应用开发以及调试示例。

     

     

    2. 准备

    a). Colibri iMX7S ARM核心版配合Colibri Evaluation Board,分别连接A7核心默认调试串口UART1(载板X27)和M4核心默认调试串口UART2(载板X25上)到开发主机方便调试,另外由于iMX7S只支持一个USB接口,需要通过载板X30连接一个USB Hub后来扩展键盘鼠标外设。更多关于Colibri iMX7的说明请参考DatasheetLinux开发上手指南

     

    b). Colibri iMX7 A7核心系统使用集成Qt运行库的Linux BSP V2.7版本,如何编译和部署集成Qt image以及配置Qt开发环境请参考这里

     

    c). 另外,由于本文演示示例使用到了载板上面的LED和按键资源,需要连接如下:

    X10 SODIMM-106 -> X21 LED3

    X10 SODIMM-135 -> X21 LED1

    X10 SODIMM-133 -> X21 SW6

    X10 SODIMM-127 -> X21 LED2

     

    d). SEGGER J-Link 仿真器,USB一端连接开发主机,JTAG一端连接载板X13。

     

     

    3). Colibri iMX7 M4核心FreeRTOS基本资料

    a). Colibri iMX7 架构基本说明请参考如下:

       https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7

     

    b). 本示例中M4核心运行FreeRTOS v8系统,相关的源代码和sample程序请从下面git下载:

    http://git.toradex.cn/cgit/freertos-toradex.git/

     

    c). 基本的SDK配置和编译请参考如下:

    https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Linux_support

     

    d). 编译好的M4 firmware如何在Colibri iMX7上面加载运行请参考如下:

    https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Running_a_Firmware_on_CortexM4

     

    e). 几个自带的sample代码简单说明请参考如下:

    https://developer.toradex.com/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Examples

     

     

    4). Colibri iMX7 M4核心调试环境配置

    a). 在上一章节编译部分资料中有提到编译自带sample code只需要执行项目中的 build_all.sh 脚本,就可以生成release和debug项目,然后进入debug项目目录,打开“build_debug.sh”脚本,可以看到通过“-G”参数指定了编译系统,这里默认是“Eclipse CDT4 - Unix Makefiles”,支持的是Eclipse指定了,因此本文示例就基于Eclipse进行调试。

     

    b). 由于Ubuntu 16.04 系统自带的Eclipse版本比较低,不支持后续需要的plugin,因此需要手动安装最新版本的Eclipse:

    ./ 首先安装最新版本的openjdk

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

    $ sudo add-apt-repository ppa:openjdk-r/ppa

    $ sudo apt-get update

    $ sudo apt-get install openjdk-8-jdk

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

    ./ 从下面地址下载最新的Eclipse CPP,解压后可以直接运行,无需安装。

    http://www.eclipse.org/downloads/packages/

     

    c). 下载安装J-Link software and documentation pack,安装好第一次运行,会自动检查J-Link firmware并升级到最新版本。

    https://www.segger.com/products/debug-probes/j-link/

     

    d). 运行Eclipse CPP,安装J-Link GDB plugin

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

    // Main menu -> Help -> install new software

    // 输入下面地址

    https://dl.bintray.com/gnu-mcu-eclipse/updates/ 

    // 在列表里面安装下面plugin

    GNU ARM C/C++ J-Link Debugging

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

     

    e). 在Eclipse 中导入需要debug的项目

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

    ./ 选择 File -> Import -> General -> Existing Projects into Workspace

    ./ 在 “Select root directory”,输入项目“armgcc/debug”文件夹目录地址,此时会自动识别出已经编译好的debug项目,完成项目导入,比如本次示例项目名字为gpio-freertos,导入如下:

    image001.png

    f). 在Eclipse 中进行debug GDB参数配置

    ./ 打开 Run –> Debug Configurations,可以看到左边侧栏中 GDB SEGGER J-Link Debugging项目下一般会自动出现刚才导入的项目,右边是对应的一些选项。

    ./ Main选项卡,一些基本名字等信息

    image002.png

    ./ Debugger 选项卡

    image003.png

    需要注意的地方:

    // Device name,Colibri iMX7对应就是这个名字,具体的列表可以参考这里

    // Interface选择使用的仿真器接口,我这里使用的是JTAG的

    // Other options,非常关键,-scriptfile指定的文件请从这里下载使用即可,其他参数一样就行,当然熟悉配置的话也可以进行修改。

    // GDB Client Setup -> Executable,设定为SDK目录下的bin/arm-none-eabi-gdb文件

    ./ Startup 选项卡

    image004.png

    需要注意的地方:

    // 取消 Enable flash breakpoints

    // 添加命令行 monitor reset 0

    // 勾选 RAM application (reload after each reset/restart)

     

    g). 至此,GDB配置完毕,点击Debug按钮即可进行debug了。

     

     

    5). Colibri iMX7 M4核心示例程序

    a). 本程序主要实现三个并行任务:

    ./ LED1, LED2和LED3的跑马灯任务,时间间隔从最小100ms到最大1000ms,每档间隔为100ms。

    ./ 按键中断任务,每按键一次,跑马灯的时间间隔增加100ms,如果已经到达1000ms上限,再次按键则回到100ms初始值。同时在每次跑马灯时间间隔更改后,给A7核心系统发消息通知。

    ./ 和A7核心通讯任务,当接收到A7发来的跑马灯时间间隔指令后,按指令配置跑马灯时间间隔,同时配置完成后给A7核心发消息通知。

     

    b). 具体代码请见如下git地址

    https://github.com/simonqin09/iMX7_M4_Runniung_LED_Demo/tree/master/gpio_freertos

    ./ 代码中对应上面三个任务分别由三个task实现

    跑马灯 – ToggleTask

    按键 – SwitchTask

    通讯 – StrEchoTask

    ./ ToggleTask就是简单的通过vTaskDelay实现了跑马灯的间隔时间

    ./ SwitchTask 通过GPIO中断响应,来捕获按键同时更新间隔时间,并通知A7

    ./ StrEchoTask主要通过OPAMP/Rpmsg实现和A7消息的接收,另外通过Semaphore来实现几个task之间的切换,关于Semaphore的使用是异构双核架构下M4编程的重点,具体可以参考下面FreeRTOS官方文档说明:

    https://www.freertos.org/a00113.html

     

     

    6). Colibri iMX7 A7核心示例程序

    a). 在展示A7程序代码之前需要先进行一些关于A7 Linux系统的说明:

    ./ 由于iMX7 A7和M4是共享外设,因此在开发前需要先区分好M4所需要的外设,同时在A7 Linux的device tree

    中将这些外设disable,以免产生冲突,比如本示例,主要就使用了几个GPIO资源,以及M4调试串口,因此需要在A7 device tree中确保未使用对应的GPIO和串口资源,具体关于device tree的修改编译这里就不详述了,具体可以参考这里。当然,如果只是临时测试,也可以直接在uboot中配置,详细可以参考如下:

    https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Running_a_Firmware_on_CortexM4

    ./ 如果需要M4和A7通过Rpmsg进行通信,需要在A7 Linux下加载相关驱动,目前Toradex Linux BSP V2.7版本已经包含了驱动,只需要通过下面方式加载即可:

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

    modprobe imx_rpmsg_tty

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

    另外,如果需要开机自动加载,可以增加一个systemd自启动项目来实现。

     

    b). A7 Rpmsg通讯的Qt应用代码如下:

    https://github.com/simonqin09/iMX7_M4_Runniung_LED_Demo/tree/master/qt-rpmsg

    ./ 程序分为两个线程,主线程mainwindow实现主要图形界面显示,同时实现发送消息功能;另外一个子线程主要负责实时获取M4发来的消息并显示在主界面的对应位置。

    ./ 由于Rpmsg Linux驱动加载后,会虚拟出一个串口设备,因此基本的发送接收就是Linux下串口的基本操作,具体说明可以参考这里

     

     

    7). 完整程序的部署测试

    a). 首先在uboot下通过SD卡或者tftp将编译好的M4核心firmware下载保存到imx7 flash里面并开机自动加载,通过SD卡相关命令可以参考这里

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

    // download

    # ubi part ubi

    # tftp ${loadaddr} gpio_freertos.elf

    # ubi write ${loadaddr} m4firmware ${filesize}

    // autorun

    # setenv m4boot 'ubi read ${loadaddr} m4firmware && bootaux ${loadaddr}'

    # saveenv

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

     

    b). 然后进入linux,创建两个开机自启动服务,一个用于加载imx_rpmsg_tty驱动,另外一个用于加载Qt应用程序qt-rpmsg

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

    // script to start imx_rpmsg_tty

    $ cd /home/root

    $ vi rpmsg

    #!/bin/bash

    modprobe imx_rpmsg_tty

    exit 0

     

    // system service file to autorun rpmsg on startup

    $ cd /etc/systemd/system

    $ vi rpmsg-load.service

    [Unit]

    Description=load Rpmsg driver

    After=multi-user.target

     

    [Service]

    Type=simple

    ExecStart=/home/root/rpmsg

     

    [Install]

    WantedBy=multi-user.target

     

    $ systemctl enable rpmsg-load.service

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

    关于qt应用qt-rpmsg的开机自动加载请参考这里说明,这里就不赘述。

     

    c). 重新启动,可以看到在开机马上uboot启动瞬间LED跑马灯已经开始运转,证明M4 firmware已经运行起来,然后Linux启动后Qt应用起来,可以对跑马灯时间间隔进行增加和减少操作,同时按键更改跑马灯时间间隔的结果也会即时反馈到应用界面上来。

    1540524736738043.png

    1540524736657717.png

    8). 总结

    通过上述示例可见,通过iMX7这样异构多核架构的处理器,可以更简洁高效的实现原来需要两个分立处理器来完成的任务,简化的硬件设计,软件开发也相对更统一,数据面分享可以直接通过内存共享非常方便,相信未来会有越来越多的嵌入式应用采用这样的方案。

    展开全文
  • 如果架构不同,那么称为异构(heterogeneous)多核。从应用来看,同构多核处理器中大多数由通用处理器核构成,每个核可以独立运行,类似单核处理器。而异构多核处理器往往同时继承了通用处理器、DSP、FPGA、媒体...
  • CPU_X86架构和ARM架构入门篇

    千次阅读 2019-12-31 10:49:22
    文章目录脑图视频解读CPU的组成指令集架构: 复杂指令集 (CISC) VS 精简指令集 (RISC)X86架构ARM架构X86架构 VS ARM架构制程工艺64位计算异构计算功耗MIPS架构PowerPC架构 脑图 常见的四大CPU体系结构ARM、X86/...
  • OpenCL: 一种异构计算架构

    千次阅读 2013-10-15 15:11:51
    OpenCL:一种异构计算架构目录1 摘要2 为什么需要OpenCL?3 OpenCL架构3.1 介绍3.2 平台模型3.3 执行模型3.3.1 内核3.3.2 上下文3.3.3 命令队列3.4 内存模型3.5 编程模型4 基于OpenCL的编程示例4.1 流程4.2 图像旋转...
  • 异构多处理系统

    2020-12-07 14:11:31
    异构计算芯片是将不同架构的中央处理器CPU(Central Processing Unit)、图形处理器GPU (Graphics Processing Unit)、数字信号处理器DSP(Digital Signal Processor)和FPGA(Field Programmable Gate Array)等特定硬件...
  • AM57X1.AM57X 1.AM57X 日前,TI推出嵌入式最高性能处理器产品AM57X,该产品集成了ARM Cortex-A15...德州仪器嵌入式处理器业务拓展经理鲍震称:“单纯比较CPU性能的话,AM57X相比之前双核A9版的AM437X性能提高2.8倍,如
  • [摘要] TI Sitara系列AM5718/5728是采用ARM+DSP多核异构架构,可以实现图像采集、算法处理、显示、控制等功能,具有实时控制、低功耗、多标准工业控制网络互联、工业人机界面的优化、2D/3D图形处理、1080 HD的高清...
  • 顾名思义,单颗芯片内集成多个不同架构处理单元核心的SoC处理器,我们称之为异构多核SoC处理器,比如: TI的OMAP-L138(DSP C674x + ARM9)、AM5708(DSP C66x + ARM Cortex-A15)SoC处理器等; Xilinx的ZYNQ(ARM...
  • C2000 Concerto 系列MCU 是TI 推出的创新性的异构双核产品。Concerto 混合架构通过将业界最好 的实时控制功能和通讯功能集成在一个芯片内,提供高性能、高效率和可靠性,从而实现实时控制环 路和低延时的快速通讯...
  • ARM架构的电脑系统(特别是在终端方面应用)受到用户的广泛支持和追捧,ARM+Android成为IT、通信领域最热门的话题,众多芯片厂商纷纷推出具有各种独特应用功能基于ARM结构开发的产品,近期最新形成的“异构概念”更...
  • 本文将带领入门读者了解CPU,GPU,FPGA,ASIC...异构计算: 使用不同类型指令集和体系架构的计算单元组成系统的计算方式。常见的计算单元类别包括CPU、GPU、ASIC、FPGA等。 我们从CPU开始,讲一个小故事来帮助你理解一
  • ARM架构和X86架构的对比

    千次阅读 2018-04-20 10:13:34
    ARM架构的电脑系统(特别是在终端方面应用)受到用户的广泛支持和追捧,ARM+Android成为IT、通信领域最热门的话题,众多芯片厂商纷纷推出具有各种独特应用功能基于ARM结构开发的产品,近期最新形成的“异构概念”更成为...
  • 异构计算 文章

    千次阅读 2015-06-05 00:03:07
    从桌面到移动:异构计算翻天覆地的技术变革 http://www.csdn.net/article/2014-07-10/2820610-heterogeneous-computing-in-mobile/1
  • 导读 ...现在,引入异构内核即将成为STM32发展史上又一个重要节点,新MPU将在MCU的基础上破壳而出。 STM32家族的最新成员就是整合了Cortex-A和Cortex-M两种不同核心的STM32MP1微处理器系列。 ...
  • 广州创龙基于TI Sitara AM5728(浮点双DSPC66x +双ARMCortex-A15)+Xilinx Artix-7FPGA设计的TL5728F-EVM开发板是一款DSP+ARM+FPGA架构的开发平台,该平台适用于电力采集、电机控制器、雷达信号采集分析、医用仪器、...
  • ARM与X86架构的对决[整编]

    千次阅读 2018-01-05 11:07:13
    CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构。它们的区别在于不同的CPU设计理念和方法。早期的CPU全部是CISC架构,它的设计目的是 CISC要用最少的机器语言指令来完成所需的计算任务。RISC...
  •  1 引言  如今,随着集成电路工艺发展到深亚微米的阶段,处理器...其中,一个十分重要的方 面就是设计高效的片上通信架构[1]。多个内核上同时执行的各个程序之间可能需要进行数据 共享与同步,因此多核处理器的硬

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 762
精华内容 304
关键字:

双核异构架构