C 用Matlab实现多线程
我正在Matlab上做一个项目,在这个项目中我们必须优化性能,我正在考虑并行化从一个.m文件发出的两个函数调用 这个想法很简单,从一个Matlab文件(.m)调用编译为MEX的C文件,然后从该C文件创建两个线程,并从每个线程调用Matlab函数 理论可行,我可以创建线程,也可以调用matlab函数,问题是我无法从线程调用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;
//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指出的并行计算工具箱。这将为您提供uPARFOR
循环和SPMD
块用于同时运行东西。你最好的选择是PARFOR
。如果你是一名学生,你可以以相当便宜的价格获得并行工具箱。如果你认真考虑性能,即使是全价也不算多。你上面的代码很容易出错,很难测试。使用PARFOR
是直观和干净的。我很惊讶每个人都在推动parfor
。我鼓励您至少考虑一下,您是否可以设计从Matlab调用的算法,并从多线程C/C++低级别运行关键部分,而无需调用mex。这通常是可能的。尤其是如果您使用Matlabprofiler
或类似工具来找出分析的哪些步骤是瓶颈,那么您可能只能在多线程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答案没有太大的不同。谢谢你指出这一点。