在 Matlab 中执行 CUDA 代码
Posted
技术标签:
【中文标题】在 Matlab 中执行 CUDA 代码【英文标题】:Executing CUDA code In Matlab 【发布时间】:2018-06-15 05:02:23 【问题描述】:我想问是否有人在 Matlab 上运行过一些包含 CUDA 代码的 C 代码?
我已阅读 Mathworks 网站上的文档,但我仍然无法完全理解它。我确实理解这是两种主要的方法,您可以通过使用函数parallel.gpu.CUDAKernel
构造一个对象来执行 CUDA 内核,或者从 .cu 文件中构造一个 mex 文件。使用这两种方法时,有些事情虽然我不明白。
【问题讨论】:
使用mexcuda
command 时,您不需要其他IDE。 .cu 文件由 Matlab 编译。但在 Windows 下,Matlab 将需要 Visual cpp 编译器。根据 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, ... 完全的灵活性。
如果您只想使用简单的方法加速一些运算,请使用并行计算工具箱,gpuarray
s 用于标准 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
。但好处是你需要管理的文件更少,学到的东西也更少。以上是关于在 Matlab 中执行 CUDA 代码的主要内容,如果未能解决你的问题,请参考以下文章