網路城邦
上一篇 回創作列表 下一篇  字體:
N核心CPU的運算速度就是快N倍嗎?做個實驗給你看!
2023/05/26 04:16:46瀏覽1463|回應0|推薦4

現在的電腦早就都有多核心多處理器了!意思是說:獨立的工作可以做平行運算,同時處理很多事情!很像原本只有一個理髮座的家庭理髮廳,多請了幾個師傅,也加了幾個理髮座位;或是餐廳裡的桌數、廚師和廚房設備都增加了!當然就可以提高效率同時多做一些工作,也多賺一些錢了!

我是一個教電腦程式設計的資深教授,當我決定自行創業當老闆做辨識軟體時,當然不會笨笨的只會靠著寫程式的技藝討生活!我當然也會盡量善用大環境提供的所有資源,讓我的事業發展取得優勢!影像辨識需要大量計算,多核心多處理器電腦的出現當然是一大利多!所以我很早就利用平行運算讓我的軟體加速了

比較專業的人士應該都聽過「先進」的CNN等運算需要用到很多GPU?其實就是因為CNN的運算需求比我用的OCR技術還要大很多倍!對他們來說連多核心處理器的CPU都不夠用的!很像富家子弟甚麼技術知識都不懂,只能靠老爸的錢去投資賺錢!錢不夠時當然就只會跟老爸要更多錢囉!我沒這麼耍賴的!善用多核心的CPU就已經可以讓我稱霸台灣的車牌辨識市場了!

我的百萬畫素影像辨識車牌的軟體核心,最厲害也大約需要一兩百個毫秒才能辨識一次,但是我對外宣稱我一秒鐘可以辨識動態影像中的車牌十幾二十次?關鍵就是平行運算了!簡單的理論概念是8核心的CPU就可以同時辨識8張影像,整體辨識速度就是快八倍了!不是嗎?200毫秒辨識一張影像,單一執行緒就是每秒辨識5張了!乘個8倍不就是40張,每秒可以40次了?

我玩多執行緒平行運算很多年了!我知道多核心電腦確實是可以快好多倍,但實際上是絕對不會真的到CPU核心數的倍數那麼多的!大約還不到一半的啦!原因為何?這是作業系統專家的研究議題,我也不是很清楚!我呢?重要的是:知道這個使用方式的範圍與極限,最妥善的使用在發揮我開發的軟體效能上面!

但我不是有高薪讓國家養的頂大教授,我只是個軟體公司的小老闆,必須忙著出貨賣東西才能活!所以多年來一直不是很清楚,多核心的處理方式「折價率」到底是多少?沒時間好好做實驗嘛!這幾天剛好在研發辨識核心,也為了省時間,用平行運算在驗證辨識率!乾脆就設計一個刻意控制使用平行運算數的實驗,看看我的CPU16處理器的電腦在不同指定的平行運算數目下的效能如何?下面就是實驗結果了,第一欄是執行緒數量與處理器數量,第二欄是個案平均辨識時間(毫秒),第三欄是1611張影像辨識完成的總時間(分:秒)

我的電腦是號稱有16個處理器的 i9-9900!理論上就是可以同時做16張影像的車牌辨識。但是現實上,我的電腦作業系統會同時做很多其他不同的事情,我寫的程式也管不到作業系統的!譬如它就是決定在我跑車牌辨識程式時,同時更新處理甚麼作業系統的程式?或是下載甚麼視訊的緩衝資料?我就無法完全佔用所有的CPU資源了!

況且CPU只是整個電腦的部分資源,它只負責數值計算的工作,譬如記憶體還是整個電腦共用的!影像辨識的過程還是需要大量使用記憶體的!所以不會像八個廚師各自在自己的獨立廚房炒菜,而是八個廚師在同一個廚房做菜!所以即使你的程式說了要「平行運算」它們還是無法完全獨立運作完成的!換言之,一個廚師自由使用一整個廚房的資源做菜當然很快,要和八個廚師共用一個廚房工作呢?就會慢得多了!即使有八個灶台,通常也只會有一兩個冰箱嘛!

所以當你指定要做多執行緒平行運算時,實際效能有多高?還是必須實驗之後才知道的!如上圖所示,很明顯的,指定越少的平行運算執行緒數目,它們就越能獨佔電腦資源,個別辨識的平均時間就越少!但是總共時間因為你沒有充分使用所有的處理器,所以時間是變長的

具體來說,只用單一執行緒的1/16設定需要五分14秒完成所有運算,16/16則只需要一分11秒,如果你故意讓電腦超載,設定高於處理器數目的執行緒,因為作業系統會自動分配時間做計算,不會當掉的!只是整體效益,就是總共計算時間不會變得比較快而已!

對我來說,這個實驗就明確解答了我的很多問題了!我知道分出越多執行緒平行運算之後,每一個單一執行緒的辨識速度會慢好多倍!當1/16時是180.3毫秒,16/16就會慢到662.6毫秒,大約是慢了3.67倍之多!但是整體完成辨識的時間(5:141:11)卻是減少大約四五倍的!

有了這個實驗的量化數據,我就可以明確知道該怎麼設計多執行緒平行運算的軟體了!也可以掌握預期的效率品質了!我一方面希望從取得影像到獲得辨識結果的即時反應時間越短越好,16/16662.6表示需要0.6秒,是有點慢了!如果希望它們反應更快一些,就可以降低執行緒數目,譬如降到8/16就只需要0.38秒,3/16就只需要0.2秒了!

如果即時反應時間沒那麼重要,整體的辨識流量比較重要,那就要找到如上實驗中整體辨識時間最少的設定值了!當然就是如16/16CPU滿檔辨識設定了!我的車載車牌辨識軟體,就是需要極快極大的總辨識量,所以當然是選擇滿檔最好!

反之,如果是在停車場呢?車速不快影像變化不大,但是客戶會希望快速反應,我的軟體最好能快點看清車牌打開柵欄時,我就不應該讓平行運算滿檔的!0.2秒的反應速度與0.6秒,人是有感的!為了讓使用者有最佳體驗,我的辨識演算法也做得到,當然就應該降低執行緒的數目了!

這個實驗結果很好玩也很有用,不是嗎?我是有老師魂的研發廠商,我不會藏私的!事實就是這樣的!如果你需要使用多執行緒的平行運算,必須知道這些事實!如果你用的演算法太爛,譬如使用MLDLCNN的話,再多核心的CPU也救不了你!搞到必須使用GPU?那我就幫不上忙了!去找富爸爸買有很多額外GPU的超級電腦吧!

( 心情隨筆工作職場 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=yccsonar&aid=179250379