搞了一个半月的Tilera平台,总体上对该平台有一定的认识,这里写篇文章,算是做一个总结。
首先大概介绍一下Tilera处理器吧,这个处理器是一个众核处理器,一共有多种不同类型的CPU,其核心分别为9、36、72、100个核心。我们使用的Gx36 CPU,里面一共有36个核心。这中类型的CPU在官方宣传中号称是可以在非常低的功耗下达到Xeon E5的性能,对此我们在使用中表示呵呵呵~~~~开发这个CPU的公司是MIT搞得企业,貌似现在已经被Mellanox收购啦
好了,废话不说,简单介绍一下Tilera处理器吧。
第一章 Tilera处理器简介
1.1概述
Gx?处理器系列适合网络,视频及云计算应用。TILE-Gx?处理器系列具有最高单位面积效能耗电比的SOC特性。TILE-Gx?是 Tilera发布的新一代 64位众核处理器,TILE-Gx?具有业界高水平单位面积效能耗电比,同时拥有先进的包处理功能及为广泛的网络,视频,及云计算应用集成了相应硬件加速模块。 TILE-Gx? 由 9, 16, 36, or 72个相同的处理器核(Tiles)组成,每个Tile都是一个完整的全功能处理器,拥有独立的一级和二级缓存(L1&L2 cache),并通过内置的高速、无阻塞的交换矩阵与其他Tile互联,即Tilera独有的iMesh?片上网络。此外,Tilera独有的DDC动态分布式缓存(Dynamic Distributed Cache)技术更可为线程与共享内存的应用提供灵活可扩展的缓存访问性能。TILE-Gx?集成了一套完备的 DDR3 内存与 I/O 控制器,不再需要借助于传统的南北桥芯来实现外部数据的接入,从而大大降低了硬件系统的设计复杂度与成本。TileDirect?技术提供了IO 到处理器(Tile)缓存的直接访问途径,保证了超低延时的包处理性能。
TILE-Gx?支持标准的 ANSI C/C++编程或 Java,并支持通用的GNU开发工具链,对于开发者而言,这意味着绝大多数已有的软件或开源代码只需经过简单的移植即可在 TILE-Gx?平台上运行。此外,TILE-Gx?还支持同时运行多个操作系统,既可以每个 Tile 运行一个独立的操作系统,也可以在几个 Tile上运行一个支持多进程的操作系统,如SMP Linux。 TILE-Gx?适合用来在数据及控制平面做协处理或替代多核 CPU, DSP子系统。TILE-Gx?中集成的C可编程智能网卡功能提供了20Gbps到80Gbps的流分类及负载均衡性能。图1.1显示了Tilera-Gx36多核处理器的结构细节。
图1.1 TILE_Gx36处理器结构
表1.1则展示了TILE_Gx36的一些特性。
表1.1 TILE_Gx36特性
特性 |
TILE_Gx36 |
处理器(64bit,1.0~1.2GHz, 5层独立Mesh互联网络) |
36 核 12MBytes 片上缓存 60Tbps iMesh 带宽 |
内存控制器(72bit 支持ECC DDR3 ) |
2 个内存控制器 支持 512GB 内存 支持最高 1866 MT/s |
网络接口 |
4 个 10 Gbps XAUI 接口,支持 double-XAUI 最多 16 10/100/1000 SGMII 接口(全部XAUI接口复用) |
PCI Express 集成控制器(Gen2,root complex or endpoint支持,DMA支持, SRIOV 虚拟化支持) |
3 PCIe 控制器 共 16 Lanes(x8,x4,x4) |
treamIO 接口(芯片互联与FPGA互联,20Gps峰值性能) |
3 |
系统集成特性 |
2 个 USB2.0(主/从) 3 个 I2C 接口 1 个主 SPI 接口 2 个高速 UART 接口 64 GPIO/终端管脚 JTAG 调试接口 |
mPIPE? 线速包处理引擎(C可编程流分类,Checksum 和 CRC 加速,多模式直通缓存包传输的负载均衡器等) |
60Mpps(最小包) |
MiCA?加解密及压缩引擎 |
2 个 MiCA? 40 Gbps 加解密带宽(-Eoption) |
典型功耗(W) |
22~28 |
封装 |
1265-Ball BGA, 37.5 x 37.5 |
1.2 Tiles
从图1.1中我们可以一个Gx36芯片内部设有36个核心(每一个称之为tile),这些核心以数组的方式二维排列。在内部,每个核相当于一个独立的CPU,都由一个64位的处理器单元、一个缓冲单元、一个开关组成。不同于传统的多核处理器,tile核之间的连接釆用网状的结构,每个核可以和其邻进的4个tile核进行交互。这种高速网状结构使核与核之间的通信非常地高效,网络的传输带宽最高时能到达500Gbps,Tilera-Gx36的总带宽高达16Tbps。如图1.2显示了单个tile核的内部结构。
图1.2 tile核的内部结构
处理器的引擎是一个传统的 64位VLIW 处理器,包含有三个指令:内存管理、保护和操作系统支持。Tile处理器包括特殊指令支持常用的嵌入式操作中的 DSP,视频和网络数据包的处理,包括:绝对差和,散列和校验和,指令加速加密,字并行的SIMD 指令,饱和运算,非对齐访问加速。
缓存引擎包含了L1D(数据缓存)、L1I(指令缓存)、L2缓存。当需要加载的数据或指令不在L1、L2中时,存储系统将会在其他tile核的L2 cache或者在外部的DDR3中进行查找。
1.3核间通信网络
如图1.1所示,每一个tile核均通过Tilera专门设计的iMesh网络进行互联,处于边界上的tile则可以通过iMesh与I/O接口进行连接。Tilera公司提供了两种可编程的核间网络通信方式:User Dynamic Network(UDN,用户动态网络),I/O Dynamic Network(I/O动态网络)。UDN 主要用来用户级应用程序的快速低延迟的明码的消息通信。Tilera 的软件套件提供了库以方便开发人员访问具有不同的编程范式的 UDN。系统软件使用IDN进行与I/O设备间的通信和系统级的核间通信。
1.4系统软件栈
运行于tile处理器上的软件分为三个层次:hypervisor层、supervisor层、application层。如图2.3所示。
图1.3 软件栈
- Hypervisor层将Tilera处理器的硬件进行抽象,从而使supervisor层可以运行,并管理多个tile核之间的通信,以及相应的I/O控制器,并提供最底层的虚拟内存管理。
- Supervisor层则可以在用户空间调用I/O接口和相应的库,Linux操作系统便属于该层次。在该层次,我们可以开发多核或者多线程的应用。操作系统管理相应的硬件资源,并提供各种高级服务,如创建线程、分配虚拟内存等等。
- Application层则运行一些标准库,例如C运行时库,Tilera Multicore Components(TMC)库等等。
另外,Tilera还提供了Base Metal Environment(BME)运行环境。在该环境下,允许使用者直接控制相应的硬件资源,用户应用直接运行在hypervisor层。但是,开发此类应用要求开发者对Tilera处理器的硬件结构有相当清楚的了解,可能会花费开发者更多的时间。因此,对于大多数应用,并不推荐该方式。
1.5 tile分类
tile核可以分为如下四类。每一个tile核的类别可以通过hypervisor配置文件(.hvc)进行配置,并且在启动后不能改变。
- lStandard类型——在该类型下,tile核遵循正常的Linux调度规则,可以运行任何任务。Linux系统可以自动在不同的tile核间进行负载均衡。
- Dataplane类型——对于一些实时性要求较高的应用,可以将tile核设置为该模式,在该模式下,操作系统将提供最小的支持,Linux内核不会向dataplane CPU产生中断,因此应用程序将会一直运行,直到自己退出CPU。该模式通常在开发Zero Overhead Linux(ZOL)应用时使用。
- Dedicate类型——在该模式下,tile核将完全不能被Linux利用,对于Linux来说,此时相应的tile核处于离线状态。此模式通常用于开发一些高性能的hypervisor驱动。
- Bare Metal Environment(BME)类型——该类型下,用户完全控制相应的硬件资源。
1.6 操作系统
Tilera CPU上运行一个专门的对称多处理器Linux操作系统(Symmetric MultiProcessing Linux,SMP Linux),也称之为Tile Linux。该Linux基于标准的开源Linux 3.10版本,并且针对Tilera处理器的架构进行了专门的适配,从而可以很好的支持该CPU,并提供了操作系统的各种功能。
第二章 软件开发环境
2.1 MDE简介
对于Tilera处理器的开发,采用交叉开发环境,软件使用tilera自行开发的MDE软件。(MDE其实既可以在其他linux平台,也可以在tile linux上运行,但是官方在tile linux上安装的MDE缺少相应的编译器以及IDE,所以我们选在在安装有centos的机器上安装完整的MDE软件,以便我们可以使用其特有的交叉编译器tile-gcc,以及IDE环境)
多核开发环境(Multicore Development Environment? ,MDE) 是 Tilera 公司为进行 Tilera 平台开发而设计的软件。MDE是一个完整的、标准的多核编程解决方案。通过MDE开发者可充分发挥Tile处理器架构下的并行处理能力。MDE编程套件是当前开源工具、技术及适合下一代大规模众核设计应用解决方案的最佳组合。MDE成熟的开发环境可帮助开发人员迅速将他们的应用推向市场,同时新的工具,帮助他们充分利用Tilera多核处理器性能。通过使用Tilera的MDE套件中的高级集成视图和Profiling分析技术,开发人员可以延伸到更大规模,更复杂的多核应用。
MDE提供了命令行模式和IDE开发模式,两种模式的完全兼容,而IDE提供了更好的可视化信息。MDE支持标准的ANSI C/C++编程或 Java,并支持通用的GNU开发工具链,对于开发者而言,这意味着绝大多数已有的软件或开源代码只需在MDE下经过简单的移植即可在TILE-Gx?平台上运行。
在MDE环境下,你可以使用Tilera专门提供的多核编程API开发并行应用,也可以使用第三方代码库,或者使用传统的并行编程模型OpenMP、MPI,还可以移植任何你感兴趣的并行模型到Tilera平台,进行并行程序开发。
2.2 命令行常用命令
在命令行模式下,MDE的使用主要通过各种命令进行,如下列举了既可以在CentOS下使用也可以在Tilera服务器上使用MDE工具。
- GCC环境
这里仅指标准的GCC编译器,tile-gcc、tile-g++交叉编译器只能运行于CentOS上。
- tile-monitor
该工具提供了完整的程序在Tilera平台上运行、仿真接口,以及文件上传、下载、映射主机文件到tile Linux功能,还支持debug和性能分析。该工具也是在开发中使用最频繁的工具之一。
- tile-gdb
gdb是一个标准的开源debug调试工具,尽管你可以直接使用tile-gdb命令进行调试,但是我们依然推荐使用tile-eclipse或者tile-monitor中的debug调试选项进行相同的工作。
- OProfile
这个工具是Tilera版本的开源OProfile性能分析工具,包括了tile-opannotate和tile-opreport两个命令。我们依然推荐使用使用tile-eclipse或者tile-monitor中的性能分析选项。
- tile-reboot
这个工具可以让你重启Tile板卡。
- tile-mkboot
这个工具可以让你将自己的可执行文件添加到Tilera处理器的启动过程中。
- tile-sbim(在CentOS端),sbim(在Tilera端)
这个工具可以让你管理bootable SPI ROM(SROM)的内容。
- binutils
该工具是GNU的二进制工作集。
另外,MDE的一些命令只能在CentOS上使用,具体如下:
- Eclipse IDE(tile-eclipse)
这是Tilera基于eclipse开发GUI接口,可以支持程序的编写、编译、运行、debug以及性能分析。
- tile-console
这是一个基于Linux控制台的命令,可以使用该命令通过USB和串口连接Tilera主机。
- tile-sim
这个命令可以使用软件进行仿真。
- tile-trace-view
这个命令用于启动 Tilera Trace Viewer窗口。
其中我们使用最多的就是tile-monitor命令,以及交叉编译器tile-gcc。tile-monitor可以完成程序的上传、下载、运行等等各种功能,具体可以查看相应的命令帮助信息。
tile-monitor提供在CentOS与Tilera处理器进行交互的桥梁,其提供了丰富的功能,具体如下:
- 在开发者主机与Tilera主机之间传输文件
- 指定应用运行的具体tile
- 将本地主机的文件挂载到Tile Linux文件系统上。
- 运行应用
- 进行debug
- 运行OProfile性能分析工具
tile-monitor的命令格式如下:
tile-monitor [options ...] [commands...] [-- exe [args ...]]
具体的命令选项非常多,在此我们不在赘述,读者可以通过tile-monitor --help命令自行查看。其中比较常用的命令选项有:
--net <host>:<port> 通过网路连接Tilera主机
--run -+- <exectable> [<arg> …] -+- 运行可执行文件
--tile <tile> 指定应用运行的tile
--upload <host-path> <tile-path> 上传文件
--download <tile-path> <host-path>下载文件
--resume 跳过启动过程
--launch -+- <exectable> [<arg> …] -+- 运行可执行程序
2.3 IDE运行模式
首先,我们需要通过tile-ecpilse命令来启动IDE,tile-ecpilse 命令有多种可选参数,这里我们对其中的两个做出简要说明,其余请自行查看帮助信息。
直接使用命令tile-ecpilse,IDE将当前用户$HOME/.tilera/workspace/文件夹下建立工作目录。
tile-ecpilse –-here IDE将在当前目录下建立工作目录。
tile-ecpilse –-workspace directory IDE在指定路径下建立工作目录。
启动IDE后界面如图所示:
IDE的面板默认情况下可以分为上图所示的七个部分:
1、 C/C++ Projects:工程目录,包含工程的一些属性,例如makefile文件、源代码、头文件以及最终的二进制结果文件。
2、 Monitor View:通过在此视图下设置tile-monitor的命令参数,包括程序上传方式、上传路径、运行位置等等。
3、 Make Target:显示makefile文件的详细信息。
4、 显示代码窗口,可以在此窗口对代码进行查看以及修改。
5、 debug窗口,用于显示程序调试时的信息。
6、 Grid View:tile服务器的网格视图,可以看到程序运行过程中的每一个核和其他硬件资源的现状。
7、 Console:控制台窗口,显示程序的编译、链接和运行结果等。
当然我们也可以通过点击面板上方的window选项,在打开的选项卡中选择。
至于如何新建工程调试,这里就不再多讲了。程序的具体开发流程跟正常的C程序开发一样,但是我们可以使用一些tiler特有的API来完成相应的功能。相关的API可以在官方手册里面具体查看,这里也不多讲,因为基本没人会用这个玩意。