我有Windows XP 64位,MATLAB R2012a(R2010a也在这里,但未安装),VS 2010(VS 2008 / VS 2012也可用,但未安装)和CUDA 5.0安装..
是否可以在MATLAB中使用这些代码编译CUDA代码来创建mex文件?任何人都可以帮助完成必要的步骤或任何需要安装的东西吗?
提前致谢
答案 0 :(得分:3)
使用MATLAB 2013
如果您可以升级到2013年阅读,请转到页面底部查看2012版本的一些建议。即使你不打算升级,仍然阅读第一部分,它可能会给你一些线索。
我一直有使用MATLAB 2012来编译MEX功能的问题。升级到2013年让我很容易编译CUDA MEX文件而不用担心在MATLAB中调用带有所有疯狂标志的NVCC。
您只需要从MATLAB安装中复制mexopts.bat
文件:
matlabroot\toolbox\distcomp\gpu\extern\src\mex\win64\mexopts.bat
2 (其中matlabroot是MATLAB安装文件夹,类似于:C:\Program Files\MATLAB\Matlab2013a
。)
到包含带.cu
入口点函数的mex
文件的项目文件夹。此外,您需要将两个CUDA库cuda.lib
和cudart.lib
添加到CUDA安装文件夹的同一文件夹中。我在我的project中包含了这两个库,它们也应该可以在CUDA Toolkit安装文件夹中的某个位置使用。
然后你会去MATLAB并运行mex -setup
来选择一个编译器。由于安装了Visual Studio 2010,因此您应该在列表中看到它。只需按照屏幕上的说明操作,然后选择您的编译器 - more details即可。如果您没有看到编译器或出现问题,可以尝试安装Windows SDK。另请参阅此post有关编译器和Visual Studio的版本。
如果你想看到你的MEX编译我的project结帐。下载内容并将其放在计算机中的某个文件夹中,然后打开MATLAB。然后转到该目录并在MATLAB中通过在命令窗口中使用pwd
确认您确实在该目录中;它会告诉您是否在该目录中,但要确保将文件夹和子文件夹添加到文件路径中(右键单击MATLAB中的文件夹并选择添加路径>文件夹和子文件夹)
然后,运行mex f.cu
。这将编译CUDA MEX文件并将库放在同一个文件夹中,您可以在MATLAB中将f
作为函数调用,而MATLAB无需关心它来自何处。要查看它是否真的有效,您可以创建gpuArray
并在其上调用f
函数。像这样:
input = gpuArray.ones(100,100); % makes an array of ones (100x100) on the gpu.
y = f(input) % will perform the operation defined in f.cu
你会得到这样的东西:
在MATLAB 2012中编译MEX文件的建议:
我甚至没有成功在MATLAB 2012,64位Windows上编译MEX文件,即使使用Visual Studio 2010 Professional也是如此。但首先,您可以查看此文档page以获取MEX文件和CUDA。另请查看此page以获取有关在MATLAB中编译MEX文件的一些常规信息,它可能会为您提供有关所涉及事项的一些想法。完成这些页面后,查看NVCC编译器以及如何在MATLAB中正确调用它。我一直很难为我做到这一点,而且我从未取得过成功。但不要气馁。关键是看看你是否可以使用MATLAB中的编译器编译基本的C或C ++文件。一旦成功,就转向编译CUDA。如果没有任何效果,请查看此post以了解有关直接在Visual Studio中进行编译的信息。祝你好运!
参考文献:
2:http://www.mathworks.com/help/distcomp/create-and-run-mex-files-containing-cuda-code.html
答案 1 :(得分:1)
我建议使用Compiling CUDA mex files with Visual Studio中的程序:
配置:Matlab 2010a,Visual Studio 2010,Intel 64bit机器。
档案→新项目
选择MFC DLL以及项目名称和位置
选择确定选择下一步
选择完成(不要更改任何选择)
解决方案资源管理器→右键单击项目名称→构建 自定义→CUDA 5.0→确定
项目→添加新项目;选择C ++文件(.cpp);选择名称 文件
添加#include“stdafx.h”行;当然,包括“mex.h”和 < cuda.h>,< cuda_runtime.h>等等。
在上面的include下编写包含mexFunction的代码 线;这个.cpp文件应该只包含CPU端代码,即 mex函数和其他C ++函数。注意mex函数为 以及C ++函数不应包含内核函数 调用(不允许<<>>>语法);内核调用应该 包含在此.cpp文件中声明的“包装函数”中 extern“C”然后在.cu文件中定义(参见下一点)
项目→添加新项目;选择C ++文件(.cpp);选择名称 该文件,但使用.cu扩展名;这个.cu文件应该包含 需要全球以及设备功能
- 醇>
将以下行添加到.def文件
LIBRARY“TestMex”EXPORTS mexFunction
将TestMex替换为.cpp文件的名称
项目→属性→配置属性→C / C ++& rarr 常规→其他包含目录→添加C:\ Program 文件\ MATLAB \ R2010a版本\的extern \包括
项目→属性→配置属性→链接器& rarr 常规→OutPut文件→$(OutDir)$(ProjectName).mexw64
项目→属性→配置属性→链接器& rarr 输入→附加依赖项→C:\ Program FILES \ MATLAB \ R2010a版本\ EXTERN \ LIB \ Win64的\微软\ libmex.lib; C:\ PROGRAM 文件\ MATLAB \ R2010a版本\的extern \ lib中\ Win64的\微软\ libmx.lib
项目→属性→配置属性→CUDA C / C ++& rarr 设备→选择您的计算能力
项目→属性→配置属性→配置 Manager→Active Solution Platform→新建→x64→复制设置 来自Win32
项目→属性→配置属性→链接器& rarr 输入→附加依赖项→添加cudart.lib
- 醇>
包含已编译的mex库的目录是.. \ x64 \ Debug
您可以在attached Visual Studio 2010 project中找到一个精心设计的示例。
该程序已针对CUDA 5.0,Visual Studio 2010和Matlab 2010a / 2012b进行了测试,但也许对使用其他版本的上述产品的人也有兴趣。
答案 2 :(得分:0)
我注意到在Matlab2015b中,您可以编译.cu文件,如下所示:
mexcuda XXX.cu
我已经使用了一段时间,而且它更容易!希望这可以帮助你,虽然它可能没有多大帮助,因为你没有使用2015b。