| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> c/c++ >> 在C/C++算法設計中使用任意位寬
 

在C/C++算法設計中使用任意位寬

2008-06-01 02:08:49  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  開發定點(fixed-point)算法時,通常需要在設計功能性、數字精度建模、及驗證(仿真)速度之間取得一個平衡。現在,一種新的數據類可使此過程簡單化,由此得到更簡單精確的建模精度、更好的數字求精、及更快的驗證周期,而ANSI C/C++正是開發這種數字求精算法的最佳語言。

  某此算法天生就適用于操作整數,或那些理想中的實數(如數字濾波器的系數),它們也可能會使用浮點或定點類型。一般而言,在算法開發的早期階段,會經常用到C語言的float或double浮點類型,因爲它們可提供一個非常大的動態數據範圍,且對大多數程序來說都是適用的。見圖1:

在C/C++算法設計中使用任意位寬


  使用C內置的float類型來建模一個FIR濾波器

  算法可進行數字求精,以便使用定點算術來降低最終硬件或軟件實現的複雜性。在硬件方面,將整數或定點算術限制爲最小位寬,可在本質上滿足性能、空間、能耗的需要;假如實現中用到了DSP處理器,那麽把算法限制爲整數或定點算術,就可爲特定程序使用盡可能便宜的處理器。

  定點算術的建模可通過C語言內置的浮點或整數類型來完成,這做的話,需要顯式編碼並受限于C中浮點數及整數可表示的最大數:64位整數或53位尾數;這些都會給操作數的位寬帶來更多的限制,例如,2個33位的數相乘,會超過64位C整數可表示的範圍。圖2演示了一個FIR濾波器的例子,但temp變量限制爲15位的定點精度,其中10位用于整數位。在這個實現中,LSB的右部位被舍棄(量化模型的截斷),而MSB的左部位也被舍棄(包裝的溢出模型),應該意識到,使用float(或double)的模型在精度上是受限的,且不能再次合成(synthesis)。同樣,由于有取整模型的嚴格位精度定義有先,又由于內置浮點類型的取整將會先被應用,所以對除法這樣的操作來說,就非常難實現了。

在C/C++算法設計中使用任意位寬


  使用float建模定點行爲

  當許多算法都能依靠本地C數據類型的精度來編寫時,對支持任意長度的整數及定點算法,大家就會抱有極大的期望,而硬件描述語言(HDL)如VHDL,走的也是同一條路。隨著C/C++越來越多地被用于高級合成與驗證工具(High-Level Synthesis and Verification tools),也證實了這種語言本質上有一個足以滿足當前及未來程序需要的數據類型庫。任意長度類型的支持,也可使數據類型的行爲有一個統一的定義,而統一的語義則避免了人工實現上的一些限制。

  算法C數據類型

  算法C數據類型是一種基于類的C++庫,其實現了任意長度的整數及定點類型,而這些可自由訪問的類型有一系列好處,包括統一及良好定義的語義,還有媲美C/C++內置數據類型的運行時速度,對比SystemC中相應的類型,其運行速度也超過10倍以上。這些數據類型能用于任何符合C++或SystemC規範標准的程序中,並擁有高度可合成的語義。

  語義

  語義的統一性與一致性是避免在算法中,發生功能性錯誤的要害,以下的例子,也說明了這點:

在C/C++算法設計中使用任意位寬


  衆所周知,變量ActLength的範圍爲1至255,萬一編譯器的合成不知道其範圍,就不能進行相應的優化,它的聲明就會從int變爲更嚴格的sc_uint<8>類型;雖然合成會得到更好的結果,但設計就仿真得不正確了。在經過一番調試之後,找到了問題的源頭:在比較表達式k >= ActLength中,兩個操作數變成了一個signed int與一個unsigned long long(爲64位無符號整數,其是sc_uint類型的基類型)之間的比較。對此的解釋是:C/C++整數提升規則指定了在進行比較之前,會把操作數int提升爲一個unsigned long long,例如,假如k的值爲 -1,在提升爲unsigned long long之後,它會變成2^64 – 1。

  像這樣語義中的問題一般會非常難以察覺,且是與位寬相關的,例如,可能有人想擴大某個現有算法的位寬,只有看到結果時,才知道是行不通的;這個問題也可能是與特定平台相關的,例如,對1 << 32(兩個操作數都是int類型,結果也是int類型)大家期望返回0,但在大多數平台(或編譯器)上,它都會返回1(沒有移位,只因爲第二個操作數較低的五位被計算進來了);當第一個操作數是一個64位整數時,平台依靠性會表現得更加明顯及頻繁。主要的問題是C/C++標准沒有指定在32位整數情況下移位值(第二個操作數)超出0至31範圍、或在64位整數情況下移位值超出0至63範圍時的行爲。不幸的是,像sc_int、sc_uint這樣的數據類型也不能爲用戶避免這類平台依靠性的問題。

  算法C數據類型被設計用于提供統一且一致的語義,因此,它們是可猜測的,例如,對有符號數混用一個無符號操作數仍會産生期望的結果;這些類型的長度不受限制,所以就不存在所謂的精度問題。所有的操作——包括移位和除法——都有完整且一致性的定義,混合不同的類型也能得到期望的結果,如,當x爲一個C內置類型,而y是一個算法C類型時,表達式x+y和y+x均能返回相同的結果。

  運行時間

  我們的目的是爲了在支持任意長度類型及避免用戶碰到前述語義問題的前提下,得到使用內置類型(位寬不超過64位)手工C/C++編碼優化過的運行時間。算法C類型是爲快速執行及易于合成的語義而設計及實現的,所有操作的位寬由C++編譯器靜態確定,這就避免了動態內存分配,減少了運行時間,也使得語義更加易于合成。另外,實現也爲速度進行了優化,因此可能會調用更多的專用及高效代碼,充分利用了當今編譯器的優化特性。

在C/C++算法設計中使用任意位寬


  表1:規格化爲ac_fixed的運行時間比較

  表1是當定點算術用算法C定點類型ac_fixed來建模時,各種不同的運行時比較;float的實現在圖2中,sc_fixed_fast爲SystemC中精度受限的定點數據類型,sc_fixed爲任意精度的定點類型。實際中對FIR濾波器進行10^8次調用,TRN/WRAP的運行時間爲6.5秒,RND/SAT爲29秒。其他類型的運行時間也能從這張表中依次推出,如sc_fixed TRN/WRAP將花費6.5s × 227 = 1476s(將近25分鍾)。作爲參考,圖1中的算法(使用無定點建模的float)花費時間爲3.5s(比起使用定點建模的ac_fixed,慢了近兩倍)。

  上述的運行時間數據,均由GCC 4.1.1測量得來,而在之前版本的GCC或Visual C++ 2005中得到的數據大致接近。

  另外,運行時間也能通過整型數據類型或位操作進一步縮短。表2爲一個DCT算法的相應結果,它由一個每次讀寫2位的移位操作得來,與此對比的運行時間爲SystemC精度受限的sc_int與任意長度的sc_bigint。

在C/C++算法設計中使用任意位寬


  表2:規格化爲ac_int的運行時間比較

  結論

  基于通用標准ANSI C++,這種新的整數與定點算法C類型答應算法及系統設計者指定任意位寬,從而提供比傳統數據類型高200倍的仿真效率。這些新數據類型可成爲C-to-RTL設計鏈中非常有價值的一環,及在整個實現流程中保證了任意位寬的精度。
 
 
 
上一篇《C/C++筆試、面試題目大彙總》
下一篇《C語言庫函數 (B類字母)》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
  開發定點(fixed-point)算法時,通常需要在設計功能性、數字精度建模、及驗證(仿真)速度之間取得一個平衡。現在,一種新的數據類可使此過程簡單化,由此得到更簡單精確的建模精度、更好的數字求精、及更快的驗證周期,而ANSI C/C++正是開發這種數字求精算法的最佳語言。   某此算法天生就適用于操作整數,或那些理想中的實數(如數字濾波器的系數),它們也可能會使用浮點或定點類型。一般而言,在算法開發的早期階段,會經常用到C語言的float或double浮點類型,因爲它們可提供一個非常大的動態數據範圍,且對大多數程序來說都是適用的。見圖1:   [url=/bbs/detail_1785429.html][img]http://image.wangchao.net.cn/it/1323423394823.jpg[/img][/url]   使用C內置的float類型來建模一個FIR濾波器   算法可進行數字求精,以便使用定點算術來降低最終硬件或軟件實現的複雜性。在硬件方面,將整數或定點算術限制爲最小位寬,可在本質上滿足性能、空間、能耗的需要;假如實現中用到了DSP處理器,那麽把算法限制爲整數或定點算術,就可爲特定程序使用盡可能便宜的處理器。   定點算術的建模可通過C語言內置的浮點或整數類型來完成,這做的話,需要顯式編碼並受限于C中浮點數及整數可表示的最大數:64位整數或53位尾數;這些都會給操作數的位寬帶來更多的限制,例如,2個33位的數相乘,會超過64位C整數可表示的範圍。圖2演示了一個FIR濾波器的例子,但temp變量限制爲15位的定點精度,其中10位用于整數位。在這個實現中,LSB的右部位被舍棄(量化模型的截斷),而MSB的左部位也被舍棄(包裝的溢出模型),應該意識到,使用float(或double)的模型在精度上是受限的,且不能再次合成(synthesis)。同樣,由于有取整模型的嚴格位精度定義有先,又由于內置浮點類型的取整將會先被應用,所以對除法這樣的操作來說,就非常難實現了。 [url=/bbs/detail_1785429.html][img]http://image.wangchao.net.cn/it/1323423410028.jpg[/img][/url]   使用float建模定點行爲   當許多算法都能依靠本地C數據類型的精度來編寫時,對支持任意長度的整數及定點算法,大家就會抱有極大的期望,而硬件描述語言(HDL)如VHDL,走的也是同一條路。隨著C/C++越來越多地被用于高級合成與驗證工具(High-Level Synthesis and Verification tools),也證實了這種語言本質上有一個足以滿足當前及未來程序需要的數據類型庫。任意長度類型的支持,也可使數據類型的行爲有一個統一的定義,而統一的語義則避免了人工實現上的一些限制。   算法C數據類型   算法C數據類型是一種基于類的C++庫,其實現了任意長度的整數及定點類型,而這些可自由訪問的類型有一系列好處,包括統一及良好定義的語義,還有媲美C/C++內置數據類型的運行時速度,對比SystemC中相應的類型,其運行速度也超過10倍以上。這些數據類型能用于任何符合C++或SystemC規範標准的程序中,並擁有高度可合成的語義。   語義   語義的統一性與一致性是避免在算法中,發生功能性錯誤的要害,以下的例子,也說明了這點: [url=/bbs/detail_1785429.html][img]http://image.wangchao.net.cn/it/1323423410226.gif[/img][/url]   衆所周知,變量ActLength的範圍爲1至255,萬一編譯器的合成不知道其範圍,就不能進行相應的優化,它的聲明就會從int變爲更嚴格的sc_uint<8>類型;雖然合成會得到更好的結果,但設計就仿真得不正確了。在經過一番調試之後,找到了問題的源頭:在比較表達式k >= ActLength中,兩個操作數變成了一個signed int與一個unsigned long long(爲64位無符號整數,其是sc_uint類型的基類型)之間的比較。對此的解釋是:C/C++整數提升規則指定了在進行比較之前,會把操作數int提升爲一個unsigned long long,例如,假如k的值爲 -1,在提升爲unsigned long long之後,它會變成2^64 – 1。   像這樣語義中的問題一般會非常難以察覺,且是與位寬相關的,例如,可能有人想擴大某個現有算法的位寬,只有看到結果時,才知道是行不通的;這個問題也可能是與特定平台相關的,例如,對1 << 32(兩個操作數都是int類型,結果也是int類型)大家期望返回0,但在大多數平台(或編譯器)上,它都會返回1(沒有移位,只因爲第二個操作數較低的五位被計算進來了);當第一個操作數是一個64位整數時,平台依靠性會表現得更加明顯及頻繁。主要的問題是C/C++標准沒有指定在32位整數情況下移位值(第二個操作數)超出0至31範圍、或在64位整數情況下移位值超出0至63範圍時的行爲。不幸的是,像sc_int、sc_uint這樣的數據類型也不能爲用戶避免這類平台依靠性的問題。   算法C數據類型被設計用于提供統一且一致的語義,因此,它們是可猜測的,例如,對有符號數混用一個無符號操作數仍會産生期望的結果;這些類型的長度不受限制,所以就不存在所謂的精度問題。所有的操作——包括移位和除法——都有完整且一致性的定義,混合不同的類型也能得到期望的結果,如,當x爲一個C內置類型,而y是一個算法C類型時,表達式x+y和y+x均能返回相同的結果。   運行時間   我們的目的是爲了在支持任意長度類型及避免用戶碰到前述語義問題的前提下,得到使用內置類型(位寬不超過64位)手工C/C++編碼優化過的運行時間。算法C類型是爲快速執行及易于合成的語義而設計及實現的,所有操作的位寬由C++編譯器靜態確定,這就避免了動態內存分配,減少了運行時間,也使得語義更加易于合成。另外,實現也爲速度進行了優化,因此可能會調用更多的專用及高效代碼,充分利用了當今編譯器的優化特性。 [url=/bbs/detail_1785429.html][img]http://image.wangchao.net.cn/it/1323423410262.gif[/img][/url]   表1:規格化爲ac_fixed的運行時間比較   表1是當定點算術用算法C定點類型ac_fixed來建模時,各種不同的運行時比較;float的實現在圖2中,sc_fixed_fast爲SystemC中精度受限的定點數據類型,sc_fixed爲任意精度的定點類型。實際中對FIR濾波器進行10^8次調用,TRN/WRAP的運行時間爲6.5秒,RND/SAT爲29秒。其他類型的運行時間也能從這張表中依次推出,如sc_fixed TRN/WRAP將花費6.5s × 227 = 1476s(將近25分鍾)。作爲參考,圖1中的算法(使用無定點建模的float)花費時間爲3.5s(比起使用定點建模的ac_fixed,慢了近兩倍)。   上述的運行時間數據,均由GCC 4.1.1測量得來,而在之前版本的GCC或Visual C++ 2005中得到的數據大致接近。   另外,運行時間也能通過整型數據類型或位操作進一步縮短。表2爲一個DCT算法的相應結果,它由一個每次讀寫2位的移位操作得來,與此對比的運行時間爲SystemC精度受限的sc_int與任意長度的sc_bigint。   [url=/bbs/detail_1785429.html][img]http://image.wangchao.net.cn/it/1323423410291.gif[/img][/url]   表2:規格化爲ac_int的運行時間比較   結論   基于通用標准ANSI C++,這種新的整數與定點算法C類型答應算法及系統設計者指定任意位寬,從而提供比傳統數據類型高200倍的仿真效率。這些新數據類型可成爲C-to-RTL設計鏈中非常有價值的一環,及在整個實現流程中保證了任意位寬的精度。
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
陽光靓麗的模特兒(8)
陽光靓麗的模特兒(7)
陽光靓麗的模特兒(6)
陽光靓麗的模特兒(5)
秋-印象
德慶盤龍峽 一
松江印象之三
雲之南(寬幅)
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有