【问题标题】:How to utilise parallel processing in Matlab如何在 Matlab 中使用并行处理
【发布时间】:2010-10-30 01:12:07
【问题描述】:

我正在研究基于时间序列的计算。计算的每次迭代都是独立的。任何人都可以分享一些关于在 Matlab 中使用并行处理的技巧/在线入门吗?如何在实际代码中指定?

【问题讨论】:

    标签: matlab parallel-processing


    【解决方案1】:

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

    基本上不用写

    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 个内核,这样还有一个内核可用于计算机上可能运行的其他进程(例如强制防病毒...)。

    【讨论】:

    • 为什么最好只并行化最里面的循环?我已经阅读了与 .NET 相关的所有文献的相反内容。通常,并行化大外循环会导致创建线程的开销低于并行化内循环。
    • @Joel B:您希望并行化一个执行大量迭代的循环,因为在一个 1024 核集群上运行一个执行 500 次迭代的循环是相当浪费的。当然,并行循环的核心应该比线程创建开销花费更多的时间。但是,这在 Matlab 中几乎总是正确的,因为您需要的循环要少得多,因此即使是最内层的循环也非常繁重。
    • 但是对于一个四核单机来说呢?可能在那里做外循环更有意义?公平地说,如果我有一个庞大的计算机集群可供我使用,那么并行化内部循环会更好,但如果我只有一台多核 PC,那么并行化外部循环会更好吗?
    • @Joel B:即便如此,最好将循环与许多迭代并行化。如果您运行 4 个并行线程,其中一个会更慢,因为它的核心也在运行 OS 作业。如果您在不同速度的内核上运行并行作业,您希望避免必须等待其中一个内核完成最后一次迭代。如果有很多迭代,这会容易得多。同样,您必须平衡可能的等待时间与并行化开销。使用 Matlab,这种开销对我来说从来都不是问题,.Net 可能会有所不同。
    【解决方案2】:

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

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

    编辑:添加链接Parallel MATLAB with openmp mex files

    我只尝试了第一个。

    【讨论】:

    • 您可能还想知道,Parallel Computing Toolbox 最近(R2010b)引入了基于 CUDA 的 GPU 计算(需要支持计算能力 1.3 的 nvidia 卡):mathworks.com/discovery/matlab-gpu.html
    【解决方案3】:

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

    如果您不需要内在的多线程,那么正如@srean 建议的那样,可以使用并行计算工具箱。对于我的钱(或者更确切地说,是我雇主的钱),这是可行的方法,允许您在 Matlab 中并行编程,而不必安装任何东西。我也不得不承认,工具箱及其提供的设施给我留下了深刻的印象。

    【讨论】:

    • 我可以访问 Matlab 的并行计算工具箱。你能分享一些关于使用它的好的入门/例子吗?
    • @Edward:我参加了关于 PCT 的 Mathworks 为期 2 天的培训课程,阅读了文档并自己解决了问题。但我有使用 Fortran、MPI 和 OpenMP 进行并行编程的背景。 Matlab Central 在使用 Matlab 进行并行计算方面的内容越来越多,这可能是一个起点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多