日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > FAE講堂:如何加快處理器的正弦計算

          FAE講堂:如何加快處理器的正弦計算

          作者: 時間:2011-05-06 來源:電子產(chǎn)品世界 收藏

            有很多種算法可對單精度浮點數(shù)字的正弦值進行計算,但添加硬件加速器是功能最為強大的方法之一。之所以得出這一結(jié)論,是因為客戶的應(yīng)用要求使用此類正弦計算,而我們又針對能夠提供良好、快速且高效的解決方案進行了多種方案的探索。

          本文引用地址:http://yuyingmama.com.cn/article/119301.htm

            為了確定哪種實現(xiàn)方式最適合您的應(yīng)用,首先需要對代碼進行分析,以查找哪種功能需要改進;其次,由于修改軟件比修改硬件更簡便、迅速,因而請檢查是否能通過修改軟件來實現(xiàn)您所需的高速度(有時可以)。但是如果您還需要更高的性能,那么請考慮在硬件中實現(xiàn)部分算法。在硬件加速的支持下,您可以輕松勝過市場上任意微控制器或DSP。

            為了解該流程,讓我們以現(xiàn)實案例為例,探討如何開發(fā)一個需要針對單精度浮點數(shù)字進行正弦計算的軍事應(yīng)用。出于對高性價比的原因考慮,客戶已選擇了一款采用嵌入式 MicroBlaze®的Spartan®-6 FPGA 作為主系統(tǒng)控制器??商幚碚矣嬎愕能浖惴☉?yīng)運行于MicroBlaze 之上。

            客戶的算法主要使用浮點運算。由于算法復(fù)雜,轉(zhuǎn)而采用定點運算并不妥當(dāng)。此外,客戶還希望避免使用定點運算時可能出現(xiàn)的運行過度或運行不足的情況。

            客戶清楚 MicroBlaze IP 可提供兩種類型的浮點單元 (FPU),并已選用擴展版本(相對于基本版而言)來加速算法。但是,這樣做就無法利用作為GNU工具鏈組成部分且隨 EDK 一起交付的數(shù)學(xué)仿真庫。數(shù)學(xué)庫中的軟件仿真例程程序運行速度非常慢,在任何情況下都應(yīng)盡量避免將其用于算法中對性能起到關(guān)鍵作用的部分。

            另外,客戶還清楚 MicroBlaze FPU的兩個版本都只能處理單精度數(shù)據(jù),不能處理雙精度數(shù)據(jù)。客戶的算法可以明確地僅使用浮點精度數(shù)據(jù) (float precision data)。但在開始使用數(shù)學(xué)函數(shù)時,有時也會進行隱式轉(zhuǎn)換。這些轉(zhuǎn)換會強制算法

            在不知不覺中使用雙精度數(shù)據(jù)。

            步驟一:分析問題

            我們的客戶已經(jīng)在運行他的算法,但發(fā)現(xiàn)該算法在MicroBlaze上的運行速度偏慢。在對代碼庫進行特性描述后,客戶發(fā)現(xiàn)引起速度慢的原因是正弦計算。下一步是找出其中原因并分析怎樣做才能加快處理速度。

            第一種方案是使用數(shù)學(xué)庫提供的標(biāo)準(zhǔn)正弦函數(shù),在客戶將算法寫入后,在不進行任何修改的情況下完整地運行它。主要的問題在于數(shù)學(xué)庫函數(shù)僅針對雙精度數(shù)據(jù)而創(chuàng)建,這就意味著正弦函數(shù)的原型應(yīng)為如下所示:

            double sin(double angle);

            但客戶希望以下列方式使用:

            float sin_val;

            float angle;

            ...

            sin_val = sin(angle);

            當(dāng)然,這也是可能的,而且C編譯器會自動從參數(shù)角添加所需的轉(zhuǎn)換,進行“雙精度化”,并將函數(shù)調(diào)用的結(jié)果轉(zhuǎn)回浮點值。這樣通常還是由數(shù)學(xué)庫函數(shù)來執(zhí)行兩個額外的轉(zhuǎn)換函數(shù),甚至是正弦計算。

            切記,MicroBlaze的FPU為單精度版本,只能完成如下執(zhí)行指令:

            sin_val = (float)sin((double)angle);

            由于數(shù)學(xué)庫的正弦函數(shù)是雙精度的,因而FPU無法完成正弦計算,故需要純軟件的解決方案。但缺點在于速度太慢,無法滿足客戶的需求。

            我們驗證了使用雙精度數(shù)據(jù)進行正弦值的計算是執(zhí)行緩慢的原因。首先我們使用下列代碼,從我們的執(zhí)行文件中直接創(chuàng)建匯編代碼:

            mb-objdump.exe -D executable.elf

            >dump.txt

            檢查匯編代碼時,我們發(fā)現(xiàn)了如下代碼行:

            brlid r15,-15832 // 4400d300

            其作用是調(diào)用數(shù)學(xué)庫以進行雙精度正弦計算。然后,我們測量了利用數(shù)學(xué)庫函數(shù)完成單次正弦計算所需的時間,約為 38,700個CPU周期。

            對于特定的任務(wù),可以使用專用單精度函數(shù),如計算平方根:

            float sqrt_f( float h);

            使用專用函數(shù)可以避免單、雙精度函數(shù)之間的轉(zhuǎn)換,而且還可充分利用MicroBlaze FPU。

            但遺憾的是,在FPU上沒有用于處理正弦計算的專用函數(shù)。此時,我們開始開發(fā)多個版本的算法來加速正弦值的計算,以實現(xiàn)更高的性能。

            步驟二:創(chuàng)建更好的軟件算法

            創(chuàng)建硬件加速器通常需要一段時間而且也需要進行調(diào)試,因而我們試圖避免在第一次運行中就采取這種方案。我們就性能問題與客戶進行了溝通,獲得了正弦計算的關(guān)鍵參數(shù)。

            客戶的算法要求正弦計算的參數(shù)角應(yīng)具有1%的精度,而且計算出的正弦值精度應(yīng)比數(shù)學(xué)庫函數(shù)調(diào)用的結(jié)果高0.1%。

            這些屬于關(guān)鍵參數(shù),而且客戶告知我們,他有時必須按順序計算多個正弦值(比如在處理之前先填入小表格)。

            由于對表格的尺寸要求, 使用填充了所有數(shù)值的查找表顯然不太可能。條目的最小數(shù)量為360,000個浮點數(shù)值(每個值 4 個字節(jié))。客戶想找到高速解決方案,但在大小上也應(yīng)該合適。我們建議的解決方案可使用下列等式:

            sin(xi) with xi = x + d

            得到:

            sin(x+d) = sin(x)*cos(d) +cos(x)*sin(d)

            在這里,d是一個始終小于 x最小可能值(大于0)的值。這種解決方案有什么優(yōu)勢呢?我們需要縮小表格的大小,但會帶來計算量的增加。表格從開始就劃分為四個表格:

            cos(x)

            sin(x)

            cos(d)

            sin(d)

            圖1和圖2顯示了所有4個表格所需的分辨率以及這些值通常情況下的表現(xiàn)。這些表格僅顯示了16個值的條目,用于說明需要填入我們的查找表中的值。我們在我們最終的解決方案中所使用的值要多得多。

            

           

            圖 1 — x 值的正弦與余弦表,范圍介于0到360度之間


          上一頁 1 2 3 下一頁

          關(guān)鍵詞: Xilinx 處理器 FAE

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉