博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Matlab与CUDA C的混合编程配置出现的问题及解决方案
阅读量:4056 次
发布时间:2019-05-25

本文共 4522 字,大约阅读时间需要 15 分钟。

如今,要实现大规模的并行计算,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++编译器配置好了。
>> mex -setup 
MEX 配置为使用 'Microsoft Visual C++ 2015 Professional (C)' 以进行 C 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持
包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
您需要更新代码以利用
新的 API。您可以在以下网址找到相关详细信息:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。
要选择不同的语言,请从以下选项中选择一种命令:
mex -setup C++
mex -setup FORTRAN
2、按照matlab官网的教程进行用例的编译和测试,地址如下:
如果你能顺利的完成官网的教程,则跳到第9步,否则进入第3步。
3、在你的matlab安装目录下看是否有 文件,应该在
 目录下,比如我的matlab安装在 C:\Program Files\MATLAB\R2016a\ 中,这个文件就在 C:\Program Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\src\mex。
将matlab的工作目录改为
文件所在的目录,如我的在:
C:\Program Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\src\mex
4、在matlab的命令行中输入:mexcuda mexGPUExample.cu,如果显示如下结果,则进入第5步
>> mexcuda mexGPUExample.cu 
警告: The selected C++ compiler is not supported for CUDA compilation. Searching for a supported compiler.
> In mexcuda (line 89)
错误使用 mex
未找到支持的编译器或 SDK。有关选项,请访问 http://www.mathworks.com/support/compilers/R2016a/win64.html。
出错 mexcuda (line 157)
[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:

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

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.
    来源: 
按照这个哥们的搞一搞。
文件所在的目录中,你可以看到叫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步
>> mexcuda mexGPUExample.cu 
使用 'NVIDIA CUDA Compiler' 编译。
错误使用 mex
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future
release (Use -Wno-deprecated-gpu-targets to suppress warning).
mexGPUExample.cu
D:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/Bin/amd64/../../../VC/INCLUDE\crtdefs.h(10): fatal error C1083:
无法打开包括文件: “corecrt.h”: No such file or directory
出错 mexcuda (line 157)
[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步
>> mexcuda mexGPUExample.cu 
使用 'NVIDIA CUDA Compiler' 编译。
c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h: warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(849): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
...
c:\program files\nvidia gpu computing toolkit\cuda\v8.0\include\math_functions.h(7956): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
MEX 已成功完成。
9、编译完成后,会发现在同一目录下多出了个mexGPUExample.mexw64文件。恭喜你,终于编译完成了。
编译完成了你就不想跑一下,测试一下能不能用吗?
A1、按照官网的教程,请在matlab中输入:
x = ones(4,4,'gpuArray'); 
y = mexGPUExample(x)
A2、如果你出现和官网一样的结果,则恭喜你,你已经搞定事情了。但是,如果你出现如下结果,请进入第A3步
>> x = ones(4,4,'gpuArray'); 
>> y = mexGPUExample(x)
未定义函数或变量 'mexGPUExample'。
A3、这是由于刚生成mexw64文件,matlab还没有识别出来,没关系,重启一下,然后进入刚刚的目录,再来一遍,就会出现一下结果了。
>> x = ones(4,4,'gpuArray'); 
>> y = mexGPUExample(x)
y =
2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2

转载地址:http://srhci.baihongyu.com/

你可能感兴趣的文章
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
01Java基础语法-16. while循环结构
查看>>
Django框架全面讲解 -- Form
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>