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

看板MATLAB作者 (攸藍)時間12年前 (2013/09/08 06:53), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串3/5 (看更多)
※ 引述《mp19990920 (郝渴連)》之銘言: : 法一:去除你原本code中多餘的運算 : (1)numel多餘 : (2)i=i+1多餘(但影響極小) : (3)沒必要重設整個column : X = [1:n]'; : Y = eye(n); : for i = 2:n : Y(i:n, i) = i:n; : end : p.s. 在我的電腦中n=1000跑1000次平均時間 : 原本: 0.06610 sec : 加速: 0.02339 sec : 你的電腦可真快呢!!! : 法二:用mex來改寫 : 難度高,debug麻煩,不太建議 我嘗試去寫了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]; } } } *******mat_exd.cu******** __global__ void kernel ( const double *vec, const int *N, double *mat ) { int tid = threadIdx.x + blockIdx.x * blockDim.x; while (tid % *N < *N & tid / *N < *N){ if (tid % *N - tid / *N>=0) mat[tid]=vec[tid % *N - tid / *N]; tid += blockDim.x * gridDim.x; } } ******main.m************ %% original N = 10000; X = 1:N; Y = eye(N); for i = 1:N Y(i:N, i) = X(1:(N-i+1)); end %% mex part % compile mat_exd.cpp by mex mat_exd.cpp Y2=mat_exd(X); %% CUDA part reset(gpuDevice()); N = 10000; X = 1:N; kern = parallel.gpu.CUDAKernel('mat_exd_2.ptx', 'mat_exd_2.cu'); tic kern.ThreadBlockSize = 1024; kern.GridSize = ceil(N/1024); o = feval(kern, X, N, zeros(N)); Y3 = gather(o); toc **********Result********** original part: 0.216 secs mex part: 0.610 secs CUDA part: 0.284 secs 我沒有看到m大說的mex比較快QQ.... 請問我是哪裏寫得不好嗎.... PS 1: 後來測試一下不同的N下,mex的速度有差,N<1500時,mex的速度都快很多 N超過1500以後,就越來越慢了...我覺得應該是兩層迴圈的關係,可是那裏我不會改... PS 2: CUDA有記憶體限制。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.164.166.108

09/08 07:04, , 1F
i 迴圈擺內側可能會好一點。
09/08 07:04, 1F

09/08 07:07, , 2F
而且 j<colNum可以改成 j<=i ,這樣連if也可以省掉
09/08 07:07, 2F
改完之後快0.03秒... ※ 編輯: celestialgod 來自: 218.164.166.108 (09/08 07:31)

09/10 21:47, , 3F
我說的是純mex非加上cuda(我的筆電不能玩cuda)
09/10 21:47, 3F
文章代碼(AID): #1IAww3G7 (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1IAww3G7 (MATLAB)