Matlab与CUDA C的混合编程配置出现的问题及解决方案

错误使用 mex未找到支持的编译器 matlab的 mex -setup命令 找不到编译器。 阅读详情
如今,要实现大规模的并行计算,GPU是不二的选择,而使用cuda c进行GPU编程是目前进行GPU并行计算的主流方式。
However,matlab是科研人员最熟悉的编程语言。于是,一个折衷的方法就是将一些需要并行的代码用cuda c写好,然后用matlab调用它。
那么,如何配置呢?

准备材料:
win10 x64、matlab2016、visual studio 2015、CUDA 8.0

步骤:

0、以下使用matlab都请用管理员权限打开。

1、在matlab的命令行中输入:mex -setup,显示如下结果,这说明你的C\C++编译器配置好了。
   
  1. >> mex -setup
  2. MEX 配置为使用 'Microsoft Visual C++ 2015 Professional (C)' 以进行 C 语言编译。
  3. 警告: MATLAB C Fortran API 已更改,现可支持
  4. 包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
  5. 您需要更新代码以利用
  6. 新的 API。您可以在以下网址找到相关详细信息:
  7. http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。
  8. 要选择不同的语言,请从以下选项中选择一种命令:
  9. mex -setup C++
  10. mex -setup FORTRAN

2、按照matlab官网的教程进行用例的编译和测试,地址如下:
如果你能顺利的完成官网的教程,则跳到第9步,否则进入第3步。

3、在你的matlab安装目录下看是否有 mexGPUExample.cu文件,应该在 matlabroot/toolbox/distcomp/gpu/extern/src/mex/  目录下,比如我的matlab安装在 C:\Program Files\MATLAB\R2016a\ 中,这个文件就在 C:\Program Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\src\mex。
将matlab的工作目录改为 mexGPUExample.cu 文件所在的目录,如我的在: C:\Program Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\src\mex

4、在matlab的命令行中输入:mexcuda mexGPUExample.cu,如果显示如下结果,则进入第5步
   
  1. >> mexcuda mexGPUExample.cu
  2. 警告: The selected C++ compiler is not supported for CUDA compilation. Searching for a supported compiler.
  3. > In mexcuda (line 89)
  4. 错误使用 mex
  5. 未找到支持的编译器或 SDK。有关选项,请访问 http://www.mathworks.com/support/compilers/R2016a/win64.html。
  6. 出错 mexcuda (line 157)
  7. [varargout{1:nargout}] = mex(mexArguments{:});

5、出现上面的错误是由于matlab2016、vs2015和cuda8.0不适配造成的,使用matlab论坛上的回答是:
MATLAB R2016b requires CUDA 7.5, which doesn't support Visual Studio 2015. So the first thing it's doing is checking for a version of Visual Studio you can use, which you don't have.
但是,有意思的是,这哥们又说:

This Answer provides a workaround to force MATLAB to use CUDA 8.0 and Visual Studio 14:

https://www.mathworks.com/matlabcentral/answers/305391-compiling-cuda-files-with-mexcuda-why-wont-matlab-accept-my-compiler

接着看这个网页,一个哥们提到了一种曲线救国的方案:

This is how to compile (*mexcuda*) with Visual Studio 2015 and Cuda 8.0 :

  1. Go to: "\toolbox\distcomp\gpu\extern\src\mex\win64"
  2. Copy files and rename 2013 to 2015: { "nvcc_msvcpp2013.xml" , "nvcc_msvcpp2013_dynamic.xml"}
  3. Replace inside those files "7.5" to "8.0" and "12" to "14".
  4. Done.
按照这个哥们的搞一搞。
mexGPUExample.cu 文件所在的目录中,你可以看到叫win64的文件夹,打开,可以看到有nvcc_msvcpp2012.xml、nvcc_msvcpp2012_dynamic.xml、 nvcc_msvcpp2013.xml、 nvcc_msvcpp2013_dynamic.xml,就是没有跟2015有关的文件,所以我们是不是应该做些什么。按照这个哥们的意思,将 nvcc_msvcpp2013.xml、 nvcc_msvcpp2013_dynamic.xml复制粘贴到这个文件夹,这是会出现这2个文件的副本,把这两个副本的文件名改为 nvcc_msvcpp2015.xml、 nvcc_msvcpp2015_dynamic.xml,当然,只换皮不换肉是不行的,打开这2个文件,按Ctrl+H,将文件中的7.5全部替换成8.0,将12替换成14.然后保存。

6、重启matlab,还是进入刚刚的路径, 在matlab的命令行中输入: mexcuda mexGPUExample.cu,如果显示如下结果,则进入第7步
   
  1. >> mexcuda mexGPUExample.cu
  2. 使用 'NVIDIA CUDA Compiler' 编译。
  3. 错误使用 mex
  4. nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future
  5. release (Use -Wno-deprecated-gpu-targets to suppress warning).
  6. mexGPUExample.cu
  7. D:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/Bin/amd64/../../../VC/INCLUDE\crtdefs.h(10): fatal error C1083:
  8. 无法打开包括文件: corecrt.h”: No such file or directory
  9. 出错 mexcuda (line 157)
  10. [varargout{1:nargout}] = mex(mexArguments{:});

7、这个错误可能是由于使用的是win10系统造成的,需要预设一些环境变量,可以参考如下网页
需要在系统的环境变量中添加两个变量(INCLUDE和LIB):
INCLUDE =  C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt
LIB =  C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10150.0\ucrt\x64

8、 重启matlab,还是进入刚刚的路径, 在matlab的命令行中输入: mexcuda mexGPUExample.cu,如果显示如下结果,则进入第9步
    
  1. >> mexcuda mexGPUExample.cu
  2. 使用 'NVIDIA CUDA Compiler' 编译。
  3. c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h: warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  4. c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(849): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  5. ...
  6. c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(7956): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  7. MEX 已成功完成。

9、编译完成后,会发现在同一目录下多出了个mexGPUExample.mexw64文件。恭喜你,终于编译完成了。

编译完成了你就不想跑一下,测试一下能不能用吗?

A1、按照官网的教程,请在matlab中输入:
   
  1. x = ones(4,4,'gpuArray');
  2. y = mexGPUExample(x)
A2、如果你出现和官网一样的结果,则恭喜你,你已经搞定事情了。但是,如果你出现如下结果,请进入第A3步
    
  1. >> x = ones(4,4,'gpuArray');
  2. >> y = mexGPUExample(x)
  3. 未定义函数或变量 'mexGPUExample'
A3、这是由于刚生成mexw64文件,matlab还没有识别出来,没关系,重启一下,然后进入刚刚的目录,再来一遍,就会出现一下结果了。
    
  1. >> x = ones(4,4,'gpuArray');
  2. >> y = mexGPUExample(x)
  3. y =
  4. 2 2 2 2
  5. 2 2 2 2
  6. 2 2 2 2
  7. 2 2 2 2







错误使用MEX的解决办法 好在最后还是安装成功了,记录一下完整过程吧(按照网上的说法,还有修改环境变量的,重新安装软件的,重新更新VC++的运行库的,我都试了一遍,全都没用,也许可能是问题本身不一致,也许可能就是无效的方法,不过小小问题硬控了我俩小时,实在伤脑筋。设置环境这里,setenv的命令,路径需要放到下载的配置文件的路径下,且为当前的打开路径,不可教条主义呀,,,(我这里上面就是直接复制出错了)按照网上的说法,我这个是属于没有安装VS的类型问题,于是我按照官网和其他博客的指导,下载了对于的默认编译器(本人是2016B版本) 阅读详情

相关推荐

mex和cuda混合编程之向量加法

cudamatlab混合编程之向量加法,遇到的一些问题解决方案

Downsiren的博客 1020

GPUMATLAB混合编程之书本实现代码

本资源主要是《GPUMATLAB混合编程》书中的所有的例子的实现代码。对于购买了这本书的同学会有找不到书中源代码的情况,这时候,您就可以下载本代码集合,本代码集合拥有完整的书中的所有例子的代码。

解锁Matlab高性能计算:手把手教你用mexCUDA实现GPU加速

本文详细介绍了如何通过Matlab的mex功能CUDA结合实现GPU加速计算,显著提升大规模矩阵运算和复杂数值模拟的效率。从环境配置到实战案例,手把手教你编写CUDA内核并优化性能,帮助开发者充分利用显卡并行计算能力,解决Matlab内置函数在复杂算法中的性能瓶颈问题

weixin_33701564的博客 219

使用mexcuda编译.cu文件报错的解决:The selected C++ compiler is not supported for CUDA compilation.

主要问题MATLAB2022b不支持Visual studio 2022 解决方法:装一个Visual studio 2019

m0_46317675的博客 3375

matlab cuda混合编程6,MatlabCUDA C的混合编程配置出现的问题解决方案

如今,要实现大规模的并行计算,GPU是不二的选择,而使用cuda c进行GPU编程是目前进行GPU并行计算的主流方式。However,matlab是科研人员最熟悉的编程语言。于是,一个折衷的方法就是将一些需要并行的代码用cuda c写好,然后用matlab调用它。那么,如何配置呢?准备材料:win10 x64、matlab2016、visual studio 2015、CUDA 8.0步骤:0、以...

weixin_33600376的博客 1189

MATLAB+C+CUDA混合编程

之前由于工程需要对算法进行加速,学习了该技术,现在将实现方法记录在此,也供大家参考。

HPC_ZY 2773

低版本Matlab(2020b)高版本Visual Studio(VS2022)实现M、C/C++混合编程(调试)

如何配置低版本Matlab高版本Visual studio 2022混合编程

m0_51546637的博客 1万+

如何利用GPU(CUDA)加速Matlab程序?

Matlab中调用GPU的CUDA API进行并行加速,主要有两种途径: 1)对现有Matlab代码的简单改写,调用Matlab中支持CUDA的函数进行加速。 2)将C语言的CUDA函数封装成库,在Matlab中进行调用。 前者简单方便,效率低;后者效率高,稍微麻烦。 一、matlab中直接的gpu加速计算 matlab中直接做GPU计算分为三个步骤。 (1)数据的初始...

战斗蜗牛的专栏 3万+

cuda matlab 混合编程,windows7下搭建matlabcuda混合编程

一、软件版本windows7matlabR2014aVisual Studio2013cuda7显卡是NVIDA的GT730二、环境搭建1.下载并安装visual studio20132.下载并安装cuda7cuda的安装路径都都是选择默认的安装路径,第一次安装的过程中,出现电脑黑屏的过程,强制关机重启,重新安装cuda,安装完成。估计是cuda安装过程把原来的显卡驱动给删了。安装完成后需要配置...

weixin_39818691的博客 259

matlab gpu程序效率,如何利用GPU(CUDA)加速Matlab程序?

Matlab中调用GPU的CUDA API进行并行加速,主要有两种途径:1)对现有Matlab代码的简单改写,调用Matlab中支持CUDA的函数进行加速。2)将C语言的CUDA函数封装成库,在Matlab中进行调用。前者简单方便,效率低;后者效率高,稍微麻烦。一、matlab中直接的gpu加速计算matlab中直接做GPU计算分为三个步骤。(1)数据的初始化使用gpuArray()则可生成gp...

weixin_40008870的博客 2451

cuda matlab 混合编程,Matlab+CUDA混合编程(二)

1. 创建AddVectors.h文件#ifndef __ADDVECTORS_H__#define __ADDVECTORS_H_extern void addVectors(float*A, float*B, float*C, int size);#endif// ____ADDVECTORS_H_2. 创建AddVectors.cu函数,这个是CUDA函数#include "AddVecto...

weixin_39872123的博客 584

VS2017 和 Matlab R2016b 混合编程配置问题解决!

VS2017 和 Matlab R2016b 混合编程配置 前言:由于个人VS版本使用到2017问题,涉及到混合编程等一系列问题,发现只有2016b版本和更高的版本支持。我也是弄了一天才解决这些问题,唉~ 环境 Win 10 + Visual Studio 2017 + Matlab R2016b 问题 Matlab 输入: mex -setup 未找到SDK… mbuild -setup 未...

weixin_44287997的博客 1502

跨越版本鸿沟:Matlab 2020bVS2022的混合编程利器

跨越版本鸿沟:Matlab 2020bVS2022的混合编程利器 【下载地址】低版本Matlab2020b高版本VisualStudioVS2022实现MCC混合编程调试 本资源文件旨在帮助用户在低版本的Matlab(2020b)高版本的Visual Studio(VS2022)之间实现M、C/C++混合编程,并进...

gitblog_06570的博客 591

windows7下搭建matlabcuda混合编程

一、软件版本windows7matlabR2014aVisual Studio2013cuda7显卡是NVIDA的GT730二、环境搭建1.下载并安装visual studio20132.下载并安装cuda7cuda的安装路径都都是选择默认的安装路径,第一次安装的过程中,出现电脑黑屏的过程,强制关机重启,重新安装cuda,安装完成。估计是cuda安装过程把原来的显卡驱动给删了。安装完成后需要配置...

代码改变世界,keep coding。 1360

tmwtypes.h下载 matlab,Matlab+CUDA混合编程(二)

1. 创建AddVectors.h文件#ifndef__ADDVECTORS_H__#define__ADDVECTORS_H_externvoidaddVectors(float*A,float*B,float*C,intsize);#endif// ____ADDVECTORS_H_2. 创建AddVectors.cu函数,这个是CUDA函数#include"AddVectors.h"#inc...

weixin_34846784的博客 906

matlab程序加速优化

其实自己写matlab也有两年多时间了,虽然基本都能做到随用随会,满足基本所有的功能需求。但是作为一个通用计算平台,matlab其实有很多特定用途的工具箱,以及加速运算的小技巧,不同于一些语法或者函数用法的学习,这些小技巧可以称之为经验,需要不断积累。。 本文主要讲述matlab程序运行的加速优化。 最近在做一些基于matlab的神经网络调参训练,需要尝试很多超参数的不同组合,所以在不同的机...

edward_zcl的博客 1万+

matlab两个多项式相除,C++MATLAB混合编程求解多项式系数(矩阵相除)

摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++MATLAB混合编程求解矩阵问题。主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll文件(在C++中可以调用编译的函数),然后对VS项目进行文件配置,编写C++代码调用MATLAB中定义的函数。问题描述:对于一个多项式需要求解c到c的值,由相关条件已知c=c=0,且、、、可得如下矩阵式...

weixin_33952612的博客 505
上一篇: 一行代码搞定矩阵旋转——python
下一篇: 2017阿里内推笔试题--算法工程师(运筹优化)
shawpan
博客等级 码龄16年 259粉丝 30原创
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值