我有 Windows XP 64 位、MATLAB R2012a(这里也有 R2010a,但未安装)、VS 2010(也有 VS 2008/VS 2012,但未安装)和 CUDA 5.0 已安装。
是否可以在 MATLAB 中使用这些编译 CUDA 代码来创建 mex 文件?任何人都可以帮助完成必要的步骤或需要进一步安装任何东西吗?
提前致谢
使用 MATLAB 2013
如果您可以升级到 2013,请继续阅读,否则请转到页面底部以获取 2012 版本的一些建议。即使您不打算升级,仍然阅读第一部分,它可能会给您一些线索。
我一直在使用 MATLAB 2012 编译 MEX 函数时遇到问题。升级到 2013 使我可以很容易地编译 CUDA MEX 文件,而不必担心在 MATLAB 中调用 NVCC 并带有所有疯狂的标志。
您只需mexopts.bat
要从您的 MATLAB 安装中复制该文件:
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 安装文件夹中的同一文件夹。我已经在我的项目中包含了这两个库,它们也应该在您的 CUDA Toolkit 安装文件夹中的某个位置可用。
然后你会去 MATLAB 并运行mex -setup
以选择一个编译器。由于您已安装 Visual Studio 2010,您应该会在列表中看到它。只需按照屏幕上的说明选择您的编译器 -更多详细信息。如果您没有看到编译器或出现问题,您可以尝试安装Windows SDK。另请查看有关编译器和 Visual Studio 版本的这篇文章。
如果您想查看您的 MEX 编译结果,请查看我的项目。下载内容并将它们放在计算机某处的文件夹中,然后打开 MATLAB。pwd
然后转到该目录并在 MATLAB 中通过在命令窗口中使用确认您确实在该目录中;它会告诉您您是否在该目录中,但请确保将文件夹和子文件夹添加到文件路径中(右键单击 MATLAB 中的文件夹并选择添加路径 > 文件夹和子文件夹)
然后,运行mex f.cu
。这将编译 CUDA MEX 文件并将库放在同一个文件夹中,您可以f
在 MATLAB 中作为函数调用,而 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 文件的建议:
即使使用 Visual Studio 2010 Professional,我也从未在 MATLAB 2012、64 位 Windows 上成功编译 MEX 文件。但首先,您可以查看此文档页面以获取 MEX 文件和 CUDA。另请查看此页面以获取有关在 MATLAB 中编译 MEX 文件的一些一般信息,它可能会让您对所涉及的内容有所了解。浏览完这些页面后,请查看 NVCC 编译器以及如何在 MATLAB 中正确调用它。我一直很难让它适合我,而且我从来没有成功过。但不要气馁。关键是看您是否可以使用 MATLAB 中的编译器编译基本的 C 或 C++ 文件。一旦成功,继续编译 CUDA。如果没有任何效果,请查看这篇关于直接在 Visual Studio 中编译的帖子。祝你好运 !
参考:
2:http ://www.mathworks.com/help/distcomp/create-and-run-mex-files- contains-cuda-code.html
我建议使用使用Visual Studio 编译 CUDA mex 文件中的过程:
配置:Matlab 2010a、Visual Studio 2010、Intel 64bit 机器。
文件 → 新项目
选择 MFC DLL 以及项目的名称和位置
选择确定选择下一步
选择完成(不要更改任何选择)
解决方案资源管理器→右键单击项目名称→构建自定义→CUDA 5.0→确定
项目→添加新项目;选择 C++ 文件 (.cpp); 为文件选择一个名称
添加行 #include "stdafx.h"; 当然,酌情包括“mex.h”和<cuda.h>、<cuda_runtime.h>等
在上述包含行下编写包含 mexFunction 的代码;此 .cpp 文件应仅包含 CPU 端代码,即 mex 函数和其他 C++ 函数。请注意,mex 函数以及 C++ 函数不应包含内核函数调用(不允许使用 <<< >>> 语法);内核调用应包含在此 .cpp 文件中声明为 extern "C" 的“包装函数”中,然后在 .cu 文件中定义(见下一点)
项目→添加新项目;选择 C++ 文件 (.cpp); 为文件选择一个名称,但使用 .cu 扩展名;此 .cu 文件应包含所需的全局和设备功能
将以下行添加到 .def 文件
库“TestMex”导出 mexFunction
将 TestMex 替换为 .cpp 文件的名称
项目 → 属性 → 配置属性 → C/C++ &rarr 常规 → 附加包含目录 → 添加 C:\Program Files\MATLAB\R2010a\extern\include
项目 → 属性 → 配置属性 → 链接器 &rarr 常规 → 输出文件 → $(OutDir)$(ProjectName).mexw64
项目 → 属性 → 配置属性 → 链接器 &rarr 输入 → 附加依赖项 → C:\Program Files\MATLAB\R2010a\extern\lib\win64\microsoft\libmex.lib; C:\Program Files\MATLAB\R2010a\extern\lib\win64\microsoft\libmx.lib
项目 → 属性 → 配置属性 → CUDA C/C++ &rarr 设备 → 选择您的计算能力
项目→属性→配置属性→配置管理器→活动解决方案平台→新建→x64→从Win32复制设置
项目 → 属性 → 配置属性 → 链接器 &rarr 输入 → 附加依赖项 → 添加 cudart.lib
包含已编译的 mex 库的目录是 ..\x64\Debug
您可以在附加的 Visual Studio 2010 项目中找到一个已完成的示例。
该程序已针对 CUDA 5.0、Visual Studio 2010 和 Matlab 2010a/2012b 进行了测试,但使用上述产品其他版本的人可能也会对它感兴趣。
我注意到在 Matlab2015b 中,您可以编译 .cu 文件,如下所示:
mexcuda XXX.cu
我已经使用了一段时间了,它更容易!希望这可以帮助您,尽管由于您没有使用 2015b,因此它可能无济于事。