在Matlab中通过mex使用cuda的方法

2023-05-16

仅供参考,具体问题需要具体分析!

1.cuda安装及配置,参考下面这篇

cpp文件调用cuda函数_苹果挨炮的博客-CSDN博客

2.Matlab配置mex编译环境

        在matlab命令行中输入以下命令

mex  -setup

        然后会提示用户是安装c++版本的还是fortran版本的

        这里我们选择c++版本的,输入以下命令

mex -setup C++

        然后matlab会在你的电脑里检查可用编译器,提示用户选择不同的编译器安装(假如你的电脑里安装的是2022版的visula c++,但你的matlab版本低于2022版,可能会检测不出来)

 

        这里我们不选择2022版本,选择2017版本的(原因后面讲),输入提示的命令

mex -setup:'D:\Program Files\MATLAB\R2022a\bin\win64\mexopts\msvcpp2022.xml' C++

3.编写.cpp文件并用mex编译

        在介绍可被mexcuda编译的.cu文件之前,先说明一下可被mex编译的.cpp文件的编写方式,与普通的.cpp文件不同,这里的.cpp文件中没有main()函数,而是mexFuncion()函数,它大概长这个样子

# include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{   
    //nlhs (number of left-hand side) 是输出参数的个数
    //nrhs (number of right-hand side) 是输入参数的个数
    //prhs[]是指针数组,指向输入的参数,这个参数是在matlab中调用编译好的mexw64时输入的参数
    //如phrs[0]指向第一个参数,phrs[1]指向第二个参数
    //plhs[]也是指针数组,指向输出的变量
}

        以下是一段求两点之间斜段斜率的函数

# include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{   
    //mxGetScalar用于获取第一个参数的值
    double x1 = mxGetScalar(prhs[0]);
    double y1 = mxGetScalar(prhs[1]);
    double x2 = mxGetScalar(prhs[2]);
    double y2 = mxGetScalar(prhs[3]);
    //假如你第一个参数是个矩阵,需要用mxGetPr()来获取
    //double *data = mxGetPr(prhs[0]);
    double k = (y2 - y1) / (x2 - x1);
    double b = (x2 * y1 - x1 * y2) / (x2 - x1);
    //mxCreateDoubleMatrix(m, n, _)用来创建一个大小为m×n的矩阵用来储存,_指定有无虚部
    plhs[0] = mxCreateDoubleMatrix(1, 2, mxREAL);
    double* res = mxGetPr(plhs[0]);
    //plhs[0]相当于老板,负责揽项目(开辟内存),再把揽好的项目交给工程队去做(将内存地址
    //赋值给res,再用res去赋值)
    res[0] = k;
    res[1] = b;
}

        写完后在matlab中用mex xx.cpp编译,然后就可以当做函数使用了

 

 

C 矩阵 API- MATLAB & Simulink- MathWorks 中国

matlab提供了一些接口函数,用于编写被mex编译的cpp程序

4.编写.cu文件并用mexcuda编译

        .cu文件的编写方式是普通.cu文件和被mex编译的cpp文件两者编写方式的结合——将mexFunction()作为kernel函数,还需要加上 "gpu/mxGPUArray.h" 头文件

        matlab提供了样例代码在这个文件夹下,可供参考

D:\Program Files\MATLAB\R2022a\toolbox\parallel\gpu\extern\src\mex\mexGPUExample.cu

        在编译前可先使用gpudevice来查看自己的显卡参数,有时会出现不支持的情况,需要另行百度(像我就是2020版的matlab不支持3090的显卡,安装了2022版的就可以了)

         然后使用mexcuda编译mexGPUExample.cu文件,与普通mexw64函数不一样的是,使用了cuda的mexw64函数在调用之前,需要用gpuArray()函数将参数从cpu拷贝到gpu,然后再调用编译好的函数,最后输出的结果也是在gpu中,需要再用gather函数拷贝到cpu

         为什么之前安装mex的时候选择2017版本而不选择2022版本的呢?打开这个文件夹

         D:\Program Files\MATLAB\R2022a\toolbox\parallel\gpu\extern\src\mex\win64

        可以看到只有2017和2019两个版本的.xml文件,所以2022版本的matlab并不支持用visual 2022 c++编译.cu文件,运行时会出现如下警告

        虽然依旧会编译成功,但实际并不是使用的visual 2022 c++编译的,所以安装时尽量选择这个文件夹下支持的版本

GPU CUDA and MEX Programming- MATLAB & Simulink- MathWorks 中国

matlab同样也提供了用于被mexcuda编译的.cu文件的接口函数,可以作为参考

        如果一切顺利的话,你就可以愉快地在matlab中使用cuda来加速你的程序了!! 

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

在Matlab中通过mex使用cuda的方法 的相关文章

  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 不等间隔时间序列的移动平均线

    我有一个证券交易所股票价格的数据集 时间 价格 但数据点之间的间隔并不相等 从 1 到 2 分钟不等 在这种情况下计算移动平均值的最佳实践是什么 如何在Matlab中实现呢 我倾向于认为 点的权重应该取决于自上一个点以来的最后时间间隔 Ma
  • Matlab:保存后翻转图例顺序和图例重叠图

    我正在尝试根据以下内容反转我的图例条目顺序matlab条形图中图例颜色的逆序 https stackoverflow com questions 31178005 reverse ordering of legend colors in m
  • 如何安装libcusolver.so.11

    我正在尝试安装 Tensorflow 但它要求 libcusolver so 11 而我只有 libcusolver so 10 有人可以告诉我我做错了什么吗 这是我的 Ubuntu nvidia 和 CUDA 版本 uname a Lin
  • 如何找到在matlab中重复的矩阵的每一行的索引?

    我想找到矩阵中所有有重复项的行的索引 例如 A 1 2 3 4 1 2 3 4 2 3 4 5 1 2 3 4 6 5 4 3 要返回的向量将是 1 2 4 很多类似的问题建议使用unique函数 我已经尝试过 但我能得到的最接近我想要的功
  • Matlab没有优化以下内容吗?

    我有一个很长的向量 1xrv 和一个很长的向量w1xs 和一个矩阵Arxs 它是稀疏的 但维度非常大 我期望 Matlab 对以下内容进行优化 这样我就不会遇到内存问题 A v w 但看起来 Matlab 实际上是在尝试生成完整的v w矩阵
  • 无法编译cuda_ndarray.cu:libcublas.so.7.5:无法打开共享对象文件

    我正在尝试在 aws 实例中导入 theano 库以使用 GPU 我已经使用 boto 编写了一个 python 脚本来自动执行 aws 设置 该脚本本质上会从我的本地计算机对实例执行 ssh 然后启动一个 bash 脚本 其中我执行 py
  • 有没有办法在matlab中进行隐式微分

    我经常使用 matlab 来帮助我解决数学问题 现在我正在寻找一种在 matlab 中进行隐式微分的方法 例如 我想区分y 3 sin x cos y exp x 0关于dy dx 我知道如何使用数学方法通常做到这一点 但我一直在努力寻找使
  • Matlab 和 Python 中的优化算法(dog-leg trust-region)

    我正在尝试使用 Matlab 和 Python 中的狗腿信赖域算法求解一组非线性方程 在Matlab中有fsolve https www mathworks com help optim ug fsolve html其中此算法是默认算法 而
  • 对 CUDA 操作进行计时

    我需要计算 CUDA 内核执行的时间 最佳实践指南说我们可以使用事件或标准计时函数 例如clock 在Windows中 我的问题是使用这两个函数给出了完全不同的结果 事实上 与实践中的实际速度相比 事件给出的结果似乎是巨大的 我实际上需要这
  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • CUDA 中的 JPEG 库

    我正在尝试在 CUDA 中压缩和解压缩图像 到目前为止我已经找到了这个库 http sourceforge net projects cuj2k source navbar http sourceforge net projects cuj
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得

随机推荐

  • vue 封装 axios 请求

    需求 xff1a 向后端请求拿数据 好处 xff1a 把所有的请求方法放在一个文件夹里面 xff0c 方便优化 先把 axios 安装起 npm install axios save 接下来按照步骤走吧 go go go 1 在src路径下
  • Python:从清华源安装第三方库

    python 在使用pip安装的时候 xff0c 一些小一点的还好 xff0c 安装一些大的包的时候 xff0c 会非常的慢甚至出现timeout的报错 xff0c 这时我们就可以使用清华大学的镜像来安装 xff0c 打开终端 xff1a
  • 用OpenStack搭建简单的云平台并启动云主机

    OpenStack OpenStack简介OpenStack重要集成组件OpenStack平台部署部署环境建立虚拟机 配置时间同步安装OpenStack安装 RabbitMQ 消息队列服务Memcached缓存令牌的安装安装和配置OpenS
  • 关于VMware USB arbitration Serve 服务无法启动的问题

    文章目录 问题方法一方法二 问题 虚拟机插入U盘或者PA等其他USB设备时无法识别 xff0c 经过一番查询发现是本机的VMware USB arbitration Serve 没有启动 xff0c 然后 打开以后尝试启动VMware US
  • keil5安装记录(基于stm32芯片配置)

    参考资料地址正点原子 下载上述地址中的文件 xff0c 根据自己芯片的型号下载 xff0c 如仅安装keil仅下载网盘中的 软件资料 即可 xff0c 同时也可在官网下载 xff0c 但是不推荐下载最新版本 xff0c 因为很多报错没有可参
  • 黎曼几何与黎曼流形

    目录 0 黎曼几何 1 欧几里得几何与黎曼几何的区别 2 黎曼流形 3 黎曼距离 4 切空间 5 黎曼均值 6 SPD矩阵如何形成黎曼流型 7 切线空间映射 8 同余变换和同余不变 9 黎曼对齐 科普性笔记 xff0c 做了解 xff0c
  • Faster R-CNN

    1 论文简介 论文名 xff1a Faster R CNN Towards Real Time Object Detection with Region Proposal Networks 论文地址 xff1a Faster R CNN 论
  • 手把手教你安装VSCode(附带图解步骤)

    一 前端工具vscode 1 1 概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程 xff0c 通过HTML xff0c CSS及JavaScript以及衍生出来的各种技术 框架 解决方案 xff0c 来实现互联网产品的用户
  • 前端小知识:1.A标签的用法

    前端小知识 1 A标签的用法 Hello xff0c 大家好 xff0c 我是仲桉君 因为一些不可抗因素停更了很久 xff0c 但是我还是回来了从今天开始正式开始更新 这个系列是有关一些前端的小知识的小博文 预计更新20篇以上 争取做到每日
  • 从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)

    此函数有以下几点值得注意 xff1a 1 第一个参数中的const 一般在函数的形参中 xff0c 如果我们只是希望调用者使用该参数 xff0c 而不会去改变该 参数内容 xff08 一般是指针指向的内容 xff09 xff0c 则可以声明
  • C++语法基础

    C 43 43 环境安装和基础知识 1 xff1a C 43 43 环境安装与配置 我使用的编译器是Clion xff0c 解释器配置的是Dev C 43 43 自带的解释器 xff0c Clion安装见下文 Clion的安装和配置 xff
  • Samba服务

    目录 配置yum源 安装samba服务 配置samba服务 Windows环境使用Samba服务 Linux环境使用Samba服务 xff08 1 xff09 方法一使用smbclient命令 xff08 2 xff09 方法二使用挂载的方
  • 已解决—The connection to the server localhost:8080 was refused - did you specify the right host or port

    运行 kubectl get namespace时报错 xff1a root 64 ip 10 0 0 8 kubectl get namespace E0320 07 39 20 866425 32422 memcache go 265
  • 修改ideal中java项目jdk版本,记得收藏

    1 Ctrl 43 Shfit 43 Alt 43 S 进入Settings 窗口 xff0c 修改红框标记的两处jdk版本 2 Ctrl 43 Shfit 43 Alt 43 S 进入Project Structure窗口 xff0c 先
  • GO语言开发环境配置(Linux)

    Go语言开发环境配置 xff08 Linux xff09 一 Go安装二 IDE安装三 Vim IDE 常用功能 一 Go安装 Go 有多种安装方式 xff0c 比如 Go 源码安装 Go 标准包安装 第三方工具 xff08 yum apt
  • HBase过滤器

    目录 一 介绍 1 hbase运算符 2 Hbase 过滤器的比较器 二 代码 1 hbase建表 2 创建数据 3 导入依赖 4 列值过滤器 5 单列值过滤器 6 单列值排除过滤器 7 rowkey过滤器 8 rowkey前缀过滤器 xf
  • Hive与HBase之间的区别和联系

    目录 概念 Hive HBase 共同点 区别 关系 首先要知道Hive和HBase两者的区别 xff0c 我们必须要知道两者的作用和在大数据中扮演的角色 概念 Hive 1 Hive是hadoop数据仓库管理工具 xff0c 严格来说 x
  • VSCode(Visual Studio Code )软件(插件)安装与使用

    VSCode 简介 Visual Studio Code 简称 VS Code VSC 是微软公司推出的一款免费开源的现代化轻量级代码编辑器 xff0c 支持几乎所有主流的开发语言的语法高亮 智能代码补全 GIT 等特性 xff0c 支持插
  • 51单片机智能小车

    最近学校举办了一个智能小车比赛 xff0c 比赛内容为用手机蓝牙控制小车拥有5个功能 xff0c 分别是超声波舵机避障 xff0c 测距 xff08 显示在LCD1602上 xff09 xff0c 红外跟随 xff0c 循迹还有蓝牙控制小车
  • 在Matlab中通过mex使用cuda的方法

    仅供参考 xff0c 具体问题需要具体分析 xff01 1 cuda安装及配置 xff0c 参考下面这篇 cpp文件调用cuda函数 苹果挨炮的博客 CSDN博客 2 Matlab配置mex编译环境 在matlab命令行中输入以下命令 me