2

我有 Windows XP 64 位、MATLAB R2012a(这里也有 R2010a,但未安装)、VS 2010(也有 VS 2008/VS 2012,但未安装)和 CUDA 5.0 已安装。

是否可以在 MATLAB 中使用这些编译 CUDA 代码来创建 mex 文件?任何人都可以帮助完成必要的步骤或需要进一步安装任何东西吗?

提前致谢

4

3 回答 3

3

使用 MATLAB 2013

如果您可以升级到 2013,请继续阅读,否则请转到页面底部以获取 2012 版本的一些建议。即使您不打算升级,仍然阅读第一部分,它可能会给您一些线索。

我一直在使用 MATLAB 2012 编译 MEX 函数时遇到问题。升级到 2013 使我可以很容易地编译 CUDA MEX 文件,而不必担心在 MATLAB 中调用 NVCC 并带有所有疯狂的标志。

您只需mexopts.bat要从您的 MATLAB 安装中复制该文件:

matlabroot\toolbox\distcomp\gpu\extern\src\mex\win64\mexopts.bat2(其中 matlabroot 是 MATLAB 安装文件夹,类似于:C:\Program Files\MATLAB\Matlab2013a。)

到包含.cu具有mex入口点功能的文件的项目文件夹。此外,您需要添加两个 CUDA 库:cuda.libcudart.libCUDA 安装文件夹中的同一文件夹。我已经在我的项目中包含了这两个库,它们也应该在您的 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

于 2013-07-29T19:45:34.407 回答
1

我建议使用使用Visual Studio 编译 CUDA mex 文件中的过程:

配置:Matlab 2010a、Visual Studio 2010、Intel 64bit 机器。

  1. 文件 → 新项目

  2. 选择 MFC DLL 以及项目的名称和位置
    选择确定

  3. 选择下一步

  4. 选择完成(不要更改任何选择)

  5. 解决方案资源管理器→右键单击项目名称→构建自定义→CUDA 5.0→确定

  6. 项目→添加新项目;选择 C++ 文件 (.cpp); 为文件选择一个名称

  7. 添加行 #include "stdafx.h"; 当然,酌情包括“mex.h”和<cuda.h>、<cuda_runtime.h>等

  8. 在上述包含行下编写包含 mexFunction 的代码;此 .cpp 文件应仅包含 CPU 端代码,即 mex 函数和其他 C++ 函数。请注意,mex 函数以及 C++ 函数不应包含内核函数调用(不允许使用 <<< >>> 语法);内核调用应包含在此 .cpp 文件中声明为 extern "C" 的“包装函数”中,然后在 .cu 文件中定义(见下一点)

  9. 项目→添加新项目;选择 C++ 文件 (.cpp); 为文件选择一个名称,但使用 .cu 扩展名;此 .cu 文件应包含所需的全局设备功能

  10. 将以下行添加到 .def 文件

库“TestMex”导出 mexFunction

将 TestMex 替换为 .cpp 文件的名称

  1. 项目 → 属性 → 配置属性 → C/C++ &rarr 常规 → 附加包含目录 → 添加 C:\Program Files\MATLAB\R2010a\extern\include

  2. 项目 → 属性 → 配置属性 → 链接器 &rarr 常规 → 输出文件 → $(OutDir)$(ProjectName).mexw64

  3. 项目 → 属性 → 配置属性 → 链接器 &rarr 输入 → 附加依赖项 → C:\Program Files\MATLAB\R2010a\extern\lib\win64\microsoft\libmex.lib; C:\Program Files\MATLAB\R2010a\extern\lib\win64\microsoft\libmx.lib

  4. 项目 → 属性 → 配置属性 → CUDA C/C++ &rarr 设备 → 选择您的计算能力

  5. 项目→属性→配置属性→配置管理器→活动解决方案平台→新建→x64→从Win32复制设置

  6. 项目 → 属性 → 配置属性 → 链接器 &rarr 输入 → 附加依赖项 → 添加 cudart.lib

  7. 包含已编译的 mex 库的目录是 ..\x64\Debug

您可以在附加的 Visual Studio 2010 项目中找到一个已完成的示例。

该程序已针对 CUDA 5.0、Visual Studio 2010 和 Matlab 2010a/2012b 进行了测试,但使用上述产品其他版本的人可能也会对它感兴趣。

于 2013-08-08T07:21:05.177 回答
0

我注意到在 Matlab2015b 中,您可以编译 .cu 文件,如下所示:

mexcuda XXX.cu

我已经使用了一段时间了,它更容易!希望这可以帮助您,尽管由于您没有使用 2015b,因此它可能无济于事。

于 2015-11-12T18:28:22.237 回答