在Matlab中执行CUDA代码

3

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

我已经阅读了Mathworks网站上的文档,但我仍然无法完全理解。我知道有两种主要的方法可以做到这一点,一种是通过构建一个带有函数parallel.gpu.CUDAKernel的对象来执行CUDA内核,另一种是通过将.cu文件转换为mex文件。但是,在使用这两种方法时,我还有一些不明白的事情。

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

使用mexcuda命令时,您不需要另一个IDE。.cu文件由Matlab编译。但在Windows下,Matlab将需要Visual cpp编译器。根据Matlab版本和CUDA工具包版本,它需要特定版本的Visual编译器。 - Amos Egel
1个回答

4

两种方式都可以实现。

如果您想要灵活性,我的建议是使用 .c(或 .cpp)文件编写您的 .cu 文件*。一旦您有了一些基本的东西,您应该能够编写一个mex包装器来获取 MATLAB 变量并将它们转换为 C/C++,以便您可以将它们传递到 CUDA 中并从 CUDA 中传递回来。这需要您拥有与您的 MATLAB、CUDA 和操作系统版本兼容的编译器。例如,在 Windows 中,Visual Studio 2013 与大多数版本的 MATLAB 和 CUDA 兼容,但请检查。通常,这是通过在设置一些 XML 文件后将 nvcc 链接到 mex 编译器来完成的(请参见我工具箱中的示例)。这种方法不仅使您能够完全灵活地使用 CUDA,而且还使您能够完全灵活地使用任何您可能想要与您的内核一起使用的东西,例如 tensorflow、eigen、SQL 等等。它是完全灵活的。

如果你只想使用简单的方法加速一些操作,可以使用Parallel computing toolbox与gpuarray来进行标准MATLAB操作,或者使用parallel.gpu.CUDAKernel来进行自定义内核。要使用后者,您需要编译一个ptx文件,这似乎非常简单。从先验上看,这给了你更少的灵活性,因为它只运行一个内核,但是通常复杂的GPU程序可能需要多个内核和数据处理技术,以及内核之间的通信等。然而,我个人没有尝试过,也许你可以实现完全的灵活性。让我知道,我会编辑答案。
简而言之,你的选择取决于你的应用/需求。
*在现代版本的MATLAB和mexcuda中,您可能不需要.c或.cpp文件。

为什么要添加 .c 或 .cpp 文件,而不是只有一个 .cu 文件并使用 mexcuda 进行编译呢? - Amos Egel
@AmosEgel 我必须承认我需要更新我的知识,以了解最新版本的内容,因为我基本上使用的是2014b,其中这是唯一的方法(我相信mexcuda是2016b)。然而,如果你只有一个.cu文件,你会将void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray const *prhs[])作为函数名吗?你不需要将MATLAB类型转换为CUDA类型吗? - Ander Biguri
是的,使用mexcuda时,通常在.cu文件中有两个函数:一个作为__global__的内核,另一个作为voidmexFunction。在后者中,Matlab输入被转换为CUDA类型,然后调用cuda内核。 - Amos Egel
1
在这方面,仅使用 .cu 文件(而不是 .cpp)的缺点是 .cu 文件的编写方式是针对 Matlab 特定的。当从其他语言(如 Python)使用相同的内核时,您将删除 mexFunction。但优点是您需要管理较少的文件并学习较少的内容。 - Amos Egel
@AmosEgel 的确!最终,这是一种哲学选择,而不是编程选择 ;) - Ander Biguri
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接