我正在进行基于时间序列的计算。每次迭代计算都是独立的。有人可以在Matlab中使用并行处理分享一些提示/在线引子吗?如何在实际代码中指定它?
答案 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。如果您不想购买,那么有几个选项
修改:添加链接Parallel MATLAB with openmp mex files
我只试过第一次。
答案 2 :(得分:2)
不要忘记许多Matlab函数已经是多线程的。通过仔细编程,您可以利用它们 - 检查您的版本的文档,因为Mathworks似乎在增加每个新版本的多线程函数的范围和数量。例如,似乎2010a具有多线程fft
,这可能对时间序列处理有用。
如果内部多线程不是您所需要的,那么正如@srean建议的那样,并行计算工具箱可用。对于我的钱(或者更确切地说,我的雇主的钱),它是要走的路,允许你在Matlab中并行编程,而不是必须把事情搞砸。我不得不承认,我对工具箱及其提供的设施印象深刻。