并行计算实践工作坊
本视频附带一个实践研讨会,向您介绍MATLAB并行计算®和仿真软万博1manbetx件®,这样您就可以使用多核处理器、gpu和计算机集群解决计算和数据密集型问题。通过研究常见场景来并行化MATLAB算法并并行运行多个Simulink仿真,您将了解使用MATLAB和Simulink进行并行计算,并了解最佳实践。万博1manbetx
随着视频,练习和例子提供了加强如何使用MATLAB和Simulink并行计算。万博1manbetx从简单的并行使用概念到更高级的技术,研讨会练习和示例的难度各不相同。
突出了
•通过并行计算加速MATLAB应用程序
•并行运行多个Simulink仿真万博1manbetx
•GPU计算
•卸载计算和集群计算
•处理大型数据集
大家好,欢迎来到这个关于MATLAB和Simulink并行计算的研讨会。万博1manbetx并行计算是一个重要的话题,因为工程师和研究人员面临的问题越来越大,变得越来越复杂。此外,随着技术的发展,人们对更快、更有效的结果的期望也在增加。
MATLAB和Simulink中的并行计算使任何部门或行业的工程师万博1manbetx、科学家和研究人员能够利用现成的计算资源,而不需要成为并行计算方面的专家。下面是一些使用MATLAB并行计算工具加速工作的MATLAB客户体验到的实际性能提升的示例。本研讨会将指导您完成同样的步骤和技巧,并记住并行竞争硬件正变得越来越广泛和可用。
多核处理器已成为常态,具有计算能力的GPU设备也变得越来越普遍。此外,对集群和云环境的访问也在增加,提供了使用计算资源的能力,超出了典型工作站上的可用范围。无论您是计划利用多核处理器、计算集群还是gpu,都必须优化代码,以便在引入并行工具以获得额外的计算能力时获得更好的性能改进。
让我们重点介绍一些可以用来优化代码的步骤。在修改代码之前,您需要确定将精力集中在哪里。支持这个过程的最关键的工具可能是分析器,它可以通过告诉您代码在哪里花万博1manbetx费了最多的执行时间来帮助您找到瓶颈。改善这些方面会让你的努力得到最大的绩效提升。
一旦确定了投资领域,就可以使用有效的编程技术(如预分配和向量化)来加速MATLAB代码的执行。MATLAB代码分析器可以帮助您提供这方面的建议,并提醒您注意代码中的问题和错误。最后,您还可以通过将部分MATLAB代码替换为自动生成的MATLAB可执行文件(称为MEX函数)来获得加速UPS。你可以使用一个单独的产品,叫做MATLAB Coder。
值得注意的是,即使没有并行计算工具箱,MATLAB也通过其内置的多线程提供隐式多核支持。万博1manbetx越来越多的核心MATLAB函数利用了底层多线程库支持,而其他工具箱在使用核心MATLAB函数时也利用了这些好处。万博1manbetx然而,并不是每个MATLAB函数都是多线程的,任何加速都仅限于您的本地工作站。因此,并行计算工具使您能够获得超出这些限制的好处。
换句话说,“并行计算工具箱”可以直接控制并行资源。例如,像parfor这样的并行结构可以控制工作流的哪些部分分布到多个核心。稍后,我们将讨论如何通过使用MATLAB并行服务器将该级别的控制扩展到计算集群上的资源。
下面的视频剪辑将清楚地演示在MATLAB中使用并行计算获得的性能改进,特别是使用parfor。我们有三个不同的场景,在三个不同的计算环境中运行相同的参数扫描代码,分别是一个桌面工作站、一个200核集群和一个1000核集群。正如您所看到的,对于这个问题,使用1000个内核提供了非常显著的加速。
话虽如此,我们应该提到,在一个问题上投入更多的核并不总是会给您带来按比例更快的结果。一般的经验法则是,如果您的模型或应用程序是计算密集型的,并且您有大量的独立迭代要完成,那么您可能会有效地利用大量的核心来加快您的整体执行时间。在讨论了并行计算的动机和实用性之后,让我们讨论一下如何在MATLAB中利用它。
我们将从讨论在台式计算机上使用多核开始,还将学习一些并行计算的基础知识,如worker的概念,parfor如何像worker的概念,以及parfor循环如何工作。在此之后,我们将讨论如何使用gpu,然后将其扩展到集群或云环境。然后,我们将给出一些在大数据中使用并行计算的技巧。
MathWorks提供了两个并行计算工具。我们多次提到并行计算工具箱,现在我们将介绍它。稍后,我们将讨论MATLAB并行服务器。那些被授权使用并行计算工具箱的人将与MATLAB一起安装它。我们将使用术语MATLAB客户端来指代安装了工具箱的机器。
该工具箱将允许您通过使用称为workers的MATLAB计算引擎来提高多核处理器的生产效率。这些工作程序由您的MATLAB会话控制,并允许您使用硬件的全部潜力来加快您的工作流程。您可以交互地使用工作者,也可以发送工作让他们在后台运行。worker构成了基于cpu的并行工作流的基础。
当你有一个具有进程间通信的worker集合时,我们称之为并行池。您可以使用MATLAB代码以编程方式初始化和管理并行池,也可以在MATLAB桌面环境中通过此图标进行交互。并行计算工具箱处理划分任务和计算并将它们分配给并行池中的工作人员所涉及的工作,从而使您的资源能够执行并行计算。
幕后工作都封装在易于使用的语法中。有时只需简单地更改一个单词,您就永远不必离开熟悉的MATLAB桌面环境。一般来说,运行的MATLAB worker不应超过机器可用的物理内核数量,否则可能会出现资源争用。
现在我们已经介绍了通过worker实现并行计算的基础知识,下面让我们讨论一下可以使用它们做什么。MATLAB中的一些并行结构更容易上手,但提供的控制较少。其他的则需要更多的并行计算知识,但提供更细粒度的控制。我们将从最容易使用的开始,然后逐步向下。大量的MATLAB工具箱都内置了自动并行支持。万博1manbetx
如果您发现某个函数具有并行支持,并且它包含在您的瓶颈中,那么您可以毫不费力地加速代万博1manbetx码。下面是具有自动并行支持的跨不同应用程序的函数示例。万博1manbetx底部的链接将为您提供自动并行支持的工具箱和函数的完整列表。万博1manbetx类似地,Simulink工具箱中许多并行启用的块集可以帮助您用很少的努力加快工作流程。万博1manbetx
例如,Simulink设计万博1manbetx优化与并行计算工具箱的最佳集成之一。您只需启用单个复选框,在优化期间使用并行池,它将立即加快灵敏度分析、响应优化和参数估计等工作流。同样,您可以使用底部的链接查看自动并行支持的完整列表。万博1manbetx
让我们进入下一个阶段。如果您的瓶颈不涉及具有自动并行支持的函数,那么MATLAB中有大量可用的并行构造,可以让您更好地控制瘫痪的内容和方式。万博1manbetxMathWorks的并行计算团队正在积极地添加更多结构并改进现有结构。正如我们前面提到的,根据问题的不同,并行计算并不总是给您带来相应的改进,然而,对于并行计算来说,有一些理想的问题,其中计算密集型问题只是多个任务、迭代或模拟的问题,它们不依赖于彼此来完成计算。
这类问题的真实例子包括蒙特卡罗模拟、参数扫描和设计优化,解决这一挑战的最简单方法是使用并行for循环。例如,假设您想要运行代码的五次迭代。如果你在for循环中运行它,它们会一个接一个地连续运行。您等待一个迭代完成后再进行下一个迭代。然而,如果它们都是独立的任务,在各个迭代之间不需要依赖或通信,那么您可以将这些任务分配给不同的工作人员,并同时并行计算它们。
这将最大限度地利用您的机器上的课程,并使您更快地获得结果。并行for循环使用parfor命令实现。虽然需要并行计算工具箱才能利用worker进行并行处理,但实际上没有它仍然可以运行。这意味着您可以与可能无法访问并行计算工具箱的同事和合作者共享使用parfor的代码。
在这种情况下,parfor的行为类似于传统的for循环,只是迭代顺序不同。在本例中,我们希望使用典型的串行for循环,并使用多核处理器并行运行它。这个for循环中的迭代彼此不依赖,也不需要在彼此之间传递信息。我们在这里所要做的就是将for循环更改为parfor循环,这将自动在多个worker之间并行运行迭代。
Parfor将自动将任务分配给可用的工作人员,并在完成时收集结果。当将for更改为parfor时,可能需要对代码进行一些调整。代码分析器将通过通知您为了运行parfor循环需要进行哪些更改来帮助指导您完成这个过程。
在本例中,不显示任何警告,也不需要进行额外的代码更改。在第二个示例中,代码略有不同,代码分析器确定存在问题并引起我们的注意。下面的插图将使您更深入地了解parfor执行时发生的情况。在这个例子中,MATLAB可以访问三个worker。它们被分配要运行的任务,一旦一个worker完成了当前的任务,它就可以被分配额外的工作。
最后,收集结果,并可在MATLAB中显示。当MATLAB将parfor循环中的一个名称识别为变量时,该变量被划分为右侧表中所示的几个类别之一。可以对运行时产生重大影响的两种变量类型是切片变量和广播变量。切片变量是一个变量,其值可以被分割成段或片,然后由不同的工作人员分别操作。
循环的每次迭代都在数组的不同切片上工作。使用切片变量可以减少客户机和工作者之间所需的通信量。广播变量是除了循环变量或切片变量之外的任何变量,它在循环内部不会改变。在parfor循环开始时,任何广播变量的值都被发送到所有工作者。这意味着大的广播变量在客户端和工作者之间传输时可能会消耗大量的开销。
因此,通过尝试使用更多的切片变量和保持较小的必要的广播变量来优化parfor循环,以减少并行开销。另一个常见的并行结构是parfeval, parallel feval的缩写。这种并行构造类似于parfor循环,因为它利用并行工作者并行地运行多个任务。
不同之处在于它只对函数起作用,而且与MATLAB相比,它是异步的或非阻塞的。与parfor循环不同,parfeval允许您在并行工作在后台完成时继续在MATLAB中执行命令。Parfeval创建一个任务队列,每个任务在并行工作线程上执行一个函数。
队列是这样的,队列中的下一项总是在池中下一个可用的worker上执行,从而保持执行顺序。在任务排队等待执行后,您可以自由地在其他任务上使用MATLAB,而不必等待排队的任务。当它们完成后,您可以使用fetchnext检索计算结果。
还可以从队列中添加或删除任务。Parfeval还以与parfor不同的方式将工作分配给并行工作者。正如您所看到的,parfeval不是将一组任务传递给并行工作线程,而是一次传递一个任务。如果您的任务或迭代具有显著不同的运行时间,parfeval将有助于避免因分组任务而导致的空闲工作。
也就是说,parfor仍然很可能是你的解决方案,但如果需要保持执行顺序,如果你需要并行队列,或者如果你想在MATLAB在后台执行计算时继续使用,请记住parfeval。数据队列允许您将数据从并行工作者传递回MATLAB客户端。它的一个有用的应用是能够查看并行计算的进度。
首先,我们构建数据多维数据集并创建权重条,我们将使用它来查看我们的进度。然后,我们指定每次工作线程触发数据队列时将发生什么操作。在本例中,我们希望运行一个函数并更新权重条,这将更新权重条。我们使用after each构造在parfor的每次迭代之后触发结束更新权重条函数,这是由send构造指示的。
你也可以在each后面加上parfeval。随着parfor的运行,工作人员在计算完成后通知客户端。这将触发结束更新权重条函数,该函数更新并行工作的指示进度。
这个工作流的关键组件是数据q。在每次迭代之后,发送您提供的函数来运行。虽然在技术上可以在Simulink中使用parfor,但parfor主要是为MATLAB万博1manbetx设计的,不建议与Simulink一起使用。相反,使用parsim并行运行多个模拟。
Parsim将多个模拟分布到多核cpu上,以加快整体模拟时间。它自动创建并行池,识别文件依赖项,并管理构建构件。它还与一个新的模拟输入对象一起工作,帮助您以一种方便的方式设置所有的模拟输入,包括变量、块参数和模拟配置。
至此,我们已经讨论了自动并行支持和通用编程结构。万博1manbetxParallel Computing Toolbox还提供了高级的并行结构,以最大程度地控制您的资源,例如配置并行工作者以彼此通信和过去的数据,在多台机器的内存中拆分大型矩阵,以及使用大型数据存储库。由于这些主题可能没有广泛的吸引力,如果您想了解更多,您可以在本演示结束时查看资源。
产品文档和技术支持也可以帮助您解决问题。万博1manbetx并行计算工具箱使您能够使用NVIDIA gpu来加速AI、深度学习和其他计算密集型分析,而不必成为一个[?程序员。MATLAB有数百个函数,支持使用NVIDIA gpu使用,您将能够访问桌面万博1manbetx或集群上的多个gpu,生成[?QDA ?]代码等。
要在工作站上使用GPU,您只需要MATLAB和并行计算工具箱。您还需要确保您的NVIDIA GPU设备支持最新的图形驱动程序。万博1manbetx确保您是设备的最新驱动程序是最佳实践。gpu有数百个(有时是数千个)内核,具有非常集中的指令集。
在MATLAB桌面或一个单一的工作是所有需要利用整个GPU。在深度学习工具箱中,如果你设置了标志,并且有合适的GPU,像火车网络这样的函数就可以使用GPU。此外,如果您提供一个GPU数组参数,MATLAB和其他工具箱中的数百个函数将重载以使用GPU,我们将很快介绍。
底部的链接将带您到在GPU上运行MATLAB函数的文档,在那里您还可以找到GPU支持的函数列表。万博1manbetx并不是所有的问题都适合GPU。GPU计算的理想问题是大规模并行和/或计算密集型。大规模并行意味着计算可以被分解成数百或数千个独立的工作单元。
当所有核心都处于忙碌状态时,您将看到最佳性能,利用GPU固有的并行特性。计算密集型意味着花费在计算上的时间大大超过了在GPU内存之间传输数据所花费的时间。GPU具有高速内存总线,用于GPU内部的数据传输。然而,GPU必须使用更慢的PCI快速总线来与CPU通信。
这意味着您的整体计算加速将减少设备之间传输数据所需的时间,正如MATLAB开发人员编写的算法所要求的那样[?QDA ?]版本的关键MATLAB和工具箱函数,它们以重载函数的形式呈现。当输入在GPU内存中时,函数的GPU版本将运行。在右边的例子中,我们最初在CPU上创建一个矩阵。
使用GPU数组,我们将该矩阵的副本发送到GPU。然后我们在这个矩阵上执行一个fft函数,并注意到,即使没有使用GPU的显式指令,MATLAB也会看到矩阵驻留在GPU上,我们使用GPU而不是CPU来执行计算。这意味着您可以使用GPU进行更快的计算,同时仍然使用这些相同的底层代码。计算完成后,您可以收集结果并在MATLAB中正常查看它们。你可以使用高级GPU [?]QDA ?]和MEX编程。
您可以通过查阅产品文档和技术支持了解更多信息。万博1manbetx现在我们已经建立了MATLAB中并行计算的基本理解,让我们讨论如何开始将我们的工作流迁移到集群或云上,以获得更强大的计算能力。毕竟,您所处理的问题或挑战可能需要额外的计算资源或内存,这超出了单台多核桌面计算机的可用容量。
MATLAB并行服务器使您能够扩展桌面工作流,以访问集群中多台计算机的额外计算能力和内存,无论是在您组织的前提下,还是在云中。虽然基础设施的设置可能需要IT人员的支持,但您可以在不离开MATLAB桌面环境的情况下将作业发送到集万博1manbetx群。与MATLAB中的其他并行计算工具相同,您在桌面计算机上开发的代码可以在集群上运行,而无需重新编码底层算法。您可以使用集群来获得额外的计算能力,或者仅仅是释放桌面计算机用于其他工作,我们将很快用批处理工作流讨论这个问题。
要扩展到集群,您需要MATLAB客户端工作站上的MATLAB和并行计算工具箱,以及代码所需的任何其他工具箱的许可证。在集群端,您只需要MATLAB并行服务器。每个MATLAB并行服务器工作线程不签出工具箱许可,而是动态地对工具箱和块集进行许可,以匹配来自提交客户端的许可。
您可以通过在代码中以编程方式定义代码,或者使用集群配置文件通过MATLAB UI来选择在何处运行代码。默认情况下,您将拥有本地配置文件,它将在MATLAB客户端上运行worker。您可以创建或导入其他概要文件,这些概要文件将指向远程硬件上的工作人员。
您可以使用多个概要文件访问不同的集群环境,并且可以从同一个MATLAB会话向不同的概要文件提交作业。您甚至可以在集群上拥有一个交互式并行池,这对于调试和创建原型非常有用。请注意,MATLAB客户端一次只能与一个并行池交互。
MATLAB中的并行计算支持跨平台提交,这意味着运行MAT万博1manbetxLAB客户机的操作系统可能与集群操作系统不同。由于MATLAB语法在所有平台上都是相同的,因此不需要重写算法。当然,您需要确保您的代码没有使用硬编码的特定于操作系统的文件引用。并行计算工具箱包括诸如附加路径和附加文件之类的特性,这些特性有助于解决与集群上的工作人员共享代码和数据的潜在问题。
根据您的系统和网络配置,您可以在集群上与par池交互地使用worker,这对于创建原型和调试非常有用。对于长时间运行的作业,您将希望过渡到批处理工作流,这是我们之前顺便提到的。您可以使用批处理命令将代码发送到已安装和配置MATLAB Parallel Server的远程硬件上运行。
使用批处理从您的计算机卸载工作负载,使您的计算机不再与计算绑定。这意味着您可以做其他事情,让机器进入睡眠状态,甚至将其关闭。默认情况下,该命令将请求单个工作者进行串行计算,但您可以包含pool参数以请求多个工作者进行并行计算。
您可以提交多个批处理作业,集群端的调度程序将在资源可用时对工作进行调度。您可以在日记命令中使用这些状态检查作业的状态和进度,可以通过MATLAB命令窗口以编程方式使用,也可以通过作业监视器以交互方式使用。作业完成后,您可以在MATLAB中检索结果,或者在集群的文件系统上查看作业生成的工件。
您还可以利用Simulink进行批处理。万博1manbetxBatchsim的工作原理类似于批处理命令,通过将模拟卸载到远程硬件上的MATLAB Parallel Server,释放桌面资源。注意,如果已经在代码中使用了parsim,可以将parsim更改为batchsim,指定池参数,并以批处理方式运行模拟。完成后,您已经检索了模拟结果,以便在桌面上进行进一步处理。
通过更全面地理解MATLAB中的并行工具,我们可以看到MATLAB如何为在桌面上或集群上处理大数据提供单一的高性能环境。MATLAB为大数据应用的初学者和高级用户定制了功能。您将能够使用像数据存储和高数组这样的结构来访问不适合内存的数据。
您将能够使用数据存储和高数组等结构来访问不适合内存的数据,使用来自Hadoop分布式文件系统或HDFS的数据,访问基于云的存储,并创建大量图像、电子表格和自定义文件的存储库。虽然您必须学习更多的函数,但它们都使用您已经熟悉的相同直观的MATLAB语法。您可以使用小型数据集快速建立算法原型,然后使用这些相同的代码扩展到存储在大型集群中并在大型集群上处理的大数据集。
高数组提供了一种可视化、解析和分析数据的方法,即使是由数百万或数十亿行组成,这些行太大,无法放入机器的随机访问存储器(RAM)中。它们由数据存储提供支持,数据存储是位于机器、云或集群上的大量文件的存储库。许多操作和函数都被重载以处理高数组,使用与内存中的MATLAB数组相同的语法。Tall数组环绕其中一个数据存储,并将整个数据集视为一个连续的表或数组。
底层数据存储使计算能够一次逐个遍历数组。所有这些都是在幕后完成的,对于作为用户的您来说,您只需编写看起来像普通MATLAB代码的代码。例如,如果我们从包含表格数据的多个CSV文件构建一个高数组,得到的高数组就是一个高表。即使这个表不适合内存,我们也可以使用标准的表函数,如summary或点引用来访问列,然后使用max, min, plus, minus,就像我们在内存表中使用常规表一样。
由于这些片段是独立处理的,您可以使用并行计算工具箱来麻痹它,并一次处理几个片段。当然,您可以使用MATLAB并行服务器在多台计算机上扩展高数组。分布式数组是一种并行数据类型,它使用多台机器的内存来存储大到无法在一台机器上存储的变量。
使用分布式阵列,您可以将矩阵分布到多台机器上,从而超越单台计算机的能力。您可以使用并行计算工具箱在桌面上创建分布式阵列工作流原型,然后扩展到使用MATLAB Parallel Server的集群。本着使事情变得简单的精神,大量的标准MATLAB函数使用与普通数组相同的语法处理分布式数组,同样,作为重载函数。
这意味着您可以以与内存算法相同的方式编程和分发数组算法,MATLAB将根据输入数据类型运行正确版本的代码。这使您可以利用分布式计算,而不需要成为消息传递方面的专家。在本例中,我们在一台本地机器上使用少量数据样本,开发并原型化了一个分布式数组算法。
一旦我们确信我们的算法有效,我们只需要改变我们的集群配置文件,在整个数据集上运行相同的算法,并在集群上扩展。使用数据存储,我们可以访问多个文件,每个文件都包含我们将在计算中使用的矩阵的一部分。我们使用分布式数据存储,以允许将矩阵作为单个实体处理的方式,将数据分布在工作者池中。
我们可以使用存储在这个单一文件或小文件集中的一个小矩阵进行本地测试,然后通过更改概要文件访问集群和使用访问整个数据集的数据存储轻松地进行扩展,这将包含一个更大的矩阵。注意,在圈出的代码之外,其余代码完全相同。在我们结束时,我们还将为您提供一些额外信息的资源。希望你已经反复看到MATLAB的主题,让你更容易使用强大的计算资源和技术,这样你就可以专注于你的算法和研究。
您不需要成为并行编程专家才能开始学习,如果您希望从资源中获得更高的性能,您总是可以深入研究更高级的技术。这些资源包括您的机器已经可用的硬件,以及来自gpu或机器集群的额外计算能力。无论您是开发串行算法还是并行算法,您都可以使用熟悉的MATLAB语法在本地开发和原型化它们,然后扩展到集群或云,而无需重写底层代码。
这里有一些关于演讲中提到的主题的资源。如果有任何关于这些主题的问题,请随时联系我们。技术支持或您的客户经万博1manbetx理我们也很乐意为您解答任何问题。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。