作者celestialgod (攸蓝)
看板MATLAB
标题Re: [讨论] 如何更有效率?
时间Sun Sep 8 06:53:52 2013
※ 引述《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
1F:推 sunev:i 回圈摆内侧可能会好一点。 09/08 07:04
2F:推 sunev:而且 j<colNum可以改成 j<=i ,这样连if也可以省掉 09/08 07:07
改完之後快0.03秒...
※ 编辑: celestialgod 来自: 218.164.166.108 (09/08 07:31)
3F:→ mp19990920:我说的是纯mex非加上cuda(我的笔电不能玩cuda) 09/10 21:47