【问题标题】:How Do I use Mexcallmatlab to Call a User-defined function?如何使用 Mexcallmatlab 调用用户定义的函数?
【发布时间】:2015-06-13 00:43:28
【问题描述】:

我正在尝试在 mex 文件中使用 OpenMP 并行化我的一段 Matlab 代码。 Matlab 代码中我要并行化的部分是:

对于 i = 1 : n

    D(:, i) = CALC(A, B(:,i), C(i));

end

我写这个是为了并行化它:

 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
size_t r,n,i,G;
double *A, *B, *C, *D;
int nthreads;
nthreads = 4;
A = mxGetPr(prhs[0]); /* first input matrix */
B = mxGetPr(prhs[1]); /* second input matrix */
C = mxGetPr(prhs[2]);/* third input matrix */
/* dimensions of input matrices */
r = mxGetN(prhs[0]);
n = mxGetN(prhs[1]);
plhs[0] = mxCreateDoubleMatrix(r,n, mxREAL);
D = mxGetPr(plhs[0]);
G=n/nthreads;
omp_set_num_threads(nthreads);
#pragma omp parallel for schedule (dynamic, G)
  {
   for i = 1 : n
        D(:, i) = CALC(A, B(:,i), C(i));
  }
 }

CALC 是我编写的一个 Matlab 函数。我的挑战是如何使用 Mexcallmatlab 将 CALC 函数调用到 mex 文件中,以便它可以在我的 mex 文件中并行执行它,并将 D 的每一列的元素(即 D(:, i) 返回到我的Matlab代码。

很抱歉这个冗长的问题。非常感谢我能得到的任何帮助。

【问题讨论】:

  • 我不建议在循环中调用mexCallMATLAB,更不用说尝试使用 OpenMP。使用 MEX 的好处是,如果您重新实现 CALC 本身。
  • 好的。让我尝试实现它。谢谢@chappjc

标签: matlab mex


【解决方案1】:

您需要使用多个 MATLAB 进程才能并行运行多个调用。最简单的方法是使用并行计算工具箱并使用 parfor 而不是 for 循环。

【讨论】:

  • 纳文,感谢您的回复。是的,我已经做到了。我也想实现这个并比较他们的表现。有什么办法可以帮助我解决这个问题吗?你以前用过 MexcallMatlab 吗?
  • 您可能需要使用并行机制启动多个 MATLAB 会话,然后让 MATLAB 调用您的 mex 文件,该文件将发出 mexCallMATLAB。您可以在启动 MATLAB 时使用“-r”参数在 MATLAB 启动时运行您的 mexFunction。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多