如何使用Matlab进行并行计算

680 阅读6分钟

并行计算是一种计算类型,其中许多计算或执行过程是同时进行的。如果你有一个巨大而复杂的过程,你可以应用并行计算过程。

并行计算包括将任务划分为完全独立的子任务。这些子任务在中央处理单元(CPU)中被独立执行。

子任务独立执行意味着,一个代码块可以在不知道另一个代码的输出的情况下完成。

一旦你执行了所有这些子任务,你就可以通过对小任务的加总获得最终结果。这个过程减少了执行时间。

用Matlab进行并行计算可以加速工作流程,而对你的原始代码进行最小甚至没有任何改变。它还可以将计算扩展到集群和云中。

前提条件

要跟上本教程,你需要。

  • 安装MATLAB
  • MATLAB基础知识有清楚的了解。

加速和并行化Matlab代码

你可以在你的代码中使用不同的程序来提高其性能而不考虑并行化。

一个程序是预分配和矢量化 - 这涉及到预先分配空间,而不动态地定位它。特别是当代码包含forwhile 循环时。

Code analyzer

在上面的图片中,Matlab告诉你如何做一点调整来加速代码的执行。

在多核机器上运行Matlab

有两种方法可以在多核机器上运行Matlab。

  • 内置多线程。
  • 使用显式技术进行并行计算。

内置多线程

这种方法在不知不觉中被大家使用。当你在具有多核的现代机器上正常执行你的代码时,Matlab会自动启用它。

一些函数针对这种多线程进行了优化,matlab使用多核来加速计算。这种方法是隐式的,你不需要做任何事情来启用它。

使用显式技术的并行计算

在使用显式技术的并行计算中,用户指定他们在特定任务上想要的工作者数量。

然后,用户决定使用一个特定的函数来并行化工作以获得结果。本文将更多地关注于此。

这种方法使用parfor 函数。

在这里,我们不需要在不同的任务之间有任何依赖关系。

比如说。

matlab client

在上面的例子中,我们有一个Matlab客户端。矩形是我们要执行的任务。

我们可以看到,如果我们按顺序执行,就会花费较长的时间,而将任务分成三个工作者,就会减少执行时间。

还可以看到,forparfor 语法之间的差别并不大。

因此,你唯一应该保证的是,函数myFun 是完全独立的。

parfor循环的力学原理

a = zeros(10,1);
parfor i = 1:10
a(i) = i;
end
a;

Matlab在计算过程中动态地将工作分配给它的工作者。

例如,在上面的代码中,我们启用了parfor ,当我们运行该程序时,我们得到了以下输出。

Starting parallel pool (`parpool`) using the 'local' profile ...
connected to 2 workers.

解说

在这种情况下,我们有十个迭代。

假设你把这些工作分配给2个工人。工作者是PC的核心。

在起始点,Matlab在执行过程中根据大小将迭代分为不同的组,对于我们的例子来说,迭代是2。然后,Matlab将迭代分配给一个工作者。

Allocation of the work

优化for循环

现在我们想看看for 循环的优化。特别是,我们将把第一个作为经典的for 循环,没有任何优化,而第二个作为使用parfor 函数的优化循环。

让我们看一下工具条并行。

在主页部分,点击并行,可以看到当前活动的并行化,在我们的例子中,默认部分是local

locating the parallel

active pool

要发现更多,点击发现集群。你还可以创建或管理你的集群。

例如,你可以通过点击manage cluster ,找到本地集群的属性,下面的属性窗口就会打开。

properties of the cluster

你也可以通过检查你的计算机是否能执行这种类型的操作来验证你的集群。

它是通过点击validation ,然后在该窗口的顶部点击validate

validation

一旦完成,我们可以看到不同阶段的工人数量。

你还可以通过点击monitor jobs 标签来监控工作。它给你提供了你的并行池的当前状态,如下图所示。

monitor jobs

现在让我们看看优化和非优化的for 循环之间的比较。

%Non-optimized for loop
n = 200;
A = 500;
a = zeros(1,n);
tic                %save the time for execution

for i = 1:n
a(i) = max(abs(eig(rand(A))));
end
toc                 % saves time for execution

当我们正常执行这段代码时,我们看到它需要31.186221秒来完成执行。

现在让我们看看优化后的需要多长时间。

%% Optimized code
clear all;
tic
parpool             %initialization of the parallel pool
toc
n = 200;
A = 500;
a = zeros(1,n);
tic
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

Parpool 是用来初始化并行池的。有三种初始化并行池的方法。

第一种是显式方式,它通知PC和代码开始它的盟友,然后将parpool

第二种方式是隐式方式。这里,你调用函数parpool ,如上面的代码所示。

第三种是在左上角往下走,点击并行池。

starting parallel pooling

当我们运行上面的代码时,如下图所示,使用两个工作者需要17.300710秒来完成执行。

Starting parallel pool (parpool) using the 'local' profile ...
connected to 2 workers.

ans =

 Pool with properties:

            Connected: true
           NumWorkers: 2
              Cluster: local
        AttachedFiles: {}
    AutoAddClientPath: true
          IdleTimeout: 30 minutes (30 minutes remaining)
          SpmdEnabled: true

Elapsed time is 17.300710 seconds.

如果你想在你的PC上运行parpool ,你必须考虑到它是相当密集的硬件。这意味着所使用的PC必须至少有一个多核处理器,以便每个核心都能成为一个工作器。

电脑还应该有几千兆的内存。特别是,如果你使用Matlab操作,每个工作者至少需要两千兆。

如果你使用模拟麻痹法,你将需要一个工人至少有4G的内存。

最后,你需要一些高性能以看到并行化的好处。

结论

在运行一个巨大的程序时,并行计算是非常重要的。它通过在CPU内分配工作,使执行时间最小化。因此,它有助于很好地、充分地利用CPU。

同样,在Matlab中进行并行计算也很简单。这使得它变得更加重要,因为它可以被初学者应用和使用!

希望你能从中受益。

编码愉快!


同行评审贡献者:。Monica Masae