Re: [問題] RGB填圖

作者: sky391 (sky)   2014-10-15 09:02:54
使用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萬次拖了很多速度,
: 不知版上高手,有沒有好意見,
: 謝謝
作者: sky391 (sky)   2014-10-15 09:14:00
這影像處理是一直持續做,讀圖->影像處理->填圖
作者: johnpage (johnpage)   2014-10-15 11:19:00
Emp->Canvas->Pixels[i%400][i/400]=(TColor)RGB(colR,colG,colB); 這段導致緩慢可用double buffer方法改善如果用組合語言,可以把%改用AND,/改用SHIFT
作者: Feis (永遠睡不著 @@)   2014-10-15 11:44:00
試著橫向填圖, 並看看有沒有比較低階的方法填
作者: hichcock (快樂一整年 ^^~~~)   2014-10-15 11:46:00
BCB 沒有貼整張圖的指令嗎??
作者: sky391 (sky)   2014-10-15 11:52:00
BCB不確定有沒有直貼整張的
作者: dirkc (3781615)   2014-10-15 13:00:00
0/400有些怪;賦值的過程記憶體一直跳,可能是慢的主因
作者: sky391 (sky)   2014-10-15 14:20:00
我用i = 1開始也沒有改變
作者: loveflames (咕啾咕啾魔法陣)   2014-10-15 14:29:00
重點不是i=0或i=1
作者: sky391 (sky)   2014-10-15 14:37:00
已經是分成RGB三個,還有辦法一次抓記憶體嗎?
作者: loveflames (咕啾咕啾魔法陣)   2014-10-15 14:49:00
合在一起比較好,這樣資料局部性比較高,cache miss的延遲比較低。另外就是切幾個thread,利用cache miss時跑其他thread(如果你的CPU支援hyperthreading的話)不知道RGB函數裡做了些什麼,也許可以用SIMD/FMA指令
作者: johnpage (johnpage)   2014-10-15 15:11:00
記憶體部分沒有問題問題在顯示的部分
作者: loveflames (咕啾咕啾魔法陣)   2014-10-15 15:24:00
i/400確實也是問題,記憶體不連續產生write miss
作者: EdisonX (卡卡獸)   2014-10-15 21:33:00
這問題之前解過, #1HVcO7tV , 效能差 50 倍以上.原文後段已有解法 , 照著解效能應可有明顯提升.
作者: dirkc (3781615)   2014-10-18 14:45:00
阿我的意思就是[][]那裡記憶體一直跳,不是零或一,感謝澄清
作者: bluesoul (忙死你老爸)   2014-10-18 22:23:00
把乘法,除法,取餘數拿掉,用別的方法代替
作者: sky391 (sky)   2014-10-23 10:02:00
謝謝大家的幫忙 問題已解決感謝E大的方法 最後效能從做一次8Xms提升到一次4Xms

Links booklink

Contact Us: admin [ a t ] ucptt.com