【发布时间】:2010-10-30 01:12:07
【问题描述】:
我正在研究基于时间序列的计算。计算的每次迭代都是独立的。任何人都可以分享一些关于在 Matlab 中使用并行处理的技巧/在线入门吗?如何在实际代码中指定?
【问题讨论】:
标签: matlab parallel-processing
我正在研究基于时间序列的计算。计算的每次迭代都是独立的。任何人都可以分享一些关于在 Matlab 中使用并行处理的技巧/在线入门吗?如何在实际代码中指定?
【问题讨论】:
标签: matlab parallel-processing
由于您可以访问并行工具箱,我建议您先检查是否可以轻松完成。
基本上不用写
for i=1:lots
out(:,i)=do(something);
end
你写
parfor i=1:lots
out(:,i)=do(something);
end
然后,您使用matlabpool 创建多个工作器(使用工具箱在本地计算机上最多可以有 8 个,如果您还拥有分布式计算服务器许可证,则在远程集群上最多可以有 8 个),并且您运行代码,并看到当您的迭代由 8 个内核而不是 1 个内核运行时,速度获得了不错的提升。
尽管parfor 路由是最简单的,但它可能无法直接使用,因为您的索引可能错误,或者您可能以有问题的方式引用数组等。查看 mlint 警告在编辑器中,阅读文档,并依靠良好的旧试验和错误,你应该很快就能弄清楚。如果您有嵌套循环,通常最好只并行化最里面的循环并确保它进行大量迭代 - 这不仅是好的设计,还可以减少可能给您带来麻烦的代码量。
请注意,特别是如果您在本地计算机上运行代码,您可能会遇到内存问题(这可能会在并行模式下表现得很慢,因为您正在分页):每个工作人员都会获得工作区的副本,所以如果您的计算涉及创建一个 500MB 的数组,那么 8 个工作人员将需要总共 4GB 的 RAM - 然后您甚至还没有开始计算父进程的 RAM!此外,最好只在您的计算机上使用 N-1 个内核,这样还有一个内核可用于计算机上可能运行的其他进程(例如强制防病毒...)。
【讨论】:
Mathworks 提供自己的parallel computing toolbox。如果您不想购买,有几个选择
编辑:添加链接Parallel MATLAB with openmp mex files
我只尝试了第一个。
【讨论】:
不要忘记许多 Matlab 函数已经是多线程的。通过仔细编程,您可能能够利用它们——检查您的版本的文档,因为 Mathworks 似乎在每个新版本中增加了多线程函数的范围和数量。例如,似乎 2010a 具有多线程 ffts,这可能对时间序列处理有用。
如果您不需要内在的多线程,那么正如@srean 建议的那样,可以使用并行计算工具箱。对于我的钱(或者更确切地说,是我雇主的钱),这是可行的方法,允许您在 Matlab 中并行编程,而不必安装任何东西。我也不得不承认,工具箱及其提供的设施给我留下了深刻的印象。
【讨论】: