第七節 關於優化,線性彙編和彙編(未完待續)

2021-06-08 12:04:03 字數 1465 閱讀 7774

優化是乙個值得討論的話題,要最大程度利用快取,並且合理使用線性彙編,若你有信心比編譯器優化的

好,也可以嘗試彙編。

有些人可能一直搞不清楚,自己的演算法究竟要優化到何種程度才算完結。要用什麼樣的方式去優化。當你

的優化取得一定成績時,你一定非常開心,但是,問題來了,是否應該繼續。。。,我曾經也為這些問題困擾著。

化。要達到這樣的境界,必須對cpu指令的執**況、待訪問資料的分布位置、有哪些彙編指令可以在專案中

使用、如何在程式的可讀性與優化的適用性之間達到平衡這四個方面有著清晰的認識。在你遇到困難時,你

不能說:大概就這樣吧,這樣就可以了。這樣的想法,只會扼殺你的學習慾望。

我分幾個方面闡述要學習的知識點。基本包括:dsp不同的指令型別的執行規律,讓待訪問資料處於合適

的位置,(通過彙編或線性彙編)讓dsp滿流水線工作,等等。

首先從暫存器談起,因為cpu所有的運算都在和暫存器打交道,理想情況下,如果cpu所需要的資料都在暫存器中,

那麼速度無疑是最佳的。dsp有ab兩組暫存器,每組32個。請看下圖

圖1-1 :兩組暫存器示意圖

dsp包含了4種型別的指令。每種型別的指令執行的時間是不一樣的,具體請看下圖:

圖2.1:不同型別的幾種指令所占用的執行時間。

上圖的意思是:每種指令的總執行時間是delay時間和latency時間之和,所以乘法指令是2個週期,load類指令是5週期,

跳轉branch類指令是6週期。其他指令是1週期。

上述load類指令所花費的5週期是建立在資料在l1儲存器的基礎上,如果資料在l2或者在更遙遠的ddr2,那肯

定不止5個週期。      

毫無疑問,除了load類指令是需要和儲存器打交道以外,乘法類指令和單週期類的指令都是和暫存器打交道。

所以優化的思路包括下面幾個層次:一是暫存器級別,盡量增加資料在暫存器中的有效時間,讀進來乙個資料之後,

盡量「充分」運算。二是一級快取或者一級儲存器級別,減少資料載入到暫存器所耗費的時間。

對應的思想很簡單:盡量讓資料處於離cpu「最近」的位置,比如在l1上分配資料空間,通過edma結合桌球緩

存區把資料從ddr2「搬運」到l1(edma會在另一節中單獨講)。合理設計演算法及線性彙編,讓資料在暫存器中充

分參與運算。盡量按照「線性方式」操縱資料。簡單總結為:當cpu需要資料的時候,資料就在暫存器上。

其次說下彙編。許多人談起彙編會覺得頭大,這個很正常,比起c**,彙編要一步一步設計好cpu運算指

令,保證暫存器資料不衝突,這個的確很難。ti給出了乙個解決方法,就是用線性彙編,可以達到近似彙編的效

率,又有著和c語音一樣的簡潔。

舉例:(未完待續。。。)

第七節 指標

go語言有指標這一概念。直接上 func pointtest 定義int型別的值a,並且賦值為3 定義int型別指標變數p,並且取a的位址賦值給p 輸出a和p 控制台 3 0xc00000a0a8 3 process finished with exit code 0 a的值為3,p為a在記憶體中的...

第七節 覆蓋虛介面

有時候我們需要表達一種抽象的東西,它是一些東西的概括,但我們又不能真正的看到它成為乙個實體在我們眼前出現,為此物件導向的程式語言便有了抽象類的概念。c 作為乙個物件導向的語言,必然也會引入抽象類這一概念。介面和抽象類使您可以建立元件互動的定義。通過介面,可以指定元件必須實現的方法,但不實際指定如何實...

第七節 結構體

1,下面程式是執行結果是?include include struct stu void fun struct stu p intmain1 fun students 1 system pause return0 2,喝汽水,1瓶汽水1元,2個空瓶可以換一瓶汽水,給20元,可以多少汽水 程式設計實現...