2015-06-12 73 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

相關問題