簡體   English   中英

當 LUT 中有一系列值並且在 C 中的運行時確定值時,如何編寫優化代碼

[英]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 更快。

如果val1val2val3值很少更新,您可以在更新時(慢)填充 LUT,然后使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM