看板 C_and_CPP 關於我們 聯絡資訊
大家好 目前用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
linotwo:改過的版本 work_x_sobel 跟 work_y_sobel 各多做了兩次 11/26 17:40
keke0421:為什麼會多做兩次?我不是放thread進去嗎= = 11/26 18:07
keke0421:x_sobel放三個thread, y_sobel放三個 11/26 18:08
linotwo:以 work_x_sobel 來說,你新開了三個執行緒, 11/26 18:10
linotwo:每個執行緒都會完整地跑完 work_x_sobel 11/26 18:11
diabloevagto:開thread也是要時間的,multi thread不是神 11/26 18:16
wirelessr:thread的使用時機是會有運算和IO互等 這樣才有效率 11/26 19:25
wirelessr:如果純運算的話 用multi-process會更有效率 11/26 19:26
wirelessr:因為multi-thread會有同步和共享資源的問題 11/26 19:26
EntHeEnd:"thread的使用時機是會有運算和IO互等" 請問可以進一步解 11/26 20:52
EntHeEnd:釋嗎?@@ 11/26 20:53
keke0421:我的本意是用三個thread去跑for迴圈耶= =怎麼會是做三次 11/26 21:58
ah7675:你是不是沒學過OS? 很多觀念怪怪的 11/26 23:17
Ebergies:... 你知道 thread 是在做啥嗎... @@? 11/26 23:44
akasan:看來你直接去 google openmp 會比較方便一些 11/27 00:15
yoco315:真可愛... 11/27 01:57
keke0421:哪裡可愛=.= 11/27 02:11
keke0421:我到底錯在哪~"~ 11/27 02:11
linotwo:你原本想要做的是讓三個執行緒去分擔工作,而你現在的寫法 11/27 03:39
linotwo:卻會讓三個執行緒各自去完成一份完整的工作。 11/27 03:40
linotwo:所以我想你該做的是先把同一份工作分割成三個獨立部分, 11/27 03:42
linotwo:再把各個獨立的部分分給不同的執行緒去做。 11/27 03:42
※ 編輯: keke0421 來自: 114.37.180.68 (12/07 23:43)