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