《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 11915|回复: 15
收起左侧

[教程] mex 文件中使用cuda加速matlab

    [复制链接]
发表于 2012-5-14 11:40:17 | 显示全部楼层 |阅读模式
本帖最后由 蓝云风翼 于 2013-10-10 14:11 编辑

在这篇帖子之前已经多次介绍过如何使用cuda在mex文件加速MATLAB,可以参看:
详解:http://www.matlabsky.com/forum.php?mod=viewthread&tid=10654
详解:http://www.matlabsky.com/forum.php?mod=viewthread&tid=20597
Simulink中使用:http://www.matlabsky.com/forum.php?mod=viewthread&tid=10062
文章http://www.matlabsky.com/forum.php?mod=viewthread&tid=9812

本帖不作详细的步骤说明,只粗略总结一下如有细节出入请回帖:
首先要保证CUDA 环境ok(将 cuda bin目录添加到环境变量path中确保在matlab 命令行窗口 可以认出 !nvcc )
1.MATLAB提供了脚本语言叫做mex, 编译mex文件可以成为共享连接库或者.dll以便在matlab代码中执行这种脚本可以使用 C, C++ 和FORTRAN 代码. 也可以调用cuda代码来产生在GPU上优化的代码。

2.我是否有必要写自己的mex 文件?
我对mex function脚本语言熟悉吗?我对cuda了解吗?我能在mex 文件中写出高效的cuda 代码吗?
我能否使用现有工具包括JACKET ,matlab PCT ,GPUmat代替等等。

3.使用 mex -setup配置mex 环境
matlab版本须比vc编译器版本高。

4.修改 nvmex.m文件
包括
a. cuda 的lib指向目录,一定要指到包含cudaxxx.lib的目录如(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\lib\Win32 或...\CUDA\v5.0\lib\Win32)
b.如果编译时出现不识别 Programs  Files,nvcc fatal   : A single input file is required for a non-link phase when an outputfile is specified 即路径中出现空格不被识别,那么可以添加aa变量来保存路径名。

如图片中 aa=matlab extern include目录,以及在nvccCommandLine中添加 aa...,注意在nvccCommandLine中已经添加了aa就无需在用  ' -I' matlabroot '/extern/include ' ...

注:如果有多个include需要添加 可以用aa=' -I"inc1","inc2","inc3" ';

如果有多个lib,user.lib(路径USER_LIB_Location) 需要添加可以在mexCommandLine中添加 ''-L' USER_LIB_Location ''', ''-luser''
mexCommandLine = ['mex (''' filename '.o'', ''-L' CUDA_LIB_Location ''', ''-L' USER_LIB_Location ''', ''-lcudart'',''-luser'' )'];


未命名.jpg

图片提供者math-王星

图片提供者math-王星

图片提供者math-王星

图片提供者math-王星

另fileparts函数有三个输出为:
[path,filename,zaet] = fileparts(cuFileName);


2. vs 编译器的正确路径

感谢为本帖提供帮助的:gxfei427,math-王星
file:///D:/Users/ADMINI%7E1/AppData/Local/Temp/ksohtml/wps_clip_image-23756.png
file:///D:/Users/ADMINI%7E1/AppData/Local/Temp/ksohtml/wps_clip_image-23723.png
file:///D:/Users/ADMINI%7E1/AppData/Local/Temp/ksohtml/wps_clip_image-23769.png
发表于 2016-12-8 12:54:14 | 显示全部楼层
本帖最后由 ssomeday 于 2016-12-8 12:57 编辑

版主你好,我最近在做MATLAB GPU运算,已按照您的方法设置了nvmex里的路径,示例中的几个函数编译nvtimestwo.cu时没有错误,但是编译我自己的.cu文件时,出现了以下错误,不知道是怎么回事,期待您的解答,非常感谢
E:\PROGRA~2\MATLAB\R2012B\BIN\MEX.PL: Error: 'CMF_GPU.o' not found.

Error using mex (line 206)
Unable to complete successfully.
Error in nvmex (line 42)
eval(mexCommandLine);

我用的是MATLAB 2012b, VS2010, CUDA5.5,请问我还可以用cuda的哪个版本呢,之前用cuda8.0好像不行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-29 08:38:49 | 显示全部楼层
ssomeday 发表于 2016-12-8 12:54
版主你好,我最近在做MATLAB GPU运算,已按照您的方法设置了nvmex里的路径,示例中的几个函数编译nvtimestw ...

可以把具体的原因贴出来,看你描述暂时没有办法判断原因
回复 支持 反对

使用道具 举报

发表于 2012-5-14 11:44:26 | 显示全部楼层
顶一下{:soso_e142:}
发表于 2012-7-18 16:49:03 | 显示全部楼层
支持,王星兄弟{:soso_e113:}
发表于 2012-10-14 17:32:20 | 显示全部楼层
发表于 2013-4-15 19:41:27 | 显示全部楼层
本帖最后由 一心一日撒 于 2013-4-15 19:44 编辑

版主你好,我下载你的这个程序,但是遇到了问题:
>> nvmex('nvPowerSeries')
nvcc --compile nvPowerSeries -ccbin "C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\bin"  -o nvPowerSeries.o -I"C:\Program Files\MATLAB\R2011a\extern\include" -IC:\Program Files\MATLAB\R2011a/extern/include
nvcc : fatal error : A single input file is required for a non-link phase when an outputfile is specified
??? Error using ==> nvmex at 37
Error invoking nvcc
这个怎么解决呀,费了半天也没弄好。
(我用的matlab2011a、vs2010、win7 64位、cuda5.0)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-15 20:12:41 | 显示全部楼层
一心一日撒 发表于 2013-4-15 19:41
版主你好,我下载你的这个程序,但是遇到了问题:
>> nvmex('nvPowerSeries')
nvcc --compile nvPowerSer ...

看看你的CUDA lib有没有填写正确,nvcc错误。
1. aa=matlab extern include目录,
2.以及在nvccCommandLine中添加 aa...
这两处看看你的配置是否正确
回复 支持 反对

使用道具 举报

发表于 2013-4-15 20:34:08 | 显示全部楼层
本帖最后由 一心一日撒 于 2013-4-15 20:35 编辑
蓝云风翼 发表于 2013-4-15 20:12
看看你的CUDA lib有没有填写正确,nvcc错误。
1. aa=matlab extern include目录,
2.以及在nvccCommand ...


我都按照你图片说的弄了。
if ispc % Windows
    CUDA_LIB_Location = 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64';
    Host_Compiler_Location = '-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"';
    PIC_Option = '';
   aa='-I"C:\Program Files\MATLAB\R2011a\extern\include"';
else % Mac and Linux (assuming gcc is on the path)
    CUDA_LIB_Location = '/usr/local/cuda/lib64';
    Host_Compiler_Location = '';
    PIC_Option = ' --compiler-options -fPIC ';
end
% !!! End of things to modify !!!

[pathstr, filename, ext,] = fileparts(cuFileName);

nvccCommandLine = [ ...
    'nvcc --compile ' cuFileName ' ' Host_Compiler_Location ' ' ...
    ' -o ' filename '.o ' ...
    PIC_Option ...
    aa ...
    ' -I' matlabroot '/extern/include ' ...
    ];
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-15 20:51:28 | 显示全部楼层
一心一日撒 发表于 2013-4-15 20:34
我都按照你图片说的弄了。
if ispc % Windows
    CUDA_LIB_Location = 'C:\Program Files\NVIDIA GP ...

请看准图片中的aa,在nvccCommandLine中已经添加了aa就无需在用  ' -I' matlabroot '/extern/include ' ...
回复 支持 反对

使用道具 举报

发表于 2013-4-16 16:25:56 | 显示全部楼层
蓝云风翼 发表于 2013-4-15 20:51
请看准图片中的aa,在nvccCommandLine中已经添加了aa就无需在用  ' -I' matlabroot '/extern/include ' . ...

版主你好,我改了以后,还是有那个问题。我问一下和我的64位机器有关系吗,还有你上面的那个“vs 编译器的正确路径”图片显示不了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-16 16:36:04 | 显示全部楼层
本帖最后由 蓝云风翼 于 2013-4-16 16:51 编辑
一心一日撒 发表于 2013-4-16 16:25
版主你好,我改了以后,还是有那个问题。我问一下和我的64位机器有关系吗,还有你上面的那个“vs 编译器的 ...


与64位无关,取决于你的配置,以下红色部分确保和你的系统VS 位置matlab位置配置正确
if ispc % Windows
    CUDA_LIB_Location = 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64';
    Host_Compiler_Location = '-ccbin "D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"';

    PIC_Option = '';
   aa=' -I"D:\Program Files\MATLAB\R2012a\extern\include"'; 注意这里的引号,依次为单引号 双引号 双引号 单引号
else % Mac and Linux (assuming gcc is on the path)
    CUDA_LIB_Location = '/usr/local/cuda/lib64';
    Host_Compiler_Location = '';
    PIC_Option = ' --compiler-options -fPIC ';
end


nvccCommandLine = [ ...
    'nvcc --compile ' cuFileName ' ' Host_Compiler_Location ' ' ...
    ' -o ' filename '.o ' ...
    PIC_Option ...
    aa ...
    ];
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-2-18 02:09 , Processed in 0.076139 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表