从CUDA代码创建mex文件

时间:2013-06-14 09:04:18

标签: matlab cuda mex

我有Windows XP 64位,MATLAB R2012a(R2010a也在这里,但未安装),VS 2010(VS 2008 / VS 2012也可用,但未安装)和CUDA 5.0安装..

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

提前致谢

3 个答案:

答案 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.libcudart.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

你会得到这样的东西:

enter image description here

在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机器。

     
      
  1. 档案→新项目

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

  4.   
  5. 选择下一步

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

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

  10.   
  11. 项目→添加新项目;选择C ++文件(.cpp);选择名称   文件

  12.   
  13. 添加#include“stdafx.h”行;当然,包括“mex.h”和   < cuda.h>,< cuda_runtime.h>等等。

  14.   
  15. 在上面的include下编写包含mexFunction的代码   线;这个.cpp文件应该只包含CPU端代码,即   mex函数和其他C ++函数。注意mex函数为   以及C ++函数不应包含内核函数   调用(不允许<<>>>语法);内核调用应该   包含在此.cpp文件中声明的“包装函数”中   extern“C”然后在.cu文件中定义(参见下一点)

  16.   
  17. 项目→添加新项目;选择C ++文件(.cpp);选择名称   该文件,但使用.cu扩展名;这个.cu文件应该包含   需要全球以及设备功能

  18.   
  19. 将以下行添加到.def文件

  20.         

    LIBRARY“TestMex”EXPORTS mexFunction

         

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

         
        
    1. 项目→属性→配置属性→C / C ++& rarr   常规→其他包含目录→添加C:\ Program   文件\ MATLAB \ R2010a版本\的extern \包括

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

    4.   
    5. 项目→属性→配置属性→链接器& rarr   输入→附加依赖项→C:\ Program   FILES \ MATLAB \ R2010a版本\ EXTERN \ LIB \ Win64的\微软\ libmex.lib; C:\ PROGRAM   文件\ MATLAB \ R2010a版本\的extern \ lib中\ Win64的\微软\ libmx.lib

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

    8.   
    9. 项目→属性→配置属性→配置   Manager→Active Solution Platform→新建→x64→复制设置   来自Win32

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

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

    14.         

      您可以在attached Visual Studio 2010 project中找到一个精心设计的示例。

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

答案 2 :(得分:0)

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

mexcuda XXX.cu

我已经使用了一段时间,而且它更容易!希望这可以帮助你,虽然它可能没有多大帮助,因为你没有使用2015b。