matlab调用cuda,window下matlab调用cuda的开发流程

这两天抽点时间研究matlab调用cuda程序的问题,发现网上这方面的资料比较少,而且nvidia提供的白皮书描述的不够详尽,因此对于开发流程进行总结,希望大家有用。

总的来说,matlab中调用cuda程序有两种方法,第一是利用开勇的cuda wizard创建cuda程序的dll,然后结合matlab的mex编译器在matlab中进行调用;第二种是根据白皮书中所写,将cuda程写成标准的mex文件格式,然后利用mex编译器生成二进制代码,在matlab中进行调用。两种方法生成的都是以.mexw32或.mexw64结尾的二进制程序,直接在m文件中使用即可。

1. Matlab白皮书方法

A.  仅仅使用cufft,将cuda代码和C代码函数写在mex标准文件中,则利用下面的编译指令可以完成二进制程序的生成。

mex fft2_cuda.c -IC:/CUDA/include -LC:/CUDA/lib -lcudart -lcufft

B.  代码里面包含核函数,readme中说明使用如下指令可以完成,但是总是报错,说nvmex.pl有错误,可能是vs或者matlab版本不对?(我用的vs2005 sp1 and Matlab R2010)

nvmex -f nvmexopts.bat Szeta.cu -IC:/cuda/include -LC:/cuda/lib -lcufft -lcudart

C. 从网上下载了一个代码,非常不错,里面包含matlab编译脚本文件my_compile.m, cuda文件test.cu,mex标准文件test.cpp.这是一个非常好的例子,参照即可。首先运行my_compile test.cpp, 然后就会生成二进制程序文件以供matlab调用。

my_compile.m

///

function my_compile(varargin)

!"%VS80COMNTOOLS%vsvars32.bat" & nvcc -c -arch compute_13 test.cu

n=getenv('CUDA_LIB_PATH'); if n(1)=='"', n=n(2:end); end, if n(end)=='"', n=n(1:end-1);end

mex(['-L' n],'-lcudart','test.obj',varargin{:});

test.cu

//

extern "C" void gpuAdd(double* A, double* B, double *C);

__global__ void vecAdd(double* A, double* B, double* C)

{

int i = threadIdx.x;

C[i]=A[i]+B[i];

}

void gpuAdd(double* A, double* B, double *C)

{

double *Ad,*Bd,*Cd;

cudaMalloc((void**)&Ad,5*sizeof(double));

cudaMalloc((void**)&Bd,5*sizeof(double));

cudaMalloc((void**)&Cd,5*sizeof(double));

cudaMemcpy(Ad,A,5*sizeof(double),cudaMemcpyHostToDevice);     cudaMemcpy(Bd,B,5*sizeof(double),cudaMemcpyHostToDevice);

vecAdd<<<1,5>>>(Ad,Bd,Cd);

cudaMemcpy(C,Cd,5*sizeof(double),cudaMemcpyDeviceToHost);

cudaFree(Ad);cudaFree(Bd);cudaFree(Cd);

}

test.cpp

/

#include "mex.h"

extern "C" void gpuAdd(double* A, double* B, double *C);

void mexFunction(

int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[])

{

double *C;

if (mxGetNumberOfElements(prhs[0])!=5) mexErrMsgTxt("Wrong number of elements in A!");

if (mxGetNumberOfElements(prhs[1])!=5) mexErrMsgTxt("Wrong number of elements in B!");

C=(double*)mxGetData(plhs[0]=mxCreateDoubleMatrix(1,5,mxREAL));

gpuAdd((double*)mxGetData(prhs[0]),(double*)mxGetData(prhs[1]),C);

}

2.   动态库的方法

首先按照开勇的dll开发方法,完成cuda程序的dll封装。然后创建一个包含mexFunction的标准mex文件,将调用的cuda函数写入其中即可。编译的方法类似:

mex -L. -ltest test.c

3.  直接把cuda程序编译成exe文件,在matlab中通过system函数来调用也可,(懒人办法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值