在Matlab

时间:2018-01-05 11:25:05

标签: matlab cuda

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

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

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

1 个答案:

答案 0 :(得分:4)

这两件事都可行。

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

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

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

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