Re: [討論] 如何更有效率?
※ 引述《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
09/08 08:05, 1F
太高級了XDD 我還沒有那種程度@@....我的CUDA目前到shared memory而已.....
另外,感謝大大指點memcpy這個函數@@....這個函數好用太多XD
只是最後一格要注意size問題
→
09/08 17:38, , 2F
09/08 17:38, 2F
→
09/08 17:39, , 3F
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)
討論串 (同標題文章)