針對演算法為什麼要從軟體實現改做成IC
前面回文推文的大大已經有提到軟體速度不夠和成本太高等問題
這些問題的根源是因為要實現一套演算法
以下四個參數之間是需要彼此取捨的
1. 面積
2. 功耗
3. 速度
4. 演算法可事後改動的程度
當你希望某些參數表現變好,就要犧牲其他參數的表現
當你選擇將演算法跑在CPU上時,
隱含的意義是你希望演算法可事後改動的程度表現很好。
這樣做會犧牲另外三點的表現。
這三點之間也是可以互相取捨的。
前面幾位大大提到的速度不夠,
指的是在不犧牲面積和功耗的情況下速度不夠。
若願意犧牲面積或功耗,
你也可以超頻(犧牲功耗),
或一次用超多顆CPU平行跑(假設這演算法可平行化程度很高)來增加速度。
類似dasala大大的回文中
"除非你處理器非常強大,也有大量的RAM,但這不合成本"
犧牲演算法可事後改動的程度來換取面積功耗速度的好處,
意思是讓硬體配合演算法的特性做最佳化。
一個簡單的例子是直接看CPU上你的演算法用到哪些硬體,
把沒用到的部分都拔掉,你就得到一個面積跟功耗較小,
又可以做一樣演算法的硬體。
但這時候這顆CPU可能就無法有效實現其他的演算法。
實際上IC對於"演算法可事後改動的程度"會犧牲得很徹底,
盡量換取另外三個參數上的好表現。
平行處理是常見的最佳化作法
前面有推文提到硬體是平行,軟體是sequential
講精確一點的話其實軟體並不是不能平行處理,
例如藉由OpenMP,就可將軟體程式碼跑在多核上。
但重點是CPU上能作的平行處理,並不是配合你的演算法作的。
假設一顆CPU最多可以平行作64個加法,
但你的演算法算到某一步有65個彼此不相干的加法,
軟體實現還是無法一次算完這65個加法,達到最有效率的平行化。
如果作IC,就可以讓這65個加法一次算完。