c - 多线程与 Matlab

标签 c multithreading matlab mex

我正在 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?

最佳答案

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

关于c - 多线程与 Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6759088/

相关文章:

c++ - 在linux下运行补丁时出现问题

c - 使用 FFTW 的线程段错误

Java Fork Join 池吃掉所有线程资源

c# - 这个线程安全吗?多次命中断点

matlab - Matlab 中的基本文件 I/O

c - 如何使用 setsockopt 将 ToS 添加到流中?

更改 stdout 的文件位置指示符

java - 在多线程java程序中处理静态变量

arrays - MATLAB:定义矩阵的 n 个子集

MATLAB:在 for 循环中绘制子图