FAE講堂:如何加快處理器的正弦計算
本文引用地址:http://www.ex-cimer.com/article/119301.htm
圖 2 — d 值的正弦與余弦表,范圍介于0到360/16度之間
實際上, 我們在每個表格中都使用了1 , 0 2 4 個值。X的最小值為360/1024=0.3515625 度。d 的所有值都將小于等于該值。該方法可以減少存儲的占用,因為完整的查找表需要 4,096個條目(每條目 4 個字節(jié))。
使用這種方案,我們能夠?qū)崿F(xiàn)的自變量總體精度為:
360/(1024*1024) = 0,000343 degree
而且這個精度非常好。計算充分利用了MicroBlaze FPU。
真正的計算會占用一些時鐘周期,具體來說,需要進(jìn)行兩次fmul運(yùn)算和一次fadd運(yùn)算。不過,我們還需要進(jìn)行一些其它計算。首先,我們必須把自變量 xi拆分成兩個值,對應(yīng)x和d;然后,我們將這兩個值從表格中讀出;最后,我們必須使用新的算法才能計算結(jié)果。
我們在軟件中實現(xiàn)算法并對其進(jìn)行測試時,我們耗用的時鐘周期總數(shù)為6,520個。
為了進(jìn)一步提高分辨率,我們可以使用下列的象限關(guān)系:
第一象限
sin(x) = sin(x)
第二象限
sin(x) = sin(π - x)
第三象限
sin(x) = -sin(π + x)
第四象限:
sin(x) = -sin(2* π - x)
這在保持表格大小不變的同時還可將總體分辨率提高4倍。另一方面,我們需要進(jìn)行更多的計算才能找出我們必須進(jìn)行計算的象限是哪一個。仍然需要改進(jìn)算法或縮小表格的大小(縮小四分之幾)。我們還沒有進(jìn)行到這一步。
步驟三:優(yōu)化算法
由于我們的解決方案到目前為止,速度還不能滿足我們客戶的需要,因而我們需要稍做算法優(yōu)化,不過仍然完全采用運(yùn)行在 MicroBlaze 處理器上的軟件。這是一種簡單的優(yōu)化方案,不過會降低部分精度。因此,我們創(chuàng)建了軟件模型(在PC上運(yùn)行以提升運(yùn)行速度)以運(yùn)行所有可能的值,同時使用 sin()計算出的原始雙精度值與使用我們的軟件算法計算出的正弦值進(jìn)行比較。我們決定在標(biāo)準(zhǔn)的PC上運(yùn)行算法,因為在MicroBlaze上進(jìn)行比較和計算需要花較長的時間(注意,我們的MicroBlaze運(yùn)行速度遠(yuǎn)低于PC)。
現(xiàn)在我們開始優(yōu)化計算以獲得正弦值:
sin(x+d) = sin(x)*cos(d) +cos(x)*sin(d)
由于在每個表格中我們都使用了1,024個值,這意味著d始終小于360度/1,024個步進(jìn),即:
cos(2* π /1024) = 0.99998
而且該值約等于1.0。對較小的d值,適用下列等式:
cos(d) = ~1.0
這樣可以將我們的公式簡化為如下等式:
sin(x+d) = sin(x) + cos(x)*sin(d)
在我們在MicroBlaze上實現(xiàn)新等式之前,我們使用PC模式對新等式的精度進(jìn)行了檢驗,發(fā)現(xiàn)最大誤差仍然低于我們客戶的目標(biāo)。
現(xiàn)在我們將該算法當(dāng)作軟件算法在MicroBlaze上實現(xiàn),仍然使用每張帶有1,024個條目的表。新的算法只需要三個表,比之前的實現(xiàn)方案少一個。這樣既節(jié)省了存儲空間,也為更多的計算留出了時間。
我們在我們的硬件上測量了算法。一次正弦計算需要6,180個周期。
步驟四:進(jìn)一步優(yōu)化
另一種看似可行的優(yōu)化方式是轉(zhuǎn)換正弦計算的浮點值,并在此使用整數(shù)自變量。我們使用的算法使我們能夠創(chuàng)建~1E6 個不同的值 (1,024*1,024)。整數(shù)自變量足以處理這個數(shù)量的值。
這種優(yōu)化方式使我們能夠使用簡單得多的計算來將 xi 值拆分為 x 和 d。拆分只是一種簡單的“與”運(yùn)算加上部分10 位的移位。我們參數(shù)角的上10位是xi,下10位是 d。
我們再次在PC上創(chuàng)建了一個軟件模型,并對其進(jìn)行檢驗,然后在MicroBlaze處理器系統(tǒng)上實現(xiàn)模型,這需要5,460個周期才能完成一次正弦計算。
步驟五:考慮硬件實現(xiàn)
雖然與數(shù)學(xué)庫的原始計算相比,算法的速度有了明顯的改善,但客戶需要的是速度快得多的實現(xiàn)。不過前文所述的最后一步給我們提供了一種能夠輕松轉(zhuǎn)向硬件實現(xiàn)的方法。
這種實現(xiàn)方法需要某些用于拆分 xi值的運(yùn)算。要在硬件中做到這一點,只需將所需的位進(jìn)行連接即可。然后我們需要三個表;我們使用以我們的PC模型計算出的預(yù)定義值推導(dǎo)出ROM,然后將其轉(zhuǎn)入IP的VHDL代碼中。該IP能夠一次讀取所有三個表,從而能夠再度節(jié)省時間。最后,我們需要進(jìn)行一次浮點MUL和一次浮點ADD運(yùn)算。
對于該任務(wù),我們發(fā)現(xiàn)用于浮點運(yùn)算的CORE GeneratorTM模塊非常適合。
圖 3 — 無流水線功能的加速器 IP
評論