作者celestialgod (攸蓝)
看板MATLAB
标题Re: [讨论] 如何更有效率?
时间Sun Sep 8 07:57:39 2013
※ 引述《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 机器是
[email protected] 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
1F:→ Leon:你 cuda 要切几次把 data feed into GPU 09/08 08:05
太高级了XDD 我还没有那种程度@@....我的CUDA目前到shared memory而已.....
另外,感谢大大指点memcpy这个函数@@....这个函数好用太多XD
只是最後一格要注意size问题
2F:→ iHakka:没有什麽计算的话用cuda不会比较快,且H2D.D2H超浪费时间 09/08 17:38
3F:→ iHakka:另外可以直接传gpuarray.zeros(N)进去看会不会比较快 09/08 17:39
**************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)