ZHCUAQ1G June 2015 – August 2025
C6000 C/C++ 编译器支持在 C/C++ 源文件中使用 TI 向量数据类型、复数数据类型和复数向量数据类型。
向量数据类型:向量数据类型与数组类似,因为矢量包含特定数量的指定类型元素。但矢量长度只能为 2、3、4、8 或 16。作用在矢量上的内在函数会在可能的情况下进行优化,以便在器件上利用高效的单指令多数据 (SIMD) 指令。
这些类型很有用,因为其可以对处理内核中的自然向量宽度加以利用。矢量数据类型可直接利用该架构上可用的 SIMD 指令,矢量数据类型还提供了从矢量数据对象的抽象模型到寄存器中该数据对象的物理表示的更直接映射。
您可以使用 --vectypes 编译器选项来支持矢量数据类型。
C6000 编程模型支持的所有矢量数据类型和相关的内置函数都安装在 C6000 CGT 的“包含”子目录下的“c6x_vec.h”头文件中。任何使用矢量数据类型或任何相关内置函数的 C/C++ 源文件必须在源文件中包含以下内容:
#include <c6x_vec.h>矢量类型名称连接元素类型名称和表示矢量长度的数字。生成的矢量包含规定数量的指定类型元素。
C6000 向量数据类型和运算的实现严格遵循 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 字节边界对齐。
#define long2 longlong2 或 #define long2 int2,具体取决于要使用的元素类型和大小。复数数据类型:C/C++ 编译器支持存储复数值的类型。每种复数类型都包含一个实分量和一个虚分量。实部占用存储器中的较低地址。两个分量类型相同。例如,cfloat 具有浮点类型的实分量和浮点类型的虚分量。复数类型与等于其分量类型对齐的边界对齐。
前缀“c”用于指示复数类型名称。
每个复数类型有两个关键字,一个带有双下划线前缀(例如 __cint),另一个没有(例如 cint)。带有双下划线前缀的关键字始终可用,即使在严格 ANSI 模式 (--strict_ansi) 下也是如此。默认情况下,不带双下划线前缀的关键字不可用,但可以使用 --vectypes=on 编译器选项来启用。下面的表格和本用户指南中的示例假定 --vectypes=on。
支持下述复数数据类型。不支持复数无符号类型。
| 类型 | 说明 |
|---|---|
| cchar | 一对 8 位有符号整数值。 |
| cshort | 一对 16 位有符号整数值。 |
| cint | 一对 32 位有符号整数值。 |
| clonglong | 一对 64 位有符号整数值。 |
| cfloat | 一对 32 位浮点值。 |
| cdouble | 一对 64 位浮点值。 |
请注意类型名称(例如 cchar 和 cchar2)之间的区别。如果复数类型的名称后跟数字,则为指定长度的复数向量。
对复数类型的有效运算包括:加法、减法、乘法、除法、求反、递增、递减、等效比较。复数类型的算术运算符合复数的常用算术规则。增量和减量运算符仅影响实分量。
复数类型不允许执行以下运算:关系比较(<、>)、模数 (%)、按位运算 (& | ~)、逻辑运算 (&& ||)。
复数向量数据类型:C/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”矢量元素都包含一个实部和一个虚部。
此外,带有双下划线前缀的类型名称(例如 __cchar2 和 __cint8)作为复数向量类型的别名提供。
有关与矢量数据类型搭配使用的运算符和内置函数的信息,请参阅 节 7.15。