2015-06-12 76 views
1

我想在mex文件中使用OpenMP并行化我的Matlab代码的一部分。我想并行在theMatlab代码的段是:如何使用Mexcallmatlab调用用户定义的函数?

对于i = 1:

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:N

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

end 

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

对不起,lenghty问题。任何帮助我能在此将得到高度赞赏。

+0

我不会建议在循环中调用'mexCallMATLAB',更不用说试图用OpenMP来实现了。使用MEX的好处是如果您重新实现'CALC '本身。 – chappjc

+0

好的。让我试着去实现它。谢谢@chappjc – Amanda

回答

1

您需要使用多个MATLAB程序,以便能够并行运行多个电话。最简单的办法就是使用并行计算工具箱,并使用parfor而不是for循环

+0

Navan,谢谢你的回应。是的,我已经做到了。我也想实现这一点,并比较他们的表现。有什么办法可以帮助我吗?你以前用过MexcallMatlab吗? – Amanda

+0

您可能需要使用并行机制启动多个MATLAB会话,然后让MATLAB调用将发出mexCallMATLAB的mex文件。当MATLAB启动时,你可以使用“-r”参数来运行你的mexFunction。 – Navan

相关问题