嘿,有没有办法将 matlab m 函数编译(或者更好地说:'翻译')成 C 函数,以便我可以在 mex 文件的 CUDA 内核中使用它?多谢!
4 回答
MATLAB Coder将为 mex 文件生成 C 代码。我还没有要评估的副本,所以我无法与任何权威谈论生成代码的质量和性质。
但是,如果我不得不猜测,我会说生成的代码可能需要大量的按摩才能让它在你的 GPU 上运行。取决于你在做什么,你可能对像Jacket这样的产品有更好的运气。
您可以使用此函数调用从 C/fortran 调用 matlab(m 或 mex)函数。然后,您可以将其与您的 CUDA 内核接口。
然而,它可能不是最有效的做事方式。您可以为您拥有的 m 文件编写自己的 C 代码,或者如果其他人已经完成,请在 matlab 中央查找它。
C 函数将调用最终设置的设备变量并调用 CUDA 内核?
我最初想在一个项目中尝试这个,因为我认为这种方法比首先将我的所有 MATLAB 代码转换为 C 更容易,但我最终还是这样做了。
有一些用户创建的 MATLAB 脚本可帮助提供此功能,但由于它们不是来自 Mathworks,您必须自担风险使用它们。我试过了,从来没有发现任何恶意,但你永远不知道。由于其特定的复杂性,我无法让他们与我的项目一起工作,但它应该适用于更简单的任务。
1) NvMEX:这直接来自 Nvidia。http://developer.stage.nvidia.com/matlab-cuda http://www.mathworks.com/discovery/matlab-gpu.html
2)CUDA MEX:这是来自用户。http://www.mathworks.com/matlabcentral/fileexchange/25314-cuda-mex
这并不是您问题的直接答案,但如果您的目标只是让您的 MATLAB 代码在 GPU 上运行,那么您可能会发现,如果您可以访问Parallel Computing Toolbox,则可以将GPUArrays与arrayfun一起使用。例如,如果您希望跨多个点评估的函数如下所示:
function y = myFcn( x )
y = 1;
for ii = 1:10
y = sin(x * y);
end
然后你可以像这样在 GPU 上调用它:
gx = gpuArray( rand(1000) );
gy = arrayfun( @myFcn, gx );