cuda调用matlab函数,Linux系统和Windows下MATLAB调用CUDA

2023-05-16

1、MATLAB调用CUDA是通过:MATLAB通过mexFunction编译C,通过nvcc编译cu文件实现的,大致流程为:MATLAB调用C文件,C文件调用cu文件。

2、c调用cu之前,使用system,通过nvcc编译cu文件为.o文件,以提供给cpp文件使用,这样C就能调用cu了。而MATLAB通过mex调用mexFuntion文件,就能编译成MATLAB可调用的mexa64/32文件函数。

3、Linux下的MATLAB调用CUDA举例:

(1)matlab下nvmex函数:

function nvmex(cuFileName)

if ispc % Windows  %dips('windows');  Host_Compiler_Location = '-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64"';  CUDA_INC_Location = ['"' getenv('CUDA_PATH')  '\include"'];  CUDA_SAMPLES_Location =['"' getenv('NVCUDASAMPLES5_5_ROOT')  '\common\inc"'];  PIC_Option = '';     if ( strcmp(computer('arch'),'win32') ==1)         disp('')         machine_str = ' --machine 32 ';         CUDA_LIB_Location = ['"' getenv('CUDA_PATH')  '\lib\Win32"'];     elseif  ( strcmp(computer('arch'),'win64') ==1)         machine_str = ' --machine 64 ';         CUDA_LIB_Location = ['"' getenv('CUDA_PATH')  '\lib\x64"'];     end else % Mac and Linux (assuming gcc is on the path)     %disp('linux');     CUDA_INC_Location = '/usr/local/cuda/include';     CUDA_SAMPLES_Location = '/usr/local/cuda/samples/common/inc';     Host_Compiler_Location = ' ';     PIC_Option = ' --compiler-options -fPIC ';     machine_str = [];     if ( strcmp(computer('arch'),'glnxa32') ==1)         %disp('32');         CUDA_LIB_Location = '/usr/local/cuda/lib';     elseif  ( strcmp(computer('arch'),'glnxa64') ==1)        % disp('64');         CUDA_LIB_Location = '/usr/local/cuda/lib64';     end end

%以上过程是判断系统是Linux还是Windows,是64位的还是32位的系统;但是无论是哪个系统,相应的cuda路径要选对,否则运行会出错

% !!! End of things to modify !!! [~, filename] = fileparts(cuFileName); nvccCommandLine = [ ... 'nvcc --compile ' Host_Compiler_Location ' ' ... '-o '  filename '.o ' ... machine_str PIC_Option ... ' -I' '"' matlabroot '/extern/include "' ... ' -I' CUDA_INC_Location ' -I' CUDA_SAMPLES_Location ... ' "' cuFileName '" '   ]; mexCommandLine = ['mex ' filename  '.o'  ' -L' CUDA_LIB_Location  ' -lcudart']; disp(nvccCommandLine); warning off; status = system(nvccCommandLine);  %system编译,编译成功则status >=0,封装失败,则status < 0,编译产生.o文件或者.Obj文件 warning on;

if status < 0  error 'Error invoking nvcc'; end

disp(mexCommandLine); eval(mexCommandLine);   %mex执行,编译.o文件(在Windows系统下为.obj文件),并封装为MATLAB可调用的mexa64/32文件函数

%同时如果将CUDA和Cpp文件写开的话,可在mexCommandLine加入CPP文件和.o文件: mexCommandLine= ['mex '  filename  '.cpp ' filename  '.o'  ' -L' CUDA_LIB_Location  ' -lcudart'];   同时:filename  也可以是自己随意定义的名字

end

(2)nvmex的调用:

clc;clear;close all

nvmex('Addvector.cu');

A=[1 2 3]; B=[4 5 6];  C = AddVectors(A,B)

(3)cu文件的编译:addVectors.cu

#include "AddVectors.h" #include #include "mex.h" #include __global__ void addVectorsMask(double *devPtrA, double *devPtrB, double *devPtrC, int size) {     int i = threadIdx.x ;//+ blockIdx.x * blockDim.x;     devPtrC[i] = devPtrA[i] + devPtrB[i];     __syncthreads(); } void addVectors(double *A, double *B, double *C, int size)//定义C和CUDA的接口 {     double *devPtrA,*devPtrB,*devPtrC;     cudaMalloc(&devPtrA,sizeof(double)* size);     cudaMalloc(&devPtrB,sizeof(double)* size);     cudaMalloc(&devPtrC,sizeof(double)* size);     cudaMemcpy(devPtrA,A, sizeof(double)* size, cudaMemcpyHostToDevice);     cudaMemcpy(devPtrB,B, sizeof(double)* size, cudaMemcpyHostToDevice);     addVectorsMask<<<1,size>>>(devPtrA,devPtrB, devPtrC, size);     cudaMemcpy(C,devPtrC, sizeof(double)* size, cudaMemcpyDeviceToHost); double *d=(double *)malloc(sizeof(double)* size); cudaMemcpy(d,devPtrC, sizeof(double)* size, cudaMemcpyDeviceToHost);   free(d);     cudaFree(devPtrA);     cudaFree(devPtrB);     cudaFree(devPtrC); }

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])//定义C和MATLAB的接口 {    // 鍒ゆ柇杈撳叆鍙傛暟涓暟鏄惁婊¤冻鏉′欢    if (nrhs != 2)        mexErrMsgTxt("Invaidnumber of input arguments");    if (nlhs != 1)        mexErrMsgTxt("Invalidnumber of outputs");    // 鍒ゆ柇杈撳叆鍙傛暟鐨勭被鍨嬫槸鍚︽弧瓒虫潯锟?   // if (!mxIsSingle(prhs[0]) !mxIsSingle(prhs[1]))     //   mexErrMsgTxt("inputvector data type must be single");    // 鑾峰彇杈撳叆鍙傛暟缁村害    // mxGetM:寰楀埌杈撳叆鐭╅樀鐨勮锟?    // mxGetN:寰楀埌杈撳叆鐭╅樀鐨勫垪锟?    int numRowsA = (int)mxGetM(prhs[0]);//閭d箞prhs[0]鎸囧悜绗竴涓彉锟?    int numColsA = (int)mxGetN(prhs[0]);    int numRowsB = (int)mxGetM(prhs[1]);//prhs[1]鎸囧悜绗簩涓彉锟?    int numColsB = (int)mxGetN(prhs[1]);    // 鍒ゆ柇杈撳叆鍙傛暟缁村害鏄惁婊¤冻鏉′欢    if (numRowsA != numRowsB || numColsA != numColsB)        mexErrMsgTxt("Invalidsize. The sizes of two vectors must be same");    int minSize = (numRowsA < numColsA) ? numRowsA : numColsA;     int maxSize = (numRowsA > numColsA) ? numRowsA : numColsA;    int size=numRowsA*numColsA;    if (minSize != 1)        mexErrMsgTxt("Invalidsize. The vector must be one dimentional");    //mxGetData 鑾峰彇鏁版嵁闃靛垪涓殑鏁版嵁    double *A;// = (float*)mxGetPr(prhs[0]);    double *B;// = (float*)mxGetPr(prhs[1]);    A=mxGetPr(prhs[0]);    B=mxGetPr(prhs[1]);    plhs[0]=mxCreateDoubleMatrix(numRowsA,numColsA,mxREAL);    //plhs[0]= mxCreateNumericMatrix(numRowsA,numColsB, mxSINGLE_CLASS, mxREAL);    // 鑾峰彇杈撳嚭鍙傛暟鐨勬寚锟?    double *C ;//= (double*)mxGetData(plhs[0]);    // C=mxGetPr(plhs[0]);    C=mxGetPr(plhs[0]);     addVectors(A, B, C, size);

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cuda调用matlab函数,Linux系统和Windows下MATLAB调用CUDA 的相关文章

  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 像matlab一样在python中连接数组而不知道输出数组的大小

    我正在尝试在 python 中连接数组 类似于 matlab array1 zeros 3 500 array2 ones 3 700 array array1 array2 我在 python 中做了以下操作 array1 np zero
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 具有 Cuda Thrust 的多个 GPU?

    如何将 Thrust 与多个 GPU 一起使用 这只是使用 cudaSetDevice deviceId 的问题吗 然后运行相关的 Thrust 代码 使用 CUDA 4 0 或更高版本 cudaSetDevice deviceId 接下来
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 如何使用 MSYS2 获取旧版本的软件包?

    我决定尝试 CLion for Windows 它推荐使用 MinGW 或 Cygwin 进行编译 我安装了MSYS2 http sourceforge net p msys2 wiki MSYS2 20installation 包管理器进
  • Powershell:获取 FQDN 主机名

    我想通过 powershell 脚本检索 Windows 服务器的 FQDN 名称 到目前为止我已经找到了2个解决方案 server Invoke Command ScriptBlock hostname 上面的行将仅打印服务器的短名称 s
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • Windows批处理脚本启动程序并退出控制台

    我有一个用于启动程序的批处理脚本 例如notepad exe 当我双击这个批处理文件时 记事本正常启动 但是黑窗cmd谁发起的notepad exe仍然在后台 我需要做什么才能启动notepad exe并使cmd窗口消失 edit 比使用更
  • 当调用dll函数时,参数对象的成员变量的内存地址发生变化

    类某类 一些成员MemberClass one of the mem 我有一个函数foo SomeClass object 在 dll 中 它是从 exe 调用的 Problem 地址one of the mem 在调度 dll 调用期间发
  • 大型跨平台软件项目的技巧/资源

    我将开始一个大型软件项目 涉及跨平台 GUI 和大量的数字运算 我计划用 C 和 CUDA 编写大部分应用程序后端 并用 Qt4 编写 GUI 我计划使用 Make 作为我的构建系统 这将是一个只有两名开发人员的项目 一旦我相对深入地了解它
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • 如何在 Windows 中创建上下文菜单子菜单?

    我一直在编写实用程序并通过 Shell 键 上的 Regedit 将它们映射到上下文菜单 但我不知道如何像一些更流行的实用程序那样创建子菜单 例如 如果我有三个脚本将文件移动和重命名到三个不同的文件夹 那么现在我有三个不同的上下文菜单条目
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • Chromium 中的 MP4 编解码器支持

    我们已将 Chromium 嵌入式框架集成到我们的 Windows 游戏中 以允许我们从应用程序内渲染网页 并且一切正常 除了 MP4 视频 据我所知 由于许可问题 Chromium 不包含此编解码器 但任何人都可以提供有关我们如何添加支持
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • MD 和 MKDIR 批处理命令有什么区别?

    这两个命令都会创建文件夹 我read http www computerhope com mdhlp htmMKDIR 甚至可以创建子文件夹 这只是区别吗 为什么有两个命令做同样的事情 我应该使用哪一个 除了 npocmaka 的answe
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建

随机推荐