【问题标题】:Matlab Mexfiles and Cuda: Evaluate function handleMatlab Mexfiles 和 Cuda:评估函数句柄
【发布时间】:2023-03-31 05:58:01
【问题描述】:

你好, 我有一个我想在 CUDA 的帮助下并行化的 mex 文件。当前的功能是:我将一个函数句柄和大量“点”传递给 mex 文件,它以顺序模式(在 CPU 上)评估每个点上的函数。因此它使用类似的东西:

mxArray* y;
const mxArray *e[2] = {functionHandle, point};
mexCallMATLAB(1, &y, 2, (mxArray **)e, "feval");

使用 matlab 函数 feval 在点上评估函数句柄。现在我想知道当我尝试通过 CUDA 并行计算时会发生什么:这会正常工作吗?因为如果在 CPU 上使用 mexCallMATLAB 进行评估,那么使用 CUDA 不会有任何好处。但是怎么办呢?我无法想象在不使用 matlab 函数 feval 的情况下直接评估 C 中某个点的函数句柄的任何方法......

到目前为止,谢谢! 你会帮我很多的!

【问题讨论】:

    标签: function matlab cuda handle mex


    【解决方案1】:

    不,mexCallMATLAB 不能从 GPU 调用。通常,不能从 CUDA 内核的主体中进行主机端调用。

    您可能会发现,如果您有权访问Parallel Computing Toolbox,则可以将GPUArraysarrayfun 一起使用。例如,如果您希望跨多个点评估的函数如下所示:

    function y = myFcn( x )
    y = 1;
    for ii = 1:10
      y = sin(x * y);
    end
    

    然后你可以像这样在 GPU 上调用它:

    gx = gpuArray( rand(1000) );
    gy = arrayfun( @myFcn, gx );
    

    【讨论】:

    • 哇,谢谢,我想这就是我要找的帖子!现在只是一个问题:如果我不能在 CUDA 内核之外使用mexCallMATLAB,我该如何从我的 mex 文件中访问它?
    • 其实我的建议是真的不要直接使用CUDA内核,而是使用arrayfun方法作为替代。如果您有想要在 MATLAB 中运行的现有 CUDA 代码,Parallel Computing Toolbox 支持“CUDAKernel”对象来帮助解决这个问题。
    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多