Re: [問題] 多執行緒反而變慢~
※ 引述《kight (山中雜草一隻鹿)》之銘言:
: 最近自己用MFC寫了一個FloodFill演算法要做影像處理..
: 但是由於圖檔太大處裡的時間會過久..所以打算利用四核的電腦
: 將圖片切割成4個執行緒去處理...
: 但是當我切成4塊去處裡時卻反而比只有一個執行緒在跑時還慢..
: 我並沒有去Lock住任何的變數...但一直找不出問題的所在...
: 在跑4個執行緒時.4個核心的使用量都不到一半..CPU的使用率也都只有25%左右....
: 可以請教是那裡出了問題嗎???
: 以下是我的FloodFill程式碼:
: http://codepad.org/yBXdAHv4
: http://pastie.org/4243546
搞了好久...終於找出問題的所在...
所以就來自問自答.....
會造成使用多執行緒反而變慢的原因...在於使用了"queue"的原因..
我在效能測試視窗中發現使用多執行緒時...queue一直呼叫Lockit..
但是只有單一執行緒時並沒有去呼叫~~所以我很納悶.
我的queue是放在函式中做區域變數..照理說當多執行緒去執行同一函式時,
函式的變數應該彼此是不相干的,後來我複製相同的函式但是給不同的函式名稱
讓4個執行緒個別跑這些函式...結果效能測試視窗依然顯示queue去呼叫Lockit
之後我把queue改成使用陣列替代...多執行緒的效能就出來了.4顆核心都飆到100%
時間也縮短了快4倍..
目前查到queue會鎖住執行緒的原因是:
為了使queue在多執行緒下是屬於Thread-Safe,每個執行緒在呼叫queue
的成員函式時都會鎖住queue...有錯請指正~~
不知道除了使用陣列代替外...還有沒有更好的解決方法....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.243.144.172
※ 編輯: kight 來自: 111.243.144.172 (07/14 10:15)
推
07/14 13:47, , 1F
07/14 13:47, 1F
推
07/14 16:57, , 2F
07/14 16:57, 2F
→
07/14 16:57, , 3F
07/14 16:57, 3F
→
07/14 17:04, , 4F
07/14 17:04, 4F
在queue中..會呼叫的函式是_Lockit _Lock(_LOCK_DEBUG);
推
07/14 17:31, , 5F
07/14 17:31, 5F
→
07/14 17:31, , 6F
07/14 17:31, 6F
→
07/14 21:40, , 7F
07/14 21:40, 7F
→
07/14 23:07, , 8F
07/14 23:07, 8F
其實我自己也在想,為何我隨便亂寫的queue去做多執行緒測試時,
並沒有發生queue去lock執行緒的問題...
但是自己寫的FloodFill,queue就一直去呼叫Lockit
到底是什麼問題 ...目前不知道..XD
※ 編輯: kight 來自: 101.14.80.209 (07/15 00:24)
→
07/15 23:29, , 9F
07/15 23:29, 9F
→
07/15 23:51, , 10F
07/15 23:51, 10F
→
07/15 23:54, , 11F
07/15 23:54, 11F
→
07/15 23:55, , 12F
07/15 23:55, 12F
推
07/16 00:02, , 13F
07/16 00:02, 13F
→
07/16 00:07, , 14F
07/16 00:07, 14F
推
07/16 01:55, , 15F
07/16 01:55, 15F
→
07/16 01:56, , 16F
07/16 01:56, 16F
→
07/16 03:29, , 17F
07/16 03:29, 17F
→
07/16 03:37, , 18F
07/16 03:37, 18F
→
07/16 20:52, , 19F
07/16 20:52, 19F
→
07/17 12:35, , 20F
07/17 12:35, 20F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章