[問題] 請教如何增加這段 code 之 cache hit ?

看板C_and_CPP作者 (卡卡獸)時間12年前 (2013/04/29 12:22), 編輯推噓5(5016)
留言21則, 11人參與, 最新討論串1/2 (看更多)
for( i = 0 ; i < h ; ++i){ for(j = 0 ; j < w ; ++j) { dst[j][h - i] = src[i * w+ j]; } } 上面這段 code 是用在影像處理的某點截取, 瓶頸效能出在這裡,但想半天想不到有什麼妙招可避開, 不知各位版友先進是否能指點一二? 另這種 code 開 thread 下去划算嗎? 小弟先行感激,謝謝各位。 --- 補充 --- 補充一下,我在「猜」瓶頸可能是使用了 bcb 裡速度慢的 Componment, 原始碼整理過後大致是這樣 TImage * img; for( i = 0 ; i < h ; ++i){ for(j = 0 ; j < w ; ++j) { img->Canvas->Pixel[j][h-i] = \ (TColor) src[ i * w + j]; } } w * h = 640 * 480 , 裡面 array 不需考慮 o.v 問題 (實際上有考慮過了), 這段跑完超過 1 sec , 非常慢,我做了以下的嚐試 (a) loop 對換 (b) src 改用 pointer 表示 , 做 increment 然後想說換成 img->Canvas->Picture->Bitmap->ScanLine ,但換算卡卡的 Orz 還是這部份最後自己手動搞,再呼叫底層 API 去做是最直接有效的方式? 附上回覆,先謝謝各位耐心看完問題。 -- 已解 -- 問題如 andyjy12 所言, img->Canvas->Pixel[j][h-i] ,主要死在這 member func. 太耗時,最後解法如下 (1) 做一個標準 bmp header + raw_data (可以存成一張 bmp 的記憶體體) (2) 塞到 bcb-vcl-class :: TMemoryStream * stream (3) 再用 img->Picture->Bitmap->LoadFromStream( stream ); 效能差了 50 倍以上。 最後感謝各位的參與討論與意見,謝謝。 -- ~ 這輩子與神手無緣 我只好當神獸了 ~ 卡卡獸 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.213.184

04/29 20:35, , 1F
內外迴圈互換?
04/29 20:35, 1F
這點我忘了說我試過了,抱歉。

04/29 20:36, , 2F
換過了,效用不大, 差異在 1/700 以下
04/29 20:36, 2F

04/29 20:59, , 3F
w、h夠大應該可以叫gpu幫你做
04/29 20:59, 3F

04/29 21:17, , 4F
h - i 跟 i - w 提到 j loop 一開始只做一次?
04/29 21:17, 4F

04/29 21:18, , 5F
*
04/29 21:18, 5F

04/29 21:18, , 6F
有數據範圍嗎?
04/29 21:18, 6F
目前的 dst array 是開 1024 * 768 * 4 大小, 但大概只會考慮 640*480 而已

04/29 21:20, , 7F
不好意思,現在有點忙,我晚點把問題補充清楚,先謝謝各位
04/29 21:20, 7F

04/29 22:04, , 8F
這是個順時針旋轉 90 度 我是想不太到有什麼改進空間就是
04/29 22:04, 8F
嗯, 若真如此, 可能只能先做前測動作, 單純資料搬移是不是會花那麼多時間...

04/29 23:42, , 9F
不知道 matrix multiplication 的 block algorithm 有沒有用?
04/29 23:42, 9F
這個小弟本身之前研究了, 但助益似乎不大, google "[C語言數值分析] 矩陣乘法 < cache block >" , 是我所知道的東西, 卡在 loop 怎麼換, 一定會有一方 cache hit 高, 事先先做 transpose 這方法還沒先試就是了。

04/30 00:17, , 10F
矩陣乘法的話 不知道可不可以用lapack blas...?
04/30 00:17, 10F

04/30 00:20, , 11F
matrix mult. 加速方法有很多沒錯,只是本文重點只有資料的
04/30 00:20, 11F

04/30 00:21, , 12F
搬移. 應還用不到 library ???
04/30 00:21, 12F

04/30 00:27, , 13F
想問一下為什麼640*480會需要跑一秒阿@@
04/30 00:27, 13F

04/30 13:26, , 14F
卡死在 gui ??
04/30 13:26, 14F

04/30 18:05, , 15F
img->Canvas->Pixel 效率不好 至少先改掉吧
04/30 18:05, 15F

04/30 20:24, , 16F
我猜轉型他做了一堆事,"[][]"可能也被overload?
04/30 20:24, 16F

04/30 20:26, , 17F
先謝謝各位,這問題最後解掉了,原因真的是 componment
04/30 20:26, 17F

04/30 20:26, , 18F
效率不好,晚些發註解,謝謝。
04/30 20:26, 18F

05/01 07:15, , 19F
用微塊的方法解 就是一次做4x4這種大小
05/01 07:15, 19F

05/01 07:16, , 20F
也就是寫成四層回圈 最內兩個是4x4(也可試8x8)
05/01 07:16, 20F

05/01 07:16, , 21F
然後這樣微塊大小選的恰當 可以快個70趴以上吧...
05/01 07:16, 21F
※ 編輯: EdisonX 來自: 114.37.184.86 (05/01 14:39)
文章代碼(AID): #1HVcO7tV (C_and_CPP)
文章代碼(AID): #1HVcO7tV (C_and_CPP)