Operator Library: Memory
该算子通过一组基准点实现对查找表的近似,因此得名 KneeLUT。算子输出上所有可表示值的范围被 Knee LUT 分为由基准点定义的 N 个区间。区间数量 N 可以表示为 2 的幂次方,即 N = 2^n,其中 n 是整数。参数 BasePointPows 定义了 n。所有区间的区间距离是恒定且相等的。
有关 operator 延迟的信息,请参见 Table 46, 'Individual Latencies of the Operators in Library Memory'。
每个区间由一个起始基准点和一个结束基准点来描述。起始基准点定义了第 1 个区间步长的输出值。结束基准点定义了区间终点的理论值(该终点不可达,等于下一个区间的起始基准点)。区间内的所有值均通过线性近似计算。连续区间的结束基准点和起始基准点具有相同的 X 坐标,即它们之间没有区间步长。
KneeLUT 中每个区间的基准点值可以单独定义。可以在整个输出范围内定义不连续函数。然而,每个区间内部的子函数是线性的,其梯度/斜率由起始和结束基准点定义。所有起始基准点都属于该区间。所有结束基准点均不属于该区间,且线性近似永远无法到达这些点。
所有基准点均归一化至算子输出端最大可表示的值,即
。所有起始基准点均在 0 到 1 的范围内。零对应于输出端最小可表示的值。在此版本的 KneeLut 中,由于算子仅支持无符号值,因此它等于 0。1 表示算子输出端最大可表示的值,即
。所有结束基准点都可以超出 0 到 1 的范围,以允许包含在区间内的最后一个值映射到最高和最低数字,即 0 和 1。这意味着结束基准点可能大于 1 或小于 0。使用与起始基准点相同的 Scaling 技术,终点必须缩放到
.
让我们通过两个示例来说明该算子的行为。
-
恒等
KneeLUT 的第一个函数是恒等函数。假设我们的 KneeLUT 具有以下参数:
- BasePointPows = 2
- Input Bit Width = 4
- Output Bit Width = 5
因此,我们必须定义四个起始基准点和四个结束基准点。对于恒等函数,我们定义:


这些值由以下公式决定:

其中 x 是基准点索引。
下图显示了这些基准点。起始基准点用红色正方形标记,结束基准点用品红色圆形标记。此外,绘制了一条线来说明各区间的线性函数。

该图还显示了输出的近似值(蓝色星号)。基准点经过了归一化处理,即 0 表示输出值 0,1 表示输出值
。下图显示了基于给定基准点实际使用的查找表。可以看出,这些值四舍五入到了最接近的整数值。

查找表将计算以下值:

-
不连续函数
在下一个示例中,我们来看看一个不连续函数。假设采用与第一个示例相同的 KneeLUT 参数。这一次,基准点不是由函数定义的:


同样,下图显示了这些基准点。起始基准点用红色正方形标记,结束基准点用品红色圆形标记。此外,绘制了一条线来说明各区间的线性函数。

该图还显示了输出的近似值(蓝色星号)。同样,该图已归一化至 1。
下图显示了基于给定基准点实际使用的查找表。可以看出,这些值四舍五入到了最接近的整数值。

查找表将根据给定的基准点计算以下值:

可以利用每个区间的斜率 m(x) 和偏移量 b(x) 来计算这些值。


随后,结果 LUT(x) 为

![]() |
超出范围的近似值 |
|---|---|
|
如果近似值超出了可用的输出范围,算子不会将其截断至最大或最小可能值。 这些值将是未定义的。 |
算子限制
-
存在以下约束:

| Link Parameter | Input Link I | Output Link O |
|---|---|---|
| Bit Width | [1, 64] | [1, 60] |
| Arithmetic | unsigned | as I |
| Parallelism | any | as I |
| Kernel Columns | 1 | as I |
| Kernel Rows | 1 | as I |
| Img Protocol | {VALT_IMAGE2D, VALT_LINE1D, VALT_PIXEL0D} | as I |
| Color Format | VAF_GRAY | as I |
| Color Flavor | FL_NONE | as I |
| Max. Img Width | any | as I |
| Max. Img Height | any | as I |
| BasePointPows | |
|---|---|
| 键入 | static 参数 |
| 默认 | 6 |
| 范围 | [1, 60 - InputBitWidth + OutputBitWidth] |
|
此参数根据以下公式定义 KneeLUT 的基点数量: NumberOfBasePoints = 2 ^ BasePointsPows。 步长为 Parallelism。 |
|
| StartBasePoints | |
|---|---|
| 键入 | 动态/静态读/写参数 |
| 默认 | 恒等函数 |
| 范围 | any |
|
此字段参数定义了一组归一化的 2^BasePointPows 区间起始基点。 这些点已归一化至算子输出端可表示的最大值。 了解如何配置字段参数,请参见 'Parameter Editing'。 |
|
| EndBasePoints | |
|---|---|
| 键入 | 动态/静态读/写参数 |
| 默认 | 恒等函数 |
| 范围 | any |
|
此参数定义了一组归一化的 2^BasePointPows 区间结束基点。 这些点已归一化至算子输出端可表示的最大值。 归一化值可以超出 0 到 1 的范围,以允许最后一个区间点分别达到最大和最小可表示值。 |
|
以下示例展示了 KneeLUT 算子的使用方法:
-
示例 - 展示了针对 16 位输入和输出数据查找表的使用。 由于块 RAM 资源有限,针对 16 位数据必须使用 Knee LUT。

![[警告]](../common/images/admon/warning.png)
上一页

