看板 C_and_CPP 關於我們 聯絡資訊
使用BCB C++&CUDA 影像處理在CUDA完成然後RGB回傳 for (i=0 ; i<h*w ; i++){ colR=colRR[i]; //colRR[i]為cuda部分回傳R colG=colGG[i]; colB=colBB[i]; Emp->Canvas->Pixels[i%400][i/400]=(TColor)RGB(colR,colG,colB); } ※ 引述《sky391 (sky)》之銘言: : 目前做影像處理, : 把一張圖處理完後是存成指標(RGB共三個) : 然後利用迴圈填回變成圖, : 目前400x300 size , : 迴圈跑了12萬次拖了很多速度, : 不知版上高手,有沒有好意見, : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.53.61 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1413334976.A.E55.html
sky391: 這影像處理是一直持續做,讀圖->影像處理->填圖 10/15 09:14
johnpage: Emp->Canvas->Pixels[i%400][i/400]=(TColor)RGB(colR,c 10/15 11:19
johnpage: olG,colB); 這段導致緩慢 10/15 11:19
johnpage: 可用double buffer方法改善 10/15 11:21
johnpage: 如果用組合語言,可以把%改用AND,/改用SHIFT 10/15 11:23
Feis: 試著橫向填圖, 並看看有沒有比較低階的方法填 10/15 11:44
hichcock: BCB 沒有貼整張圖的指令嗎?? 10/15 11:46
sky391: BCB不確定有沒有直貼整張的 10/15 11:52
dirkc: 0/400有些怪;賦值的過程記憶體一直跳,可能是慢的主因 10/15 13:00
sky391: 我用i = 1開始也沒有改變 10/15 14:20
loveflames: 重點不是i=0或i=1 10/15 14:29
sky391: 已經是分成RGB三個,還有辦法一次抓記憶體嗎? 10/15 14:37
loveflames: 合在一起比較好,這樣資料局部性比較高,cache miss 10/15 14:49
loveflames: 的延遲比較低。另外就是切幾個thread,利用cache miss 10/15 14:50
loveflames: 時跑其他thread(如果你的CPU支援hyperthreading的話) 10/15 14:50
loveflames: 不知道RGB函數裡做了些什麼,也許可以用SIMD/FMA指令 10/15 14:53
johnpage: 記憶體部分沒有問題 10/15 15:11
johnpage: 問題在顯示的部分 10/15 15:12
loveflames: i/400確實也是問題,記憶體不連續產生write miss 10/15 15:24
EdisonX: 這問題之前解過, #1HVcO7tV , 效能差 50 倍以上. 10/15 21:33
EdisonX: 原文後段已有解法 , 照著解效能應可有明顯提升. 10/15 21:37
dirkc: 阿我的意思就是[][]那裡記憶體一直跳,不是零或一,感謝澄清 10/18 14:45
bluesoul: 把乘法,除法,取餘數拿掉,用別的方法代替 10/18 22:23
sky391: 謝謝大家的幫忙 問題已解決 10/23 10:02
sky391: 感謝E大的方法 最後效能從做一次8Xms提升到一次4Xms 10/23 10:44