使用Matlab进行multithreading处理

我正在研究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 *函数。 您可以编写multithreadingMEX文件,这些文件可以在低于mx接口的级别上完成工作。 如果您需要多个MATLAB解释器,则需要多个MATLAB过程。 一种方法是通过@You指出的并行计算工具箱。 这为您提供PARFOR循环和SPMD块,以便同时运行。

您可能最好使用MATLAB内置的multithreadingfunction,例如parfor 。 事实上,许多MATLAB函数已经是multithreading的(包括矩阵运算),所以除了替换parfor之外,你不需要自己并行化。 (一般情况下, while循环不能被分段化。)

你最好的选择是parfor 。 如果你是一名学生,你可以获得非常便宜的并行工具箱。 如果你对表现很认真,即使全价也不多。 您上面的代码容易出错且难以测试。 使用parfor是直观和干净的。

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

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

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