采用硬件加速發(fā)揮MicroBlaze處理能力
案例2:高速浮點(diǎn)性能
本文引用地址:http://2s4d.com/article/106702.htm現(xiàn)在我們給出另一個(gè) MicroBlaze算法加速示例。一個(gè)客戶聲稱他的浮點(diǎn)處理在MicroBlaze系統(tǒng)上運(yùn)行非常慢。他使用的算法可采用簡單的環(huán)路同時(shí)得出幾個(gè)結(jié)果。
for (i=0;i<512;i++) {
f_sum += farr[i];
f_sum_prod += farr[i] * farr[i];
f_sum_tprod += farr[i] *
farr[i] * farr[i];
f_sqrt + =
sqrt(farr[i]);
if (min_f > farr[i]) { min_f =
farr[i]; }
if (max_f < farr[i]) { max_f =
farr[i]; }
}
所有數(shù)值均是單精度浮點(diǎn)值。我們首先想到的是最基礎(chǔ)的一個(gè)問題:浮點(diǎn)單元 (FPU) 激活了嗎?檢查項(xiàng)目設(shè)置后,我們發(fā)現(xiàn)FPU仍然處于未啟用狀態(tài)。這就是為什么永遠(yuǎn)無法計(jì)算出這幾個(gè)數(shù)的原因。FPU可在 MicroBlaze屬性設(shè)置中加以激活。
FPU支持共有兩種。我們也選擇擴(kuò)展FPU (Extended FPU)來支持求平方根運(yùn)算。現(xiàn)在,在50MHz 的MicroBlaze上需要 1,108,685個(gè)周期才能完成 512個(gè)值的全部循環(huán)。查看生成的匯編程序代碼后,可以了解到創(chuàng)建平方根是仍然在使用數(shù)學(xué)庫(Math-lib)功能。其在數(shù)學(xué)功能中的定義為:
double sqrt(double);
不過客戶使用平方根函數(shù)僅為處理浮點(diǎn)數(shù)值。因此,MicroBlaze FPU定義了一個(gè)新的函數(shù)來取代原來的函數(shù),解決這個(gè)問題:
float sqrtf(float);
把表達(dá)式f_sqrt += sqrt(farr[i])變?yōu)閒_sqrt += sqrtf(farr[i]),就會(huì)調(diào)用MicroBlaze內(nèi)部的FPU內(nèi)部平方根功能?,F(xiàn)在執(zhí)行代碼只需要35,336個(gè)周期。特別是與第一個(gè)根本沒有使用FPU的方案相比,我們?cè)俅瓮ㄟ^小小的調(diào)整就實(shí)現(xiàn)了31倍的提升。在相同的執(zhí)行時(shí)間內(nèi),可能需要大約1.5GHz的CPU才能給出上述這些結(jié)果。
評(píng)論