当LUT中有一系列值并且这些值是在C中运行时确定的时,如何编写优化的代码



我需要实现一个LUT,如下所示:

|   Range            | Value   |
|--------------------|---------|
| var < val1         | Invalid |
| -------------------| --------|
| val1 < var <= val2 | M = 0   |
|--------------------|---------|
| val2 < var <= val3 | M = 2   |
|--------------------|---------|
| val3 < var <= val4 | M = 4   |
|--------------------|---------|

val1、val2、val3和val4在运行时配置,var的值在稍后的时间点在另一个线程中配置,也就是我需要计算M的值的时候。此外,如果val1=val2(或者任何行中的两个值相同(,那么该行将变为无效(M不能具有该值(。val4可以是最大值25。我的问题是,我如何以乐观的方式实现这一点?为了使代码发挥作用,我写了一个经典的if.elseif.elseif语句,但我知道有一种更乐观的方式来写它。当val1、val2等被配置时,我尝试计算一个由25个元素组成的数组,并在var被配置后加载数组(基于var进行索引(,但不知何故,在分析之后,性能似乎变得更差了。有人能帮我找到一种更优化的写作方式吗?

LUT在基准测试中很好,但在实践中并不总是那么好,因为在充满LUT的大型应用程序中可能会出现缓存未命中。如果由于分支预测,所采取的分支通常相同,则if-then-else语句可能非常快。除了这两种方法,您还可以使用无分支代码。当输入数据很难预测并且条件不太昂贵时,这种方法是好的。在您的情况下,您可以使用以下表达式:

/* This branch should almost always be taken and so 
it should be well predicted by the processor */
if(var > val1) 
{
/* Branch-less evaluation */
M = (var > val2) + (var > val3);
M = M + M;
}
else
{
/* Error management */
}

在现代(超标量(处理器上,这应该只有几个周期。关于目标体系结构和工作负载,它可能并不总是比简单的LUT快。

如果val1val2val3值很少更新,则可以在更新时(慢速(填充LUT,然后使用它。

相关内容

最新更新