冯华亮/Brighton Feng---Communication Infrastructure



摘要

HyperLink 为两个 KeyStone 架构 DSP 之间提供了一种高速,低延迟,引脚数量少的通信接口。HyperLink
的用户手册已经详细的对其进行了描述。本文主要是为 HyperLink 的编程提供了一些额外的补充信息。



同时本文还讨论了 HyperLink 的性能,提供了在各种操作条件下的性能测试数据。对影响HyperLink 性能的一些参数进行了讨论。



文章的最后附上对应本文的应用代码。



1、HyperLink 介绍



HyperLink 为两片 DSP 之间提供一种高速、低延迟,引脚数少的通信连接接口。



HyperLink 的设计速度最高速率支持 12.5Gbps,目前在大部分的 KeyStone DSPs
上, 由于受限于 SerDes 和板级布线,速度接近为 10Gbps 。HyperLink 是 TI 专有的外设接口。相对于用于高速 Serdes 接口的传统的 8b10b 编码方式,HyperLink 减少了编码冗余,编码方式等效于 8b9b。单片 DSP 为
HyperLink 提供 4 个 SerDes 通道,所以 10Gbps 的HyperLink 理论吞吐率为 10*4*(8/9)= 35.5Gbps= 4.44GB/s.



HyperLink 使用了 PCIE 类似的内存映射机制,但它为多核 DSP 提供了一些更灵活的特性。本文将会使用几个范例来详细解释这一点。



本文还讨论了 HyperLink 的性能,提供了在各种操作条件下的性能测试数据。对影响HyperLink 性能的一些因素进行了讨论。



2、HyperLink 配置

    

本节提供了一些配置 HyperLink 模块的补充信息。



2.1 Serdes 配置



Serdes 必须配置成期望的链接速度。 图 1 表示了输入参考时钟和输出时钟之间的关系。







输入参考时钟建议限制在 156.25MHz ~312.5MHz 范围内。Serdes PLL 的倍频系数必须合理配置生成的内部时钟(internal  clock) 限制在 1.5625GHz ~ 3.125GHz 范围内。



最后的链接速度由内部时钟(internal clock)驱动,通过 link rate 配置来得到。



2.2 HyperLink 存储映射配置



HyperLink 的存储映射非常的灵活。 HyperLink 的用户手册对此作了详细的描述。本节将用两个例子来详细的解释它。图 2 是第一个例子。





图 2  通过 HyperLink 窗口 映射到远端不同类型的存储空间



在这个例子里面, DSP1
的存储空间映射到了 DSP0
的存储空间窗口 0x40000000~0x50000000DSP0
可以访问 DSP1
的所有内存空间,包括 LL2,SL2,DDR,就像访问自己的本地的存储空间一样。在 DSP0
上,所有的 Master 都可以通过以 0x40000000 起始的 Outbound 窗口地址来访问 DSP1
的存储空间,但是不同 master 事实上可能访问到 DSP1
上不同的存储空间。原因是HyperLink 发送侧传输数据时,会将 PrivID 一起传输。接受侧通过 PrivID 值,可以建立不同的地址映射表



对 DSP0
与 DSP1
的内存映射关系总结在下表(表 1)。









通过上表的配置,可知

    当 DSP0
的 core 0/1 访问 0x40800000,它事实上 访问了 DSP1
上的 LL2 地址空间。

当 DSP0
的 core0 访问 0x4D000000,它事实上访问了 DSP1
上 DDR 的地址空间 0x8C000000 

当 DSP0
的 core1 访问 0x4D000000 ,它事实上访问了 DSP1
上 DDR 的地址空间 0x8F000000 与本文档对应的范例工程将 HyperLink 配置成上述的内存映射关系。下面是关键部分的配置代码。









对于一些简单的应用,可能只是想访问远程 DSP 的
DDR 空间,那么下面的例子用于这种情况。存储映射关系如下图所示。





图 3  通过 HyperLink 窗口只映射到远端的 DDR 空间



这是最简单的例子,但是却可以访问远端 DSP 的大块存储空间。DSP0
上的每个 master(core 或者其他外设) 都可以可以访问 DSP1
上 256MB DDR 空间。下表描述了 core0 和 core1 的对 remote DSP DDR
存储映射。







3、HyperLink 性能考虑

    

本节将让设计者对 HyperLink 访问远程存储空间的性能评估有基本的认识。同时提供了在不同的操作条件下获得的性能测试数据。大部分测试是在最理想的测试条件进行,以评估可以获得的最大吞吐量。



本文所描述的绝大部分性能数据是在 C6670EVM 上获得。C6670 EVM 上 DDR 配置成 64bit 位宽1333M, HyperLink 速率配置成 10Gbit。



一些影响 HyperLink 访问性能的因素在本节中将会被讨论到。



3.1 通过 HyperLink 实现存储拷贝的性能

下表(表 3)描述了使用 HyperLink 在 LL2 与远程大块线性存储空间进行数据传送测试获得的传输带宽。传输块的大小为 64KB。带宽的计算是通过计算传输总的字节数除以传输所用的时间获得。







上述数据展示了 cache 能够极大的改善 DSP 内核通过
HyperLink 读取数据的性能。



但是 L2 cache 却遏制了通过 HyperLink 写数据的性能,这是因为 L2 是 write-allocate cache。对于使能 L2cache 后的写操作,它总是会先从将要写入的存储区读取 128 字节的数据到 L2cache ,然后在 L2 cache 中修改数据,最后在 cache 冲突的时候回写回到原先的存储区,或者人为的回写回原存储区。





                



上述 EDMA 吞吐率数据是通过 TC0 (传输控制器 0)和 CC0(通道控制器 0)上测试得到,其他 TCs的数据会比 TC0 稍低。整个传输的瓶颈是在 HyperLink,不是在 EDMA 传输控制器上。



上述测试结果表明通过 HyperLink 进行写操作的性能会比通过 HyperLink 进行读操作的性能要好。



远程 DSP 存储空间类型不会对带宽造成明显的影响。访问远程 DSP 的
SL2 会比 LL2 快一些。



目前,通过 HyperLink 来访问远程 DSP 存储空间(相对其他接口)是具有最高的带宽性能的,但是访问远程存储空间比访问本地存储空间还是要慢。下表对比了访问本地
LL2 和 DDR 与远程DDR 的吞吐性能。







大体来说,对本地存储空间的写入吞吐率是对远程空间进行写入操作的吞吐率的 3 倍。对远程空间的读性能会更差些。我们应该尽量避免远程读取数据。



3.2 DSP core
通过 HyperLink 进行远程访问的延迟



DSP 核通过
HyperLink 访问远程空间的性能高度依赖于 cache。当 DSP 内核通过
HyperLink 来访问远程存储空间的时候,一个 TR(传输请求)可能会被生成并传送给 XMC(这取决于数据是否可以进入 cache 和被预取)。TR 将会是下面中的一种。



一个单一的元素- 如果存储空间不能被 cache 和预存取。



一个 L1 cache line – 如果存储空间可以进入 cache ,但是 L2 cache 没有被使能。

一个 L2 cache line -如果存储空间可以进入 cache,同时 L2 cache 被使能. 

如果存储空间可以被预存取, 预存取将会被使能为一个预存取的 buffer slot.



如果 L1/L2cache 或者预存取命中, Hyperlink 端口不会有数据传输



远程空间数据可以被本地 L1 cache/L2 cache 缓存,或者都没有被 cache。如果对应存储空间的MAR(Memory Attribute Register) 寄存器上的 PC(Permit  copy)位没有被置位,那么对应存储区的数据将不会进入 cache。



如果 MAR 寄存器上 PC 位被置位,同时 L2 的 cache 空间是 0(L2 被全部配置成 SRAM),那么外部存储空间的数据可以进入 L1cache。



如果 MAR 寄存器上 PC 位被置位,L2 的 Cache 空间大于 0.那么外部存储空间的数据就可以进入 L1cache 和 L2cache。



读取远程存储空间数据也可以使用 XMC 中的 prefetch buffer。该特性可以在 MAR 寄存器PFX(PreFetchable eXternally)被置位后使能。



地址步进长度也会影响 Cache 和 Prefetch buffer 的使用效果。连续空间的访问可以最充分的利用cache 和 prefetch buffer,从而达到更好的性能。



以 64bytes 距离或者更大间隔进行步进访问将会导致每次 L1 cache 命中失败(miss),这是因为L1 cache line 的大小是 64byte。



以 128bytes 距离或者更大间隔进行步进访问将会导致每次 L2 cache 命中失败(miss)。

如果 cache miss 发生,那么 DSP 核就会被
stall(等待数据)。Stall 的时间长度等于传输延迟、传输间隔,数据返回时间,cache 请求延迟的总和。



下面的章节描述 DSP 内核通过
HyperLink 访问存储区的延迟。测试伪代码如下列所示。







下图(图 4)为 1GHz C6670EVM 上配置 DDR 64bit 1333M 测试获得的结果。通过 HyperLink 实现 512 次 LDDW(load double word) 或者 STDW( store double word)操作的性能测试。图 4 绘制了各种测试条件下的性能 。 LDB/STB 和 LDW/STW 和 LDDW/STDW 的指令周期数相同。虽然cache
和 prefetch buffer 可以被独立配置,但是测试的时候使用的配置是:如果 cache 被使能,那么 prefetch 也被使能,如果 cache 没有被使能,那么 prefetch 也没有被使能。















Non-cachable 写是 post 操作。所以它只会 stall DSP core
很短的一段时间。



但是 read 是 non-post 的,所以 DSP 内核会等待数据的到来,所以它会
stall DSP 内核相对长一点时间。



当 cache 被使能后,DSP core
访问 remote 空间的吞吐性能高度依赖于 cache。



地址的步进间隔也会影响到 cache 的使用。连续的地址访问可以充分的利用 cache。但是地址的步进间隔超过 case line 的大小(L1 case line =64Byte,L2 Case line =128Byte)将会导致每次cache 都无法命中,从而制约了性能。所以,对连续地址空间的数据访问(像大块数据拷贝),cache 需要被使能,在其他情况下 cache
应当不要使能。



通过上面的图可以发现通过 HyperLink 访问 DDR,SL2,LL2 在性能上并没有明显的差异。所以,正常情况下,通过 HyperLink 来共享 DDR 是一个很好的选择,因为 DDR 容量大,而且成本低。



3.3 HyperLink 传输使用 DMA 方式的开销(overhead)

初始延迟被定义为 EMDA 事件触发到真实数据之间的传输开始之间的延迟。因为初始延迟很难被测量。所以我们就测试传输的开销,它被定义为传输最小单元数据的延迟 。延迟的大小取决于源和目标端的类型。下表描述了使用 EDMA 在 1GHz  TCI6618EVM 不同端口间传输一个字(word)时,从 EDMA 触发(写 ESR)到 EDMA 传输结束(读 IPR=1)的平均指令数目。







表 6 中,读 Hyperlink 的延迟是 853 个指令周期, 写 Hyperlink 的延迟是 322 指令周期,因为写是 post 操作,而读是 non-post 操作。所以从 HyperLink 端口读取数据的延迟要高于写入数据到HyperLink。



对于小批量数据传送,传输开销(overhead)是很大的顾虑,尤其是系统中队列 DMA 阻塞的时候。单一元素的传送性能较差,延迟会占用大部分时间。所以,对于小批量数据传送,必须对使用EMDA 方式还是 DSP 核方式来访问数据进行权衡。使用内核来访问单个随机数据的延迟会比DMA
方式延迟小很多。本文 3.2 节已经做了详细的描述。



3.4 HyperLink 中断延迟



一个 DSP 可以通过
HyperLink 来触发另外一个 DSP 的中断。通过
HyperLink 传递中断的延迟通过下列的伪代码获得测量。







测试是在 Loopback 模式下测试。



1GHz C6670 的测试结果是 大概 710 个 DSP core
cycles。



4、范例工程

    

本文的范例代码在 C6670EVM 上通过测试。EVM 板子上有两个 C6670 DSP,他们通过HyperLink
互联。



在这个例子中,DSP1
存储空间通过 HyperLink 被映射到了 DSP0
上。DSP0
通过 HyperLink 窗口访问 DSP1
的存储空间就像访问自己的本地空间一样。这个工程范例也支持 loopback 模式。在loopback 模式下,DSP0
事实上是通过自己的 HyperLink 窗口访问了自己的本地地址空间。



本例也演示了通过 HyperLink 来实现中断传递。



工程代码的目录结构如下图所示。





                    图  7  工程代码目录树



该示例代码同样可以在其他 KeyStone DSP EVM
板上运行。只是如果板子上只有一个 DSP 芯片,那么只能运行
loopback 模式。



下表列出了 KeyStone 工程的关键代码列表。







运行这个范例工程的步骤:



1. 连通 CCS 与 DSP EVM. 

2. 下载代码到 core 0 of DSP0.

3. 下载代码到 core 0 of DSP1.

4. 先运行 DSP1
, 然后运行 DSP0.
(如果 EVM 上只有一个 DSP,且运行在
loopback 模式下,那么直接下载到DSP0,再运行)

5. 检测每个 DSP 的
stdout 窗口,验证测试结果。



典型的输出信息如下:









用户可以在 HyperLink_Test.c 中的 HyperLink_config()函数中修改初始化值,然后重新编译来验证在不同配置下的 HyperLink 性能。



这个例子是在 CCS5.1 下编译,使用 pdk_c6618_1_0_0_5。如果在你的电脑上进行重新编译新的配置,你可能需要修改 csl 包含路径。



参考资料

1. KeyStone Architecture HyperLink User Guide (SPRUGW8)

2. TMS320C6670 datasheet (SPRS689)

【DSP开发】HyperLink 编程和性能考量的更多相关文章

  1. DSP开发笔记一

    前言 ​ 本笔记首先对DSP的特点及其选型进行了描述,然后重点记录DSP开发环境的搭建及基础工程示例,对为DSP开发新手有一定的指导作用. 1. DSP简介 1.1 主要特点 在一个指令周期内可完成一 ...

  2. python函数式编程,性能,测试,编码规范

    这篇文章主要是对我收集的一些文章的摘要.因为已经有很多比我有才华的人写出了大量关于如何成为优秀Python程序员的好文章. 我的总结主要集中在四个基本题目上:函数式编程,性能,测试,编码规范.如果一个 ...

  3. 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发

    针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...

  4. 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧

    Database Performance Tips for Developers对于开发人员的数据库性能技巧 As a developer you may or may not need to go ...

  5. DSP开发资源总结,经典书籍,论坛

    OMAP4开发资源总结: 一.TI OMAP4官网介绍: http://www.ti.com.cn/general/cn/docs/wtbu/wtbuproductcontent.tsp?templa ...

  6. Davinci DM6446开发攻略——DSP开发工程建立

    前段时间一直忙一个项目,同时在生活上时时提防和抵抗中国地沟油.国外核心转基因调和油.大豆油.色拉油.大米玉米.可怕的喂药鱼.药水泡农药喷无虫咬的青菜,所以没时间打理自己的博客,让开发攻略停顿了一段时间 ...

  7. (转载)android开发常见编程错误总结

    首页 › 安卓开发 › android开发 android开发常见编程错误总结 泡在网上的日子 / 文 发表于2013-09-07 13:07  第771次阅读 android,异常 0 编辑推荐:稀 ...

  8. Java开发手册-编程规约精选

    # Java开发手册-编程规约精选 ## 总约 - 采用驼峰写法 ## 变量 - 首字母小写 ## 方法 - 方法名首字母小写- 参数首字母小写 ## 引用 - <阿里巴巴Java开发手册> ...

  9. 你应该知道的4个DSP开发支持库

    引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些算法支持库,对于加快dsp开发进程与提高代码质量.稳定性有非常大的帮助. Digital ...

随机推荐

  1. SQL 修复表

    alter database dcdata set single_user with rollback immediate设置为单用户模式然后执行修复.DBCC CHECKTABLE(ZLBZSGPH ...

  2. Educational Codeforces Round 26 [ D. Round Subset ] [ E. Vasya's Function ] [ F. Prefix Sums ]

    PROBLEM D - Round Subset 题 OvO http://codeforces.com/contest/837/problem/D 837D 解 DP, dp[i][j]代表已经选择 ...

  3. perl 数组变量(Array) 转载

    Perl 变量(2)--数组 原文地址:Perl 变量(2)--数组 作者:飞鸿无痕 二.数组 数组是标量数据的有序列表. 数组可以含任意多个元素.最小的数组可以不含元素,而最大的数组可以占满全部可用 ...

  4. The Semantics of Constructors: The Default Constructor (默认构造函数什么时候会被创建出来)

    本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记. C++ Annotated Reference Manual中明确告诉我们: default co ...

  5. 家庭问题x

    [问题描述] 有n个人,编号为1,2,……n,另外还知道存在K个关系.一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员. 当n,k和k个关系给出之后,求出其中共有多少个家庭.最大的家庭 ...

  6. vue中改变数组或对象,页面没做出对应的渲染

    原文链接 数组更新检测 变异方法 Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新.这些方法如下: push() pop() shift() unshift() splice() sor ...

  7. python递归获取目录下指定文件

    获取一个目录下所有指定格式的文件是实际生产中常见需求. import os #递归获取一个目录下所有的指定格式的文件 def get_jsonfile(path,file_list): dir_lis ...

  8. Mybatis 实体类使用@Accessors(chain = true)注解时,对应的mapper xml 报错

    去掉这个注解就行了 应该是 mybatis 会调用实体类的 getter  setter 方法, 返回值可能会有所影响

  9. Springdata-Jpa学习笔记

    Respository接口 Respository是Springdata JPA中的顶层接口,提供了两种查询方法: 1)基于方法名称命名规则 2)基于@Qeury注解查询 1. 方法名称命名规则查询 ...

  10. LeetCode 137. 只出现一次的数字 II(Single Number II)

    题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...