Re: [問題] 使用thread提升效率的問題

看板C_and_CPP (C/C++)作者 (zrae)時間13年前 (2012/12/06 20:57), 編輯推噓0(0014)
留言14則, 4人參與, 最新討論串2/2 (看更多)
在各位大大的提點下 小弟將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

12/06 21:42, , 1F
你是問為什比較快是嘛?
12/06 21:42, 1F

12/07 03:10, , 2F
這裡的9個thread是不停的交換執行,也就是說
12/07 03:10, 2F

12/07 03:10, , 3F
有時候是thread[m]在執行,有時候是thread[n]。
12/07 03:10, 3F

12/07 03:13, , 4F
你在這裡用了9個function,每個裡面有2個迴圈
12/07 03:13, 4F

12/07 03:14, , 5F
2層迴圈才對。這樣可以說是9個巢狀迴圈同時交換在跑
12/07 03:14, 5F

12/07 03:15, , 6F
原本的寫法卻只要一個雙層迴圈,一次跑完。
12/07 03:15, 6F

12/07 03:18, , 7F
首先thread也是要花費額外的資源的,然後9個迴圈
12/07 03:18, 7F

12/07 03:19, , 8F
一次做一件事,不一定會比一個迴圈一次做3件事還快
12/07 03:19, 8F

12/07 03:21, , 9F
這要看迴圈裡的內容而定。最後有一個很重要的事
12/07 03:21, 9F

12/07 03:22, , 10F
你的9個function裡面的最後3個,好像有參考前6個function
12/07 03:22, 10F

12/07 03:22, , 11F
的執行結果,如果後3個function都被系統決定要先做
12/07 03:22, 11F

12/07 03:23, , 12F
那你就會出現讀到錯誤或未完成資料的問題了
12/07 03:23, 12F

12/07 11:04, , 13F
計時的起訖點可能要注意一下。
12/07 11:04, 13F
※ 編輯: keke0421 來自: 114.37.180.68 (12/07 23:42)

12/08 01:09, , 14F
謝謝各位大大的指點!!
12/08 01:09, 14F
文章代碼(AID): #1Gm9OZ69 (C_and_CPP)
文章代碼(AID): #1Gm9OZ69 (C_and_CPP)