在armv8中,因爲processor的預取,流水線, 以及多線程並行的執行方式,並且armv8-a中,使用的是一種weakly-ordered memory model,性能優化
不保證program order和execute order一致。多線程
因此有時須要顯式的執行一些指令,來order本身的代碼。架構
armv8涉及到的優化包括:app
1) multiple issue of instructions,超流水線技術,每一個cycle,都會有多個issue和execute,保證不了各個指令的執行order。dom
2) out-of-order execution,不少processor,都會對non-dependent的指令,作out-of-order的執行,性能
3) Speculation,分組預測,在遇到conditional instruction時,判斷condition以前,就會執行以後的instruction。fetch
4) Speculative loads,預取,在執行上一條指令的同時,將下一條指令的數據,預取到cache中。優化
5) Load and Store optimizations,因爲寫主存的latency很大,processor能夠作不少優化,write-merge,write-buffer等。ui
6) External memory systems,某些外部device,像DRAM,能夠同時接受不一樣master的req,Transaction可能會被buffered,reordered。線程
7) Cache coherent multi-core,一個cluster中的各個core,對同一個cache的update,看到的順序不會是一致的。
8) Optimizing compilers,編譯器在編譯時的性能優化,可能打亂program order。
armv8支持的memory types:Normal memory和Device memory
Normal memory,主要指RAM,ROM,FLASH等memory,這類memory,processor以及compiler均可以對program作優化,
processor還能夠增長repeate,reorder,merge的操做。
在須要固定memory order的狀況下,須要顯式調用barrier operations,
還有一些存在address dependence的狀況,processor必須可以正確處理這些狀況。
Device memory,一般都是peripheral對應的memory mapped。對於該memory type,processor的約束會不少;
1) write的次數,processor內部必須與program中的相同;
2) 不能將兩次的writes,reads,等效爲一個;
3) 可是對於不一樣的device之間的memory access是不限制order的;
4) speculative是不容許的,對device的memory;
5) 在device memory中execute,也是不容許的;
Device memory的幾個attribute:
1) Gather或者non-Gather,多個memory access merge爲同一個single transaction,如兩個byte write merge爲一個halfword write
2) Reordering,同一個block中的access是否可以reorder。
3) Early Write Ack,write不寫入device,經過中間buffer以後,即 return ack,是否能夠。
四種device memory:
1) Device nGnRnE,最嚴的約束;
2) Device nGnRE,容許early
3) Device nGRE,容許reorder,early
4) Device GRE,容許gather,reorder,early
Memory attribute,arm系統中,memory都被分爲各個region,每一個region都有本身的privilege level,memory type,cache policy;
這部分的管理是由MMU,來實現的,各個region都對應其中的一個或幾個block、page。
對於normal memory,有shareable和cache property;
對於device memory,老是non-cacheable,outer-shareable,
shareable,用來指定這個location是不是與其餘的core,共用的,share的。share的core之間須要保證coherency。
non-shareable,典型應用在AMP,有本身的獨自cache,
inner,主要指processor本身的cache,在big-little中,表現爲一個cluster,(仍是取決於具體實現)
outer,主要指processor外的cache,在big-little中,表現爲兩個cluster,(仍是取決於具體實現)
system,整個system的master,可能會包含GPU等
ARM架構中,包括幾個barrier instruction,用來force必定的memory order,可是這樣的指令,會減少一些軟件的優化性能;
因此最好在須要的時候,再加這樣的指令。
1) Instruction Synchronization Barrier(ISB),保證當前的pipeline中沒有數據,ISB指令以前的指令都已經執行結束;
多用在context-switching code,cache control等。
2) Data Memory Barrier(DMB),保證全部data access的指令,load,store,在DMB指令以前都已經執行結束。
並不妨礙instruction的fetch。
3) Data Synchronization Barrier(DSB),等待某一類的指令結束,包括data access,instruction fetch。還會等待全部的
由該processor發起的cache,tlb,BP maintenance操做都已經完成,
DSB指令會直接stall processor,DMB不會,instruction仍然是能夠執行的。
DMB和DSB,均可以加params,指定某些domain,load/store,
store-store,load-load,any-any指相應的亂序類型。
one-way barriers,AARCH64提供了一組顯式指定before、after的指令,Load-Acquire,Store-Rlease,
Load-Acquire(LDAR),全部的load,store,完成以後,纔開始執行,LDAR以後的指令開始執行。
Store-Release(STLR),全部的load,store,在STLR執行以後,纔開始執行。