【问题标题】:Multithreading with MatlabMatlab 多线程
【发布时间】:2011-10-09 04:49:17
【问题描述】:

我正在 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 时,我们对该选项有任何限制吗? 有人试过这样的吗?

编辑:有没有不需要 Parallel Toolbox 的选项?

【问题讨论】:

标签: c multithreading matlab mex


【解决方案1】:

使用 MATLAB 内置的多线程功能(例如 parfor)可能会更好。事实上,许多 MATLAB 函数已经是多线程的(包括矩阵运算),因此除了将 for 替换为 parfor 之外,您应该不需要自己进行并行化。 (一般情况下,while 循环不能并行化。)

【讨论】:

  • Parfor 需要 Matlab 并行工具箱,我的 Matlab 许可证上没有它
【解决方案2】:

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

【讨论】:

  • 如果没有并行计算工具箱,还有什么选择吗?
  • @rlbisbe:这里是使用 OpenMP 的并行代码示例(只要您不从衍生线程调用 MEX API 函数):walkingrandomly.com/?p=1795(也请查看 cmets 以获取建议的替代方案PCT)
【解决方案3】:

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

【讨论】:

  • 您的回答与您 5 小时前发布的回答有何不同?请让你的答案充实。如果您只是说并行工具箱很便宜,最好在您的回答下写成评论。
  • 大声笑,确实,这与你或 Edric 的回答没有太大区别。感谢您指出这一点。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多