Re: [討論] 如何更有效率?

看板MATLAB作者 (攸藍)時間12年前 (2013/09/08 07:57), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串5/5 (看更多)
※ 引述《Leon (Achilles)》之銘言: : ※ 引述《celestialgod (攸藍)》之銘言: : 這討論串很有意思, 值得回一下. : : 我嘗試去寫了mex跟cuda (最近剛學matlab 拿來當練習) : : *******mat_exd.cpp******* : : #include "mex.h" : : void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) : : { : : int colNum = (int) mxGetN(prhs[0]); : : double *X, *Y; : : X=mxGetPr(prhs[0]); : : plhs[0] = mxCreateDoubleMatrix(colNum, colNum, mxREAL); : : Y = mxGetPr(plhs[0]); : : for (int i=0; i<colNum; i++) : : { : : for (int j=0; j<colNum; j++) : : { : : if(i>=j) : : Y[j*colNum+i]=X[i-j]; : : } : : } : : } : 嗯.. 你會用 memcopy 嗎? : 其實裡面那個迴圈可以改成 memcpy(), 只是 size 要注意一下. 不會,C++才看一點點而已...我晚點可以去google 然後再試試看結果 我學語言的歷程跟別人相反QQ (R -> matlab -> C++ -> CUDA) 其中C++都只看一點點 matlab算是懂基本的function而已 CUDA觀念大部分都有了,只是C/C++還學得太淺 更改如下 ************mat_exd.cpp************** #include <cstring> #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { int colNum = (int) mxGetN(prhs[0]); double *X, *Y; X = mxGetPr(prhs[0]); plhs[0] = mxCreateDoubleMatrix(colNum, colNum, mxREAL); Y = mxGetPr(plhs[0]); int j = 0; for (int i=0; i<colNum; i++) { memcpy(Y+(colNum*i+j), X, (colNum-i)*sizeof(double)); j += 1; } } **************Result****************** original part: 0.216 secs mex part: 0.113 secs => 顯著快非常多!!! CUDA part: 0.284 secs : : **********Result********** : : original part: 0.216 secs : : mex part: 0.610 secs : : CUDA part: 0.284 secs : : 我沒有看到m大說的mex比較快QQ.... : : 請問我是哪裏寫得不好嗎.... : Matlab 是架構在 C/C++ 上面的, 你 mex 比 matlab 慢的話 : 鐵定是哪裡寫得不夠好.... : 另外, 你用甚麼機器? N size 多少? N跑10000 機器是 i7-3770K@4.4G ASUS GTX670 2G and ram 16G OS: windows 7 SP1 matlab: 2013a 我的C/C++ 一定寫不好QQ 我太依賴R跟matlab的向量運算...還不習慣C/C++去寫 : 我很訝異這題目 Cuda 竟然跑得和 Matlab 差不多快, : 因為 Cuda 在 memory move 上面是很慢的.. : 你機器 memory 夠的話, 要不要試試看 N = 20,000 或是 40,000 的 case ? CUDA的話 N=15000就不能跑了...我的VRAM不夠大 : 我很想知道這個結果. Sorry, 我可能要跟我們老師借機器跑了 他才有6G VRAM的電腦 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.164.166.108

09/08 08:05, , 1F
你 cuda 要切幾次把 data feed into GPU
09/08 08:05, 1F
太高級了XDD 我還沒有那種程度@@....我的CUDA目前到shared memory而已..... 另外,感謝大大指點memcpy這個函數@@....這個函數好用太多XD 只是最後一格要注意size問題

09/08 17:38, , 2F
沒有什麼計算的話用cuda不會比較快,且H2D.D2H超浪費時間
09/08 17:38, 2F

09/08 17:39, , 3F
另外可以直接傳gpuarray.zeros(N)進去看會不會比較快
09/08 17:39, 3F
**************Result****************** original part: 0.216 secs mex part: 0.113 secs CUDA part: 0.038 secs => 更快了..... 更動地方 o = feval(kern, X, N, gpuArray.zeros(N)); ※ 編輯: celestialgod 來自: 218.164.166.108 (09/08 17:45)
文章代碼(AID): #1IAxrsFq (MATLAB)
文章代碼(AID): #1IAxrsFq (MATLAB)