ZHCUAQ1F july 2015 – april 2023
C/C++ 编译器支持在 C/C++ 源文件中使用 TI 向量数据类型。矢量数据类型很有用,因为其可以对处理内核中的自然向量宽度加以利用。矢量数据类型可直接利用该架构上可用的 SIMD 指令,矢量数据类型还提供了从矢量数据对象的抽象模型到寄存器中该数据对象的物理表示的更直接映射。
向量数据类型与数组类似,因为矢量包含特定数量的指定类型元素。但矢量长度只能为 2、3、4、8 或 16。作用在矢量上的内在函数会在可能的情况下进行优化,以便在器件上利用高效的单指令多数据 (SIMD) 指令。
您可以使用 --vectypes 编译器选项来支持矢量数据类型。
C6000 编程模型支持的所有矢量数据类型和相关的内置函数都安装在 C6000 CGT 的“包含”子目录下的“c6x_vec.h”头文件中。任何使用矢量数据类型或任何相关内置函数的 C/C++ 源文件必须在源文件中包含以下内容:
#include <c6x_vec.h>
矢量类型名称连接元素类型名称和表示矢量长度的数字。生成的矢量包含规定数量的指定类型元素。
向量数据类型和运算的实现严格遵循 OpenCL C 语言规范。有关 OpenCL 向量数据类型和操作的详细说明,请参阅 1.2 版本的OpenCL 规范,该规范可从 Khronos OpenCL 工作组获取。1.2 版规范的第 6.1.2 节详细说明了 OpenCL C 编程语言中支持的内置向量数据类型。C6000 编程模型提供下述内置向量数据类型:
类型 | 说明 | 最大元素数 |
---|---|---|
charn | 由n 个 8 位有符号整数值组成的矢量。 | 16 |
ucharn | 由n 个 8 位无符号整数值组成的矢量。 | 16 |
shortn | 由n 个 16 位有符号整数值组成的矢量。 | 8 |
ushortn | 由n 个 16 位无符号整数值组成的矢量。 | 8 |
intn | 由n 个 32 位有符号整数值组成的矢量。 | 4 |
uintn | 由n 个 32 位无符号整数值组成的矢量。 | 4 |
longlongn | 由n 个 64 位有符号整数值组成的矢量。 | 2 |
ulonglongn | 由n 个 64 位无符号整数值组成的矢量。 | 2 |
floatn | 由n 个 32 位单精度浮点值组成的矢量。 | 4 |
doublen | 由n 个 64 位双精度浮点值组成的矢量。 | 8 |
n 为矢量长度 2、3、4、8 或 16。
例如,"uchar8" 是由 8 个无符号字符组成的矢量;其长度为 8,大小为 64 位。"float4" 是由 4 个浮点元素组成的矢量;其长度为 4,大小为 128 位。
矢量类型与边界对齐,边界等于矢量元素的总大小,最多为 64 位。任何总大小超过 64 位的矢量类型都与 64 位边界对齐(8 字节)。例如,short2 总大小为 32 位,与 4 字节边界对齐。longlong2 总大小为 128 位,与 8 字节边界对齐。
为避免混淆 C6000 对 32 位和 64 位 long 的定义,不提供基本 long long 和无符号 long(“ulong”)的矢量类型。如果要使用标准 long 和 ulong 类型,可以创建一个简单的预处理器宏,例如:#define long2 longlong2
或 #define long2 int2
,具体取决于您要使用的元素类型和大小。
代码生成工具还提供了表示复数类型矢量的扩展。前缀 'c' 用于指示复数类型名称。每种复数类型的矢量元素都包含一个实部和一个虚部(实部占据存储器的低位地址)。复数矢量类型如下:
类型 | 说明 | 最大元素数 |
---|---|---|
ccharn | 由n 对 8 位有符号整数值组成的矢量。 | 8 |
cshortn | 由n 对 16 位有符号整数值组成的矢量。 | 4 |
cintn | 由n 对 32 位有符号整数值组成的矢量。 | 2 |
clonglongn | 由n 对 64 位有符号整数值组成的矢量。 | 1 |
cfloatn | 由n 对 32 位浮点值组成的矢量。 | 2 |
cdoublen | 由n 对 64 位浮点值组成的矢量。 | 1 |
n 为矢量长度 1、2、4 或 8。请注意,16 不是复数矢量类型的有效矢量长度。例如,“cfloat2”是由 2 个浮点值组成的复数矢量。其长度为 2,大小为 128 位。每个“cfloat2”矢量元素都包含一个实部和一个虚部。
有关与矢量数据类型搭配使用的运算符和内置函数的信息,请参阅 节 7.15。