[英]How to write an optimized code when you have a range of values in a LUT and the values are determined during run-time in 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 更快。
如果val1
、 val2
和val3
值很少更新,您可以在更新時(慢)填充 LUT,然后使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.