在 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 文件。使用这两种方法时,有些事情虽然我不明白。

使用 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 工具包版本,需要特定版本的可视化编译器。 【参考方案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。但好处是你需要管理的文件更少,学到的东西也更少。

以上是关于在 Matlab 中执行 CUDA 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用CUDA加速MATLAB计算速度?

matlab如何gpu加速

设备内存空间中的 cuda 程序内核代码

使用共享内存时不执行 CUDA 内核代码

CUDA C

如何在Linux平台下的MATLAB中调试.CU文件