MATLAB的博客

实用的建议在前沿的人

MATLAB的高性能计算(HPC)和“大数据”数据类型

我正在准备 SC22 ,我的第一个超级计算大会MathWorker。在制定计划和其他高性能计算组织的老朋友不知道MATLAB这么好,我经常被问到的HPC MATLAB ....除此之外还有什么 parfor 吗?”
parfor 是伟大的,允许用户从一个连续循环到一个平行的只有三个字母,但它只是平行的可能性和可伸缩的开始在MATLAB编程。
今天,我想给一个简短的调查,我认为的MATLAB的HPC数据类型允许用户利用gpu,分布式内存和处理核外数据。

gpuArrays - GPU编程容易

gpu 或图形处理单元,可以大大加快某些类型的计算。MATLAB目前只支持NVIDIA gpu传金宝app统上使用一种编程语言是 CUDA 。你可以在CUDA代码,如果你想和MATLAB使用接口 CUDA墨西哥人的功能 ....但有一个更简单的方法。
说你有一个数组, X
X = (1、2、3);
Transfer this to the GPU with
G = gpuArray (X);
你后来做任何计算 gpuarray G 将自动在GPU上执行。
Gsq = g . ^ 2;%在GPU上执行
Gsin =罪(G);%在GPU上执行
与其他HPC数据类型,您可以使用 收集 将结果回“正常”MATLAB矩阵
Xsq =收集(Gsq);
Xsin =收集(Gsin);
gpuArrays要求 并行计算工具箱

dlarray——专业深度学习培训对象

dlarray 是一个数组类型进行深度学习。它支持金宝app 自动分化 和可以包含“正常”数组,由CPU以及评估 gpuArrays 。如何使用 dlarrays 深入学习已经超出了本文的范围,所以我就给和链接到文档创建它们。
X = randn (3、5);
dlX = dlarray (X)%与dlX你做的任何事都将被评估使用CPU
dlX =
3×5 dlarray -0.1472 -0.5046 0.6487 -0.4711 0.3018 1.0078 -1.2706 0.8257 0.1370 0.3999 -2.1237 -0.3826 -1.0149 -0.2919 -0.9300
如果我们希望我们的 dlarray 在GPU创建
gX = randn (3、5、“gpuArray”);
dlgX = dlarray (gX)%你做的任何事都与使用GPU dlgX将被评估
dlgX =
3×5 gpuArray dlarray -0.7891 1.2915 0.8958 -1.6692 1.1301 -1.0132 0.2066 -0.3653 0.8798 2.0214 1.2300 -1.1879 -1.2931 -0.8332 0.5199
你需要 深度学习工具箱 利用 dlarray。

高数组——当你比记忆更行

高大的数组 是很有用的,当你有数百万表格数据,甚至数十亿的行。这么多行,事实上,你不可能全部加载到内存中。
想象一下你所有的数据存储在. csv文件到一个文件夹中 mydata 。我们首先创建一个 数据存储 指所有这些文件。
ds =数据存储(“mydata \ * . csv”);
请注意,我们没有加载所有数据到内存中,我们只是创建了一个对象, ds, 代表和指向数据。我们可以看到它的类型
类(ds)
ans =“matlab.io.datastore.TabularTextDatastore”
操作这个 数据存储 现在我们创建一个高的数组。自从我安装了并行计算工具箱,所以我还将启动本地池 数组操作并行执行。没有一个并行计算工具箱安装一切都会按顺序进行。
删除(gcp (“nocreate”))%确保没有现有并行池
parpool (“进程”);
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:8)。
tt =高(ds)
tt =米×4表的事情 其它事情 BigThings SmallThings _________ ___________ _____ ___________0.85071 0.61257 7.3864 0.076903 0.56056 0.98995 5.8599 0.058145 0.92961 0.52768 2.4673 0.092831 0.69667 0.47952 6.6642 0.058009 0.58279 0.80135 0.83483 0.0016983 0.8154 0.22784 6.2596 0.012086 0.87901 0.49809 6.6094 0.086271 0.98891 0.90085 7.2975 0.04843: : : : : : : :
这显示了一个预览的数据。注意,高阵列的高度是未知的(MATLAB只是告诉我们,有“M”行),因为我们还没有通过所有的文件进行解析。我们可以操作这个高阵列像任何其他表在MATLAB。
让我们得到的均值 BigThings
BigThingsMean =意味着(tt.BigThings)
双BigThingsMean =高?预览延期。学习更多的知识。
这演示了另一个区别高数组和正常的,内存中的MATLAB数组— Deffered评价 。一切仍未评价的,直到你明显地请求执行计算。当你进行多个操作高阵列,这种行为使MATLAB的数量降到最低时通过数据要求评估的最终结果。
我们要求评估使用 收集 命令。因为我有并行计算工具箱,它是自动完成并行使用本地进程池。
收集(BigThingsMean)
评估高表达式使用并行池“过程”:通过1对1:在4.3秒完成评估在5.2秒完成
ans = 4.6679
高阵列工作只能有一个resonable-sized块的数据在内存中,也可以使用并行等基础设施在您的本地计算机上并行的工作,传统的高性能计算集群或 甚至引发集群
高阵列基MATLAB中可用但可以加速和扩展使用 并行计算工具箱 和进一步扩展 MATLAB并行服务器

跨多个节点的分布式阵列——传播你的阵列的HPC集群

如果你的矩阵太大适合到一个节点的HPC集群,使用 分布式阵列 跨多个节点传播。
正如您可以使用 高(foo) 创造高的数组,您可以使用 分布式(foo) 创建分布式阵列。与分布式阵列,结果 在内存中,但内存是共享的跨多个工人。确保这些工人在HPC集群的多个节点和完全分布式并行计算是你的。
我们的第一个例子创建了一个 分布式 数组 一个 从一个正常的数组 X 这不是particulalry有用,因为如果数组适合记忆的一个机器,没有使用分布式阵列有太大意义。我们将会看到更复杂的,有用的,创建的方法 分布式 数组。
从正常的数组X %创建分布式阵列
X =兰德(4);
分布式(X) =;
你可以使用这个变量 一个 作为一个单一的实体,而不必担心它的分布式特性。计算奇异值分解的代码,例如,是相同的我们如何做一个正常的数组。
压力=圣言();%计算分布式阵列的圣言,
结果仍然是一个分布式阵列
类(分配)
ans =“分布式”
当你准备把结果返回到客户端内存,使用 收集 功能,就像一个高大的数组。你必须小心确保我们只请求结果将符合我们的客户机器的内存。
%带回从集群
res =收集(分配)
res = 4×1
1.8891 0.7206 0.6445 0.2742
这是一个正常的MATLAB数组。
类(mysvd)
ans =“双”
这里,我展示了创建一个分布式阵列从一个正常的MATLAB数组,当你想想,有点意义除了用于原型。 如果你能适应X到内存中,没有什么是获得使用分布式阵列代替正常的数组。
我们还可以创建分布式阵列directlty工人使用等功能 兰德,randn 0 。这样,整个矩阵从来没有适合客户机的内存。例如,
distRandom =兰德(5“分布式”);
类(distRandom)
ans =“分布式”
通常, 创建 分布式阵列是最困难的一个分布式计算工作流的一部分!创建的其他方法包括使用 spmd, codistributed 数组(参见下一节) 数据存储。 参考文档 为更多的细节。
超过500个功能是支持分布式阵列金宝app 包括绝大多数的线性代数操作(注意HPC专家:我们使用的实现 scalapack图书馆 其中一些幕后)。
分布式阵列需要 并行计算工具箱 作为一个最低但你也需要MATLAB并行服务器利用多个节点操作。

Codistributed数组—先进的分布式阵列用户动作

分布式 数组实际上是一个方便的用户界面较低级别的数据类型 codistributed 数组。思路是这样的:一个 分布式 数组是指抽象整个分布式矩阵,可以使用分布式narture而不用担心它。数组的一部分,存在于每一个工人都是 codistributed 数组中。
明确的使用 codistributed 数组是一个非常先进的移动,因为他们几乎总是中使用 spmd 块是自己比许多用户使用更先进的并行结构。
删除(gcp (“nocreate”))%确保没有现有并行池
parpool (“进程”2);% 2工人创建一个池
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:2)。
现在我们有一个游泳池,我们可以运行一个 spmd
spmd%每个职工spmd块的内容
格式紧凑的
一个= 0 (80、1000);
D = codistributed (A)
流(“D类职工% s”类(D))
结束
工作1:这个工人存储D (:, 1:50 0)。LocalPart: [80 x500双]Codistributor: [1 x1 codistributor1d]工人2:这个工人存储D (:, 501:1000)。LocalPart: [80 x500双]Codistributor: [1 x1 codistributor1d]工人1:类D的职工codistributed工人2:类D的职工codistributed
流(“类以外的D spmd块% s”类(D))
类之外的D spmd块分布
上面是一个有点愚蠢的例子因为每个工人创造了 整个 数组 一个 在使用之前 codistributed 功能蔓延在工人。然而,它显示的目的在幕后发生了什么。 spmd 我们的客户用MATLAB块, D 是一个 分布式 数组是指整个矩阵。 内部 spmd 块,因此在每个工人,D是一个 codistributed 数组中。我们可以得到的部分 D 存储在每个工人使用 getLocalPart () 函数在一个 spmd 块。
codistributed阵列的进一步的讨论超出了本文的范围,但实际上你使用它们更好地控制你的分布式阵列。你可以,例如,做一些独特的一部分存储在每个工人或改变 如何 分布式aray分布在工人使用 codistributor
现在你明白了吧,一个快速调查的一些数据类型在MATLAB方便高的性能计算。
|

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。