6

我正在 Matlab 上开展一个项目,我们必须优化性能,我正在考虑并行化从 .m 文件进行的几个函数调用。

这个想法很简单,从一个 Matlab 文件 (.m) 调用一个编译为 MEX 的 C 文件,然后从该 C 文件创建几个线程并从每个线程回调 matlab 函数。

理论有效,我可以创建线程,也可以调用matlab函数,问题是我不能从线程调用matlab函数:

//Global variables
mxArray **g_plhs;
mxArray **g_prhs;
int g_nlhs;
int g_nrhs;

//Thread function
DWORD WINAPI my_function( LPVOID lpParam ) 
{
    mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,"matlab_function");
    return 0; 
}


//Main function
void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[]) {

    DWORD dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS]; 
    g_plhs = plhs;
    g_prhs = prhs;
    g_nlhs = nlhs;
    g_nrhs = nrhs;

    hThreadArray[0] = CreateThread( 
        NULL,                   
        0,                      
        my_function,            
        NULL,                   
        0,                      
        &dwThreadIdArray[0]);   

    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

    for(i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
    }
}

使用 matlab 时,我们对该选项有任何限制吗?有人尝试过这样的事情吗?

编辑:有没有不需要并行工具箱的选项?

4

4 回答 4

6

您只能从 MATLAB 主线程调用 mx* 和 mex* 函数。您可以编写多线程 MEX 文件,前提是这些文件在 mx 接口以下的级别上工作。如果您需要多个 MATLAB 解释器,则需要多个 MATLAB 进程。一种方法是通过@You 指出的并行计算工具箱。这为您提供了同时运行事物的PARFOR循环和SPMD块。

于 2011-07-20T11:06:18.490 回答
3

使用 MATLAB 内置的多线程功能(例如parfor. 事实上,许多 MATLAB 函数已经是多线程的(包括矩阵运算),所以除了替换forparfor. (通常,while循环不能并行化。)

于 2011-07-20T08:45:54.850 回答
1

你最好的选择是parfor。如果您是学生,您可以以相当便宜的价格获得并行工具箱。如果您认真对待性能,即使全价也不多。您上面的代码容易出错且难以测试。使用parfor直观且干净。

于 2011-07-20T14:24:14.850 回答
1

我很惊讶每个人都在推动parfor. 我鼓励您至少考虑一下您是否可以设计您的算法以从 Matlab 调用并从多线程 C/C++ 低级别运行关键部分而不回调 mex。这通常应该是可能的。特别是如果您使用 Matlabprofiler或类似工具来确定分析的哪些步骤是瓶颈,那么您可能只能在多线程 C 中编写 1 或 2 个步骤。

另一种方法是用 Java 编写并行性,这在 Matlab 中更容易使用。

您可能想要查看的其他选项包括在 Matlab Central或librarymulticore上提交。两者都有点笨拙,都是为进程间并行设计的(你必须运行多个 Matlab 实例),所以不适合非常细粒度、复杂的并行。但是对于简单地将工作分成 4 或 8 或 16 个部分,他们应该完成工作,并且至少有合理的社区支持。我还没有尝试过,但它看起来很有希望。作为奖励,这些应该可以在多台机器上工作,尽管它们可能需要一个共享的网络文件系统。MatlabMPImulticoreMatlabMPI

于 2011-08-26T18:13:53.313 回答