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