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

看板C_and_CPP (C/C++)作者 (zrae)時間13年前 (2012/11/26 17:09), 編輯推噓4(4018)
留言22則, 9人參與, 最新討論串1/2 (看更多)
大家好 目前用thread想要提升code的效率 原始版本如下: for(int i=0;i<width;i++) for(int j=0;i<heigh;j++) { 全域變數r = fun1(); // fun1,fun2,fun3,做某種影像處理的運算 全域變數g = fun2(); // 全域變數分別對應到R,G,B 全域變數b = fun3(); }; 以上的for loop共有三個 前兩個互相獨立 最後一個是需要前兩個的運算做加總 我自己的CPU是 E3-1230v2 共有八個thread ,cache L3是8mb 在沒有使用thread跑時 跑完時間只需要0.18秒左右 可是當我用3個thread下去跑,因為前兩個for是互相獨立,所以我讓前兩個thread 分別去跑,然後利用wait等兩個跑完,才加總 理論上來說 應該會比較快 但是需要秒數卻要0.4~0.5左右 原本想說是不是cache太小 導致context switch次數太多,算了一下 cache大小8mb 而我的變數的大小是unsigned char = 1 byte 所以約可以裝8百萬個1byte的資料 ,而我的圖片大小是1024*768 約786432 因為RGB所以在乘3,所以2359296約240萬,所以cache理論上來說 可以放三個1024*768的unsigned char矩陣 分析完後覺得好像又不是 cache太小導致context switch太多頻繁的問題 於是不信邪,把3個thread增加到6個thread,反而更慢,變到0.89秒左右 現在想不太出來理由到底是什麼= =.. 謝謝各位大大>"< -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.179.17

11/26 17:40, , 1F
改過的版本 work_x_sobel 跟 work_y_sobel 各多做了兩次
11/26 17:40, 1F

11/26 18:07, , 2F
為什麼會多做兩次?我不是放thread進去嗎= =
11/26 18:07, 2F

11/26 18:08, , 3F
x_sobel放三個thread, y_sobel放三個
11/26 18:08, 3F

11/26 18:10, , 4F
以 work_x_sobel 來說,你新開了三個執行緒,
11/26 18:10, 4F

11/26 18:11, , 5F
每個執行緒都會完整地跑完 work_x_sobel
11/26 18:11, 5F

11/26 18:16, , 6F
開thread也是要時間的,multi thread不是神
11/26 18:16, 6F

11/26 19:25, , 7F
thread的使用時機是會有運算和IO互等 這樣才有效率
11/26 19:25, 7F

11/26 19:26, , 8F
如果純運算的話 用multi-process會更有效率
11/26 19:26, 8F

11/26 19:26, , 9F
因為multi-thread會有同步和共享資源的問題
11/26 19:26, 9F

11/26 20:52, , 10F
"thread的使用時機是會有運算和IO互等" 請問可以進一步解
11/26 20:52, 10F

11/26 20:53, , 11F
釋嗎?@@
11/26 20:53, 11F

11/26 21:58, , 12F
我的本意是用三個thread去跑for迴圈耶= =怎麼會是做三次
11/26 21:58, 12F

11/26 23:17, , 13F
你是不是沒學過OS? 很多觀念怪怪的
11/26 23:17, 13F

11/26 23:44, , 14F
... 你知道 thread 是在做啥嗎... @@?
11/26 23:44, 14F

11/27 00:15, , 15F
看來你直接去 google openmp 會比較方便一些
11/27 00:15, 15F

11/27 01:57, , 16F
真可愛...
11/27 01:57, 16F

11/27 02:11, , 17F
哪裡可愛=.=
11/27 02:11, 17F

11/27 02:11, , 18F
我到底錯在哪~"~
11/27 02:11, 18F

11/27 03:39, , 19F
你原本想要做的是讓三個執行緒去分擔工作,而你現在的寫法
11/27 03:39, 19F

11/27 03:40, , 20F
卻會讓三個執行緒各自去完成一份完整的工作。
11/27 03:40, 20F

11/27 03:42, , 21F
所以我想你該做的是先把同一份工作分割成三個獨立部分,
11/27 03:42, 21F

11/27 03:42, , 22F
再把各個獨立的部分分給不同的執行緒去做。
11/27 03:42, 22F
※ 編輯: keke0421 來自: 114.37.180.68 (12/07 23:43)
文章代碼(AID): #1Gip7F8R (C_and_CPP)
文章代碼(AID): #1Gip7F8R (C_and_CPP)