ZHCUAU3J January 2018 – March 2024
标志状态寄存器 (FSR) 包含表示浮点状态的位,可以使用 __get_FSR(type)
API(在 c7x.h
中定义)来访问。该 API 采用 type 参数,后者是指会与浮点运算一同使用的有效标量或矢量浮点类型(“float3”除外)。
对于所有相关矢量通道,该 API 会返回“OR”形式的数据位。结果是一个包含以下字段的 8 位值:
例如:
float4 a = ... ;
float4 b = ... ;
float4 c = a * b;
uint8_t fsr_val = __get_FSR(float4);
提供 __get_FSR(type)
API 是
为了方便访问 FSR。实际硬件寄存器是一个 64 位的值,分为八个 8 位块。每个 8 位块对应于输入或输出数据中的 64 位数据矢量切片,具体取决于正在执行的操作。一个 64 位切片可能由一个 64 位双精度值或两个 32 位浮点值组成,这些值由硬件进行“OR”运算。
但是,对于矢量运算,虽然对每个 64 位切片都执行此“OR”运算,但硬件不会对所有 64 位切片的结果进行“OR”运算。这样做的原因是当使用部分矢量(小于 512 位)时,矢量的上部通道被视为无效并被忽略,因此不应反映在最终的 FSR 结果中。为确保仅反映与有效矢量通道相关的信息,API 允许用户指定他们正在处理的数据的标量或矢量类型。然后,API 将确保只有有效的 64 位矢量切片通过一系列指令进行“OR”运算,以产生最终的 8 位结果。因此,所有无效通道都会被忽略。
使用 __get_FSR(type)
API 会导致性能降低。这是因为,该 API 会插入一系列指令以确保只有有效的矢量通道会反映在最终结果中。该 API 还可防止在使用它的整个函数中进行循环矢量化,因为矢量化会以用户无法跟踪的方式更改有效矢量通道的数量。