看板 C_and_CPP 關於我們 聯絡資訊
在各位大大的提點下 小弟將code修改如下: 原本的code function: void* work_y_sobel() { for(int j=0; j<imgHeight; j++) { for(int i=0; i<imgWidth; i++) { pic_gx[3*(j*imgWidth+i)+MYRED] = gx_sobelFilter(i, j, MYRED) pic_gx[3*(j*imgWidth+i)+MYGREEN] = gx_sobelFilter(i, j, MYGREEN); pic_gx[3*(j*imgWidth+i)+MYBLUE] = gx_sobelFilter(i, j, MYBLUE); } } return NULL; } 將上述的MYRED , MYGREEN , MYBLEU 分別變成一個fun,我只列出一個 void * work_y_sobel_r() { for(int j=0; j<imgHeight; j++) for(int i=0; i<imgWidth; i++) pic_gx[3*(j*imgWidth+i)+MYRED] = gx_sobelFilter(i, j, MYRED) return NULL; } 而我本來有三個for迴圈 每一個for迴圈拆成3個小的fun 所以總共變成9個小fun 其中六個彼此獨立,所以先下去跑,跑完才跑最後三個加總部分 修改完後,的確效率有變比較好 3個thread時: 2秒 //每一個thread 個別跑上面原始未修改的for loop 6個thread時: 1.4秒左右 9個thread時: 1.1~1.2秒左右 但我的問題是 原始版本 也就是沒有thread的情況下 是跑0.8秒 而原始版本是將三個for迴圈 全部寫在main裡面 有點百思不得其解 所以又來請大大們鞭我 給我一點提示>"< 謝謝><" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.168.197
chengcti:你是問為什比較快是嘛? 12/06 21:42
xpride:這裡的9個thread是不停的交換執行,也就是說 12/07 03:10
xpride:有時候是thread[m]在執行,有時候是thread[n]。 12/07 03:10
xpride:你在這裡用了9個function,每個裡面有2個迴圈 12/07 03:13
xpride:2層迴圈才對。這樣可以說是9個巢狀迴圈同時交換在跑 12/07 03:14
xpride:原本的寫法卻只要一個雙層迴圈,一次跑完。 12/07 03:15
xpride:首先thread也是要花費額外的資源的,然後9個迴圈 12/07 03:18
xpride:一次做一件事,不一定會比一個迴圈一次做3件事還快 12/07 03:19
xpride:這要看迴圈裡的內容而定。最後有一個很重要的事 12/07 03:21
xpride:你的9個function裡面的最後3個,好像有參考前6個function 12/07 03:22
xpride:的執行結果,如果後3個function都被系統決定要先做 12/07 03:22
xpride:那你就會出現讀到錯誤或未完成資料的問題了 12/07 03:23
linotwo:計時的起訖點可能要注意一下。 12/07 11:04
※ 編輯: keke0421 來自: 114.37.180.68 (12/07 23:42)
keke0421:謝謝各位大大的指點!! 12/08 01:09