ZHCUAU3J January 2018 – March 2024
C/C++ 编译器支持在 C/C++ 源文件中使用 TI 向量数据类型。矢量数据类型很有用,因为其可以对处理内核中的自然向量宽度加以利用。矢量数据类型可直接利用该架构上可用的 SIMD 指令,矢量数据类型还提供了从矢量数据对象的抽象模型到寄存器中该数据对象的物理表示的更直接映射。
向量数据类型与数组类似,因为矢量包含特定数量的指定类型元素。但矢量长度只能为 2、3、4、8、16、32 或 64。作用在矢量上的内在函数会在可能的情况下进行优化,以便在器件上利用高效的单指令多数据 (SIMD) 指令。
对向量数据类型的支持默认启用。如需禁用前缀没有 双下划线的向量数量类型,可以使用 --vectypes=off 编译器选项。
例如,__int4
类型始终可用,但 --vectypes=off 选项会禁用 int4
类型。请注意,以下各表和示例使用的是没有双下划线前缀的类型名称。
C7000 编程模型支持的所有矢量数据类型和相关的内置函数都安装在“c7x.h”头文件中。
矢量类型名称连接元素类型名称和表示矢量长度的数字。生成的矢量包含规定数量的指定类型元素。
向量数据类型和运算的 C7000 实现与 OpenCL C 语言规范有所相似。C7000 编程模型提供下述内置向量数据类型:
类型 | 说明 | 最大元素数 |
---|---|---|
charn | 由n 个 8 位有符号整数值组成的矢量。 | 64 |
ucharn | 由n 个 8 位无符号整数值组成的矢量。 | 64 |
shortn | 由n 个 16 位有符号整数值组成的矢量。 | 32 |
ushortn | 由n 个 16 位无符号整数值组成的矢量。 | 32 |
intn | 由n 个 32 位有符号整数值组成的矢量。 | 16 |
uintn | 由n 个 32 位无符号整数值组成的矢量。 | 16 |
longn | 由n 个 64 位有符号整数值组成的矢量。 | 8 |
ulongn | 由n 个 64 位无符号整数值组成的矢量。 | 8 |
floatn | 由n 个 32 位单精度浮点值组成的矢量。 | 16 |
doublen | 由n 个 64 位双精度浮点值组成的矢量。 | 8 |
booln | 由 n 个 8 位无符号整数布尔值组成的向量。 | 64 |
n 为矢量长度 2、3、4、8、16、32 或 64。
例如,"uchar8" 是由 8 个无符号字符组成的矢量;其长度为 8,大小为 64 位。"float4" 是由 4 个浮点元素组成的矢量;其长度为 4,大小为 128 位。
矢量类型与边界对齐,边界等于矢量元素的总大小,最多为 64 位。任何总大小超过 64 位的矢量类型都与 64 位边界对齐(8 字节)。例如,short2 总大小为 32 位,与 4 字节边界对齐。long2 总大小为 128 位,与 8 字节边界对齐。
代码生成工具还提供了表示复数类型矢量的扩展。前缀 'c' 用于指示复数类型名称。每种复数类型的矢量元素都包含一个实部和一个虚部(实部占据存储器的低位地址)。复数矢量类型如下:
类型 | 说明 | 最大元素数 |
---|---|---|
ccharn | 由n 对 8 位有符号整数值组成的矢量。 | 32 |
cshortn | 由n 对 16 位有符号整数值组成的矢量。 | 16 |
cintn | 由n 对 32 位有符号整数值组成的矢量。 | 8 |
clongn | 由n 对 64 位有符号整数值组成的矢量。 | 4 |
cfloatn | 由n 对 32 位浮点值组成的矢量。 | 8 |
cdoublen | 由n 对 64 位浮点值组成的矢量。 | 4 |
n 为矢量长度 1、2、4、8、16 或 32。请注意,64 不是复数矢量类型的有效矢量长度。例如,“cfloat2”是由 2 个浮点值组成的复数矢量。其长度为 2,大小为 128 位。每个“cfloat2”矢量元素都包含一个实部和一个虚部。
矢量无法传递到 variadic 函数 (stdarg.h),也无法传递到 printf()。
有关与矢量数据类型搭配使用的运算符和内置函数的信息,请参阅 节 5.14。