提高指令緩存命中率
前面說的是數(shù)據(jù)緩存,現(xiàn)在看看指令緩存命中率該如何提高。
有一個數(shù)組array
,數(shù)組元素內(nèi)容為0-255
之間的隨機數(shù):
int array[N];
for (i = 0; i < TESTN; i++)
array[i] = rand() % 256;
現(xiàn)在,要把數(shù)組中數(shù)字小于128的元素置為0,并且對數(shù)組排序。
大家應(yīng)該都能想到,有兩種方法:
- 先遍歷數(shù)組,把小于128的元素置為0,然 后排序 。
- 先對數(shù)組排序 , 再遍歷數(shù)組 ,把小于128的元素置為0。
for(i = 0; i < N; i++) {
if (array [i] < 128)
array[i] = 0;
}
sort(array, array +N);
先排序后遍歷的速度會比較快,為什么?
因為在for
循環(huán)中會執(zhí)行很多次if
分支判斷語句,而CPU
擁有分支預(yù)測器。
如果分支預(yù)測器可以預(yù)測接下來要執(zhí)行的分支(執(zhí)行if
還是執(zhí)行else
),那么就可以提前把這些指令放到緩存中,CPU執(zhí)行的時候就會很快了。
如果一個數(shù)組的內(nèi)容完全隨機的話,那么分支預(yù)測器就很難進行正確的預(yù)測。但如果數(shù)組內(nèi)容是有序的,它就會根據(jù)歷史命中數(shù)據(jù)的情況對未來進行預(yù)測,那命中率就會很高,所以先排序后遍歷的速度會比較快。
怎么驗證指令緩存命中率的情況呢?
在Linux
下,可以使用Perf
性能分析工具進行驗證。通過-e
選項,指定branch-loads
和branch-loads-misses
事件,可以分別統(tǒng)計出分支預(yù)測成功的次數(shù)和 分支預(yù)測失敗的次數(shù) ,通過L1-icache-load-misses
事件也能統(tǒng)計一級緩存中指令未命中的次數(shù)。但是,這些性能事件都屬于硬件事件,perf
工具能否統(tǒng)計這些事件取決于CPU
是否支持以及芯片原廠是否去實現(xiàn)了該接口,我看很多都是不支持或者沒實現(xiàn)的。
另外,在Linux內(nèi)核中,可以看到大量的likely
和unlikely
宏,并且它們都出現(xiàn)if
語句中,這 兩個宏的作用就是為了提高性能 。
這是顯示預(yù)測概率的宏,如果你覺得CPU的分支預(yù)測不準(zhǔn),但if
中條件為"真"的概率很高,那么你就可以使用likely()
括起來,以此提升性能。
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
if (likely(a == 1)) …
-
Linux
+關(guān)注
關(guān)注
87文章
11350瀏覽量
210460 -
指令
+關(guān)注
關(guān)注
1文章
611瀏覽量
35825 -
緩存
+關(guān)注
關(guān)注
1文章
242瀏覽量
26767 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
26033
發(fā)布評論請先 登錄
相關(guān)推薦
CPU一級緩存與二級緩存深度分析
![CPU一級<b class='flag-5'>緩存</b>與二級<b class='flag-5'>緩存</b>深度分析](https://file.elecfans.com/web1/M00/4F/22/pIYBAFrUEO6AYK-UAANu4oCHslo400.png)
AM335x SDK關(guān)于cache的命中率,請問有能改善cache命中率的有效方法嗎?請問怎么才能控制RAM映射到cache?
緩存命中率低的原因是什么?
緩存的作用和設(shè)計模式
架構(gòu)設(shè)計應(yīng)用級緩存回收策略
一種高能效的結(jié)構(gòu)不對稱指令緩存
![一種高能效的結(jié)構(gòu)不對稱<b class='flag-5'>指令</b><b class='flag-5'>緩存</b>](https://file.elecfans.com/web2/M00/49/62/poYBAGKhwKuAHU6KAAAaKIqBUMM907.jpg)
基于節(jié)點中心性度量的緩存機制
![基于節(jié)點中心性度量的<b class='flag-5'>緩存</b>機制](https://file.elecfans.com/web1/M00/44/FF/pIYBAFpevOqARaiGAABoXHpad5A810.jpg)
基于概率存儲的啟發(fā)式住處中心網(wǎng)絡(luò)內(nèi)容緩存方法
Web代理服務(wù)器緩存優(yōu)化
![Web代理服務(wù)器<b class='flag-5'>緩存</b>優(yōu)化](https://file.elecfans.com/web1/M00/46/72/pIYBAFqd9qqAa43RAAB-_j1SH6o924.jpg)
基于節(jié)點熱度與緩存替換率的ICN協(xié)作緩存
一種基于內(nèi)容優(yōu)先級的緩存替換策略PFC
![一種基于內(nèi)容優(yōu)先級的<b class='flag-5'>緩存</b>替換策略PFC](https://file.elecfans.com/web1/M00/E7/03/pIYBAGBa4V-ANmLlAAJY8_8qJNg074.png)
評論