TI.com 不支持 Internet Explorer 浏览器。为获得良好的体验,请使用其他浏览器。
Video Player is loading.
Current Time 0:00
Duration 15:57
Loaded: 1.04%
Stream Type LIVE
Remaining Time 15:57
 
1x
  • Chapters
  • descriptions off, selected
  • en (Main), selected
download

[音频标识] 欢迎观看 C7000 编译器 系列的另一段视频。

大多数其他视频都 专注于介绍编译器的 单个功能,而 本视频有所不同。

它展示了如何将 多个功能结合在一起。

我是您的指导人员 George Mock。 该系列的早期 视频往往专注于 单个功能。

本视频提出了一个 问题,将所有这些 功能组合在一起 会是什么样子? 本视频中有 一个示例将这些 功能组合在一起, 包括流引擎、 流地址生成器、 可扩展向量、 向量谓词、restrict 关键字和软件 流水线。

当它们同时发生时, 会是什么样子? 版本 4.1.0.LTS 的自述文件 有一个基于 memcpy 的示例。

该示例名为 memcpy_scalable_strm。

接口类似于标准 memcpy, 但并不匹配。

本视频将介绍 该示例,然后 一次解释几行, 最后一次性 回顾所有内容。

欢迎观看本视频的示例。

它是一个函数模板,名为 memcpy_scalable_strm。

因此,其中一个输入是under control of this predicate.。

该类型是 S。S 代表标量。

它是一种基本数据类型, 例如 short float。

结果是某个长度 len S in 复制到 out。

另一个重要类型 V。V S 向量。

它的大小非常 适合您要为其 生成的 CPU。

因此,从 in out 复制以每次一个向量的 方式发生。

cnt 是循环要运行的次数。

我们在这里计算它。

SE 用于从 in 读取。

SA 用于向 out 写入。

这些行配置 SE SA。

这些行打开 SE SA, 让它们为工作做好准备。

这是执行复制的 关键循环,然后 关闭 SE SA。 接下来,视频一次 查看几行代码。

这是前两行。

第一行包含 头文件 c7x_scalable.h。

该头文件定义了 可扩展类型和实用程序。

以下是示例中 出现的两个。

using 指令意味着 您不必像此处显示的 那样实际编写 c7x::。

它不需要出现在 c7x_scalable.h 中的类型 和实用程序的前面。

这与先前的许多 示例中的做法不同, 在这些示例中,总是 要编写它们,完全写出 某些实用程序 或类型来自的 命名空间。

那么现在您可以 从两个方面来看待它。

您可以决定哪种 编码标准最适合 您的团队,然后 遵守该编码标准。 接下来的两行 是函数模板的 开头。

如果您不熟悉 C++ 模板,我认为 您不会从本 视频中学到这个 概念。

这可能会 让您感到困惑。

视频的其余部分 实际上假设您 特别了解 C++ 模板和函数模板。

因此,如果您是这种情况, 我建议您现在停止观看 视频,去掌握 该主题,然后再回来。

好的,那么 S 是一个类型名称。

而且它必须是标量类型 -- int、short、float。

通常不会明确 指定该类型, 但有语法可以 指定该类型。

通常在实例化 函数模板时 推断出该类型, 当您调用它时, 它会查看 in 指向的类型。

这就是 S 变成的类型, in 指向一些整数、一些 int 类型等,然后 S 是一个 int 等等。

restrict 关键字, 您会注意到它 出现在星号和 指针变量的名称 之间。

视频“restrict 关键字” 对此进行了介绍。

最后一个参数 len 与标准运行时支持 库函数 memcpy 使用的参数不同。

对于 memcpy,len 要复制的字符数。

对于我们 此处的函数模板 memcpy_scalable_stream, len 是要复制的 S 的数量。

那么,如果 S int double 或任何 S, 这就是要复制的 S 的数量。

这与复制的字符数 不同。 下一行要讨论的是 定义可扩展向量类型。

该类型的名称 V。V 表示向量。

由于它是 S 可扩展 向量类型,因此 每个元素都是一个 S, 它的长度是特定 C7000 CPU 的理想元素数。

更具体地说,如果 您的 CPU 有一个 512 位向量,并且您 32 位宽 int,那么 如果 S int 类型,您 将在一个 V 内拥有 16 S。从 in out 的复制 每次发生在一个 V 中。

接下来要讨论的 两行计算向量加载 和存储的次数。

那么 len 是一个函数参数。

element_count_of 返回向量 V 中的 标量数量。我们以 这种类型特征的方式 使用它来获取该值。

那么 len 除以该值 将得到初始 cnt。

然后,如果 S V 的数量不是 len 的偶数倍, cnt 会增加。

好的,如果是这样, 那么 cnt 会增加 1。

您在两个视频中 都看到了类似的 代码 -- 在关于 流地址生成器的 视频的最后, 以及关于流引擎的 视频的最后, 都有一个类似的 示例。

它们都对此处的 计算执行了非常 相似的操作。

如果 len 不是 您在向量中执行的 操作次数的偶数倍, 则将其增加 1。

原因是类似的。

当我们开始讨论主循环 代码时,我们会看到 这一点。 接下来要考虑的 两行与配置 SE SA 参数相关。

这些行调用 创建具有所有 配置默认值的 结构的函数。

in_tmplt 用于 in 参数,out_tmplt 用于 out 参数。

我们将 SE 用于 in, 因为 SE 是只读功能。

SA 可用于读取或写入。

在这个特定 示例中,您将看到 它将用于写入。 接下来的几行 继续配置 SE SA 参数。

这是用于 S in_tmplt。 这是用于 SA out_tmplt。

所有这些设置 之前在有关 SE SA 的视频中都 讨论过,因此这里 真的没有什么 新东西可讨论。

不过,我要指出的是, SE 有一种额外的特性, 那就是从默认值 更改为其他值。

这是 eletype, 元素类型字段, 表示向量 V 一个元素有 多少位。

现在设置了 SE SA 参数,是时候 打开它们了。

在本例中,SE0 SA0 是使用的参数。

当您调用它们时, 它们都使用已配置的 参数结构。

SE 还需要基地址。

对于 SA,这稍后会发生。 接下来是运行 执行复制的循环。

变量 cnt 是将 执行的加载和 存储的次数。

它也是循环 将运行的次数。

前三条语句 用于创建变量。

这是一个向量、一个谓词、 一个指向向量的指针。

然后,在同一条 语句中对每个变量 执行赋值。

先前的视频中 介绍过这些函数 调用。

但我要在这里再次回顾它们。

第一个用于流引擎。

接下来的两个 用于流地址生成器。

它们都用于 0,因此 SE0、SA0、SA0。

get_adv,我们读取 SE 的保持寄存器 并使其前进到下一个。

因此,可以合理地 认为该变量 temp 代表 SE0 的保持寄存器。

第二个,我们获取 当前 SA 偏移量的 谓词,将其 分配给变量 pred。

第三个,我们获取 当前 SA 偏移量, 将基地址添加到它, 并将其分配给 变量 addr。

现在,在前面的 示例中,这里会有 一个星号,表示 加载该地址的内容。

这不会发生在 该条特定的语句中。

我们要将地址 复制到该变量中。

vstore_pred tmp 中的保持寄存器在此 谓词的控制下 存储到此地址的 向量中的位置。

下一张幻灯片将对此 进行更详细的说明。

但在此之前, 我想指出,我已经 S 的几个不同 实例构建了此代码, S unsigned char int。

在我尝试的每种情况下, 我都会得到此循环的 i,i 1。

因此,对于执行向量 加载和向量存储的循环, 如果有很多事情要做, 将它们全部放入 i 中, i 1 是很好的结果。 这正是我们想要的。

因此,我们能够 使用 C7000 一个周期内完成 这么多的工作。 这是该视频系列第一次 使用 vstore_pred,所以 我想仔细介绍一下。

tmp 是一个向量。

addr 是向量的地址。

pred 是谓词。

发生的事情是, 在该谓词的控制下, tmp 的所有元素 都被复制到该地址的 向量中。

用伪代码表示, 它看起来像这样。

此循环会遍历 向量的每个元素。

如果相应的谓词 不为 0,那么 我们将该元素 tmp 复制到 该地址的元素中。

这看起来很多。

确实如此。

C7000 只需一条 指令即可完成此操作。

这是 C7000 向量 处理很能力强大的 一个示例。

主循环结束后,所有 存储器复制都已完成, 您关闭 SE SA。

函数模板到此结束。

逐行讨论已经 完成,现在是 回顾整个函数 模板的好时机。

那么这是它的名称。

它从此处开始。

当您调用它时, 会推断出此类型 S。

这些是参数。

这是您要读取的位置。

这是您要写入的位置。

这是加载和存储的 S 副本的数量。

此类型 V 是由 S 元素构成的向量。

其大小非常适合 您为其生成的特定 C7000 CPU。

这些代码计算 复制缓冲区 所需的加载和存储次数。 这些代码配置 SE SA 参数。 这些行打开 SE0 SA0。

请记住,SE0 用于读取, 因为 SE 是只读的。

SA 用于写入。 这是循环,执行 加载和存储的关键 中心循环。

此处的此语句 in 加载整个向量。

然后,此处的 该语句在此谓词的 控制下将整个 向量写入地址 addr。

请记住,为这些 代码生成的软件 流水线循环有一个 i, i 1,这意味着每个 CPU 周期都会加载 和存储整个向量。

然后,函数模板 以关闭 SE SA 结束。 本视频即将结束, 在此提供两个参考网站。

第一个是该网址。

它有点长,输入起来 有点困难,所以我建议 您在互联网中 搜索 C7000 编译器。

我尝试过使用几个 不同的搜索引擎进行 该搜索,我得到的 第一个结果都是该网址。

无论您如何进入 该网址,您都来到 C7000 编译器的主页。

在这里,您可以下载 编译器,访问手册和 更多类似的详细信息。

第二个参考网站 e2e.ti.com。

这里供客户提出有关 任何 TI 产品的问题, 包括 C7000 编译器。

如果问题与编译器有关, 将由我来回答。

感谢您观看 C7000 编译器 系列视频 之一的本视频。