Re: [討論] 如何更有效率?
※ 引述《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
09/08 07:04, 1F
推
09/08 07:07, , 2F
09/08 07:07, 2F
改完之後快0.03秒...
※ 編輯: celestialgod 來自: 218.164.166.108 (09/08 07:31)
→
09/10 21:47, , 3F
09/10 21:47, 3F
討論串 (同標題文章)