【问题标题】:Executing CUDA code In Matlab在 Matlab 中执行 CUDA 代码
【发布时间】:2018-06-15 05:02:23
【问题描述】:

我想问是否有人在 Matlab 上运行过一些包含 CUDA 代码的 C 代码?

我已阅读 Mathworks 网站上的文档,但我仍然无法完全理解它。我确实理解这是两种主要的方法,您可以通过使用函数parallel.gpu.CUDAKernel 构造一个对象来执行 CUDA 内核,或者从 .cu 文件中构造一个 mex 文件。使用这两种方法时,有些事情虽然我不明白。

  • 使用 mex 方法,我应该先使用 Visual Studio 等其他 IDE 编译 .cu 文件,然后再在 Matlab 中编译 mex 文件吗?如果是这样,如何在 .cu 文件中没有 main() 函数的情况下编译 .cu 文件,当我尝试在 VS 中以这种方式编译它时总是会出错,或者在 .cu 中有一个 main 函数是否可以文件并将指向 GPU 数组的指针传递给主函数?
  • 对于 CUDA 内核方法,应该在 VS 中编译内核,那么如何编译?

【问题讨论】:

  • 使用mexcudacommand 时,您不需要其他IDE。 .cu 文件由 Matlab 编译。但在 Windows 下,Matlab 将需要 Visual cpp 编译器。根据 Matlab 版本和 CUDA 工具包版本,需要特定版本的可视化编译器。

标签: matlab cuda


【解决方案1】:

这两种方法都可以。

如果您想获得灵活性,我的建议是使用 .c(或 .cpp)文件*编写您的 .cu 文件。一旦你有一些基本的东西工作,你应该能够编写a mex wrapper around it 来获取 MATLAB 变量并将它们转换为 C/C++,这样你就可以将它们传递给和从 CUDA 传递。这要求您拥有一个与您的 MATLAB、CUDA 和 OS 版本兼容的编译器。一个例子是寡妇中的 Visual Studio 2013 和大多数版本的 MATLAB 和 CUDA,但请检查。通常这是通过在设置一些 xml 文件后将 nvcc 链接到 mex 编译器来完成的(请参阅example here from my toolbox)。这种方法为您提供了充分的灵活性,不仅可以使用 CUDA,还可以使用您可能希望与内核一起使用的任何东西,例如tensorflow, eigen, SQL, ... 完全的灵活性。

如果您只想使用简单的方法加速一些运算,请使用并行计算工具箱,gpuarrays 用于标准 MATLAB 运算,parallel.gpu.CUDAKernel 用于您自己的内核。要使用第二个,您需要编译一个 ptx 文件,which seems pretty straightforward。先验这给了你更少的灵活性,因为它只会运行一个内核,但通常复杂的 GPU 程序可能需要几个内核和数据处理技术,以及内核之间的通信等。但是我个人还没有尝试过,也许你可以实现充分的灵活性。告诉我,我会编辑答案。

简而言之,您的选择取决于您的应用程序/需求。

*现代版本的 MATLAB 和 mexcuda 可能不需要 .c 或 .cpp 文件。

【讨论】:

  • 为什么要添加 .c 或 .cpp 文件而不是仅添加 .cu 文件并使用 mexcuda 编译它?
  • @AmosEgel 我必须承认我需要用最新版本来更新我的知识,因为我基本上使用了 2014b,这是唯一的方法(mexcuda 我相信是 2016b)。但是,如果你只做一个 .cu 文件,你会添加 void mexFunction(int nlhs , mxArray *plhs[], int nrhs, mxArray const *prhs[]) 作为函数名吗? MATLAB类型到CUDA类型不需要转换吗?
  • @AmosEgel 拥有 c/cpp 文件的明显附加值也是向后兼容,ofc。
  • 是的,当使用mexcuda 时,.cu 文件中通常有两个函数:内核作为__global__mexFunction 作为void。在后者中,将Matlab输入转换为CUDA类型并调用cuda内核。
  • 在这方面,仅使用 .cu 文件(而不使用 .cpp)的缺点是 .cu 文件的编写方式特定于 Matlab。当使用来自其他语言(如 Python)的相同内核时,您将删除 mexFunction。但好处是你需要管理的文件更少,学到的东西也更少。
猜你喜欢
  • 2015-02-25
  • 2017-12-22
  • 2011-01-27
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多