如何在Matlab中利用并行处理

时间:2010-10-30 01:12:07

标签: matlab parallel-processing

我正在进行基于时间序列的计算。每次迭代计算都是独立的。有人可以在Matlab中使用并行处理分享一些提示/在线引子吗?如何在实际代码中指定它?

3 个答案:

答案 0 :(得分:12)

由于您可以访问Parallel工具箱,我建议您先检查一下是否可以轻松完成。

基本上,而不是写

for i=1:lots
   out(:,i)=do(something);
end

你写

parfor i=1:lots
   out(:,i)=do(something);
end

然后,使用matlabpool创建一些工作人员(使用工具箱在本地计算机上最多可以有8个,如果您还拥有Distributed Computing Server许可证,则可以在远程群集上使用最多8个) ,并且运行代码,并且当迭代由8个核心而不是1个核心运行时,可以看到很好的速度增益。

尽管parfor路由最简单,但它可能无法正常使用,因为您可能会错误地编写索引,或者您可能以有问题的方式引用数组等。查看编辑器中的mlint警告,阅读文档,并依靠良好的旧试验和错误,你应该相当快地找出它。如果你有嵌套循环,它通常最好只对最里面的循环进行并行化,并确保它进行大量的迭代 - 这不仅是好的设计,还减少了可能给你带来麻烦的代码量。

请注意,特别是如果您在本地计算机上运行代码,您可能会遇到内存问题(这可能表现为并行模式执行速度非常慢,因为您正在进行分页):每个工作程序都会获得工作区的副本,因此如果您的计算涉及创建500MB阵列,那么8名工作人员将需要总共4GB的RAM - 然后您甚至还没有开始计算父进程的RAM!此外,最好只在您的计算机上使用N-1核心,因此仍有一个核心可用于计算机上可能运行的其他进程(例如强制性防病毒......)。

答案 1 :(得分:5)

Mathworks提供了自己的parallel computing toolbox。如果您不想购买,那么有几个选项

  • 您可以编写自己的mex文件并使用pthreads或OpenMP。
  • 但是请确保您不要在代码的并行部分调用任何Mex api,因为它们不是线程安全的
  • 如果您想通过MPI进行粗粒度并行操作,可以尝试pmatlab
  • parmatlab
  • 相同

修改:添加链接Parallel MATLAB with openmp mex files

我只试过第一次。

答案 2 :(得分:2)

不要忘记许多Matlab函数已经是多线程的。通过仔细编程,您可以利用它们 - 检查您的版本的文档,因为Mathworks似乎在增加每个新版本的多线程函数的范围和数量。例如,似乎2010a具有多线程fft,这可能对时间序列处理有用。

如果内部多线程不是您所需要的,那么正如@srean建议的那样,并行计算工具箱可用。对于我的钱(或者更确切地说,我的雇主的钱),它是要走的路,允许你在Matlab中并行编程,而不是必须把事情搞砸。我不得不承认,我对工具箱及其提供的设施印象深刻。