Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用Matlab实现多线程_C_Multithreading_Matlab_Mex - Fatal编程技术网

C 用Matlab实现多线程

C 用Matlab实现多线程,c,multithreading,matlab,mex,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;

我正在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]);
    }
}
//全局变量
MX阵列**g_plhs;
MX阵列**g_prhs;
INTG_nlhs;
int g_nrhs;
//线程函数
DWORD WINAPI my_函数(LPVOID lpParam)
{
mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,“matlab_函数”);
返回0;
}
//主要功能
void MEX函数(整数nlhs,mxArray*plhs[],
整数nrhs,常量mxArray*prhs[]{
DWORD DWTHREADIRAY[最大线程数];
句柄hThreadArray[MAX_THREADS];
g_plhs=plhs;
g_prhs=prhs;
g_nlhs=nlhs;
g_nrhs=nrhs;
hThreadArray[0]=创建线程(
无效的
0,                      
我的功能,
无效的
0,                      
&dwThreadIdArray[0]);
WaitForMultipleObjects(最大线程、hThreadArray、TRUE、无限);

对于(i=0;i您可能最好使用MATLABs内置的多线程功能,例如。事实上,许多MATLAB函数已经是多线程的(包括矩阵运算),因此除了将
for
替换为
parfor
之外,您不需要自己进行并行处理。(通常,
while
循环不能并行化。)

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

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

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

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


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

你想并行化什么MATLAB代码?@rlbisbe:MEX API不是线程安全的:Parfor需要MATLAB并行工具箱,而我的MATLAB许可证上没有它,如果没有并行计算工具箱,就没有任何选择了?@rlbisbe:下面是一个并行化代码的示例使用OpenMP(只要您不从派生线程调用MEXAPI函数):(还可以查看建议的PCT替代方案的注释)你的答案与5小时前发布的答案有什么不同?请让你的答案更加真实。如果你只是说并行工具箱很便宜,那么最好在你的答案下面写一条评论。哈哈,事实上,它与你的答案或Edric答案没有太大的不同。谢谢你指出这一点。