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 的相关文章

  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • MATLAB:在不使用循环的情况下提取矩阵的多个部分

    我有一个巨大的 2D 矩阵 我想从中提取 15 个不同的 100x100 部分 我有两个向量 x 和 y 其中保存了零件的左上角索引 我用过这样的东西 result cam1 x 1 end x 1 end 99 y 1 end y 1 e
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • 如何处理来自单独线程的窗口消息?

    我希望启动一个单独的线程来处理窗口消息 通过阻塞 GetMessage 循环 但之后仍然在初始线程中创建窗口 在单独的线程中 一旦启动 我就会调用PeekMessage使用 PM NOREMOVE 确保消息队列存在 有必要吗 然后 Atta
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser
  • MINIDUMP_TYPE 枚举值的哪种组合将为我提供最“完整”的小型转储?

    我希望我的应用程序创建一个小型转储以帮助调试未处理的异常 在创建转储之前 我可能不知道我需要什么类型的小型转储 那么什么组合小型转储类型 http msdn microsoft com en us library ms680519 28v
  • 如何使用命令行压缩指定文件夹

    你们能告诉我如何将指定的文件压缩到同一个 Zip 文件中吗 让我告诉我我的文件夹是如何填充的 任务调度程序有我的数据库的备份 并每天将它们保存到文件中 它每天创建 4 个数据库备份 这意味着每天会多出 4 个文件 因此 我需要将新创建的备份
  • Linux下显卡内存使用情况

    Linux下有哪些工具可以监控显卡内存使用情况 NVIDIA 性能套件 http developer nvidia com content nvidia perfkit有Linux版本 可以实时监控各种显卡属性 包括显卡内存使用情况 显然
  • pyinstaller错误:OSError:[WinError 6]句柄无效

    该文件使用终端命令获取 wifi 密码netsh wlan show profiles我之前使用 pyinstaller 创建了一些 exe 它们工作得很好 代码 import subprocess import time import s
  • 在运行时检查 GCC 版本

    我需要找出 C 程序执行过程中 运行时 可用的 系统中安装的 GCC 版本 主要版本和次要版本 意思是 以编程方式提取可用 gcc 的版本 就像我在 shell 中输入 gcc version 一样 但在 c 程序中 The GNUC an
  • Windows 每秒进行一次线程切换的频率是多少? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions Windows 通常 每秒进行一次线
  • 使用awk将列中的值替换为txt文件中的另一个值

    我是 Linux 和 awk 脚本编写的新手 我有 tab delim txt 文件 如下所示 AAA 134 145 Sat 150 167 AAA 156 167 Sat 150 167 AAA 175 187 Sat 150 167
  • 在 scp 的简单函数包装中使用波形符 ~ 时出现问题

    我想放置一个简单的bash功能在我的 bashrc围绕着scp通过接受 源 参数和 目标 参数来命令 到目前为止已经尝试过 function send eval scp 1 user annoyingly long server name
  • 为 OpenWrt 编写和编译程序

    我有一个在 OpenWRT 下运行的具有 MIPS 架构的嵌入式设备 系统类型 MediaTek MT7628AN ver 1 eco 2机器 WRTnode2P 处理器 0CPU型号 MIPS 24KEc V5 5 我想通过我的电脑 ub
  • 从核心转储中获取堆栈跟踪

    如何从核心转储文件中获取堆栈跟踪 该文件大约 14 mb 是在我的应用程序退出并显示 分段错误 后生成的 我使用的是红帽 5 5 gdb usr bin myapp binary corefile 然后 使用以下之一 gdb bt gdb

随机推荐