MATLAB的高性能计算(HPC)和“大数据”数据类型
目录
我现在正在为
SC22
这是我作为MathWorker参加的第一次超级计算会议。当与来自其他高性能计算组织的老朋友制定计划时,他们对MATLAB不太了解,我经常被问到“MATLAB中的高性能计算....”除此之外还有什么
parfor
?'
parfor
它非常棒,允许用户只添加3个字母就可以从串行循环转换为并行循环,但这只是MATLAB中并行和可扩展编程的可能性的开始。
今天,我想简要介绍一下MATLAB的HPC数据类型,它允许用户使用gpu、分布式内存和处理核外数据。
GPU数组- GPU编程变得简单
gpu
图形处理单元(Graphics Processing Units)可以极大地加速某些类型的计算。MATLAB目前只支持NVIDIA图形处理器金宝app,传统上使用一种名为
CUDA
.你可以在CUDA编码,如果你想,并接口到MATLAB使用
CUDA mex函数
....但有一个更简单的方法。
假设你有一个数组,
X
X = [1,2,3];
将此传输到GPU with
G = gpuArray(X);
你接下来做的任何计算
gpuarray
G
将自动在GPU上执行。
Gsq = g ^2;% GPU执行
Gsin = sin(G);% GPU执行
与其他“HPC数据类型”一样,您使用
收集
将结果转换回“正常”MATLAB矩阵
Xsq = gather(Gsq);
Xsin = gather(Gsin);
dlarray -专门用于深度学习训练的对象
dlarray
是用于进行深度学习的数组类型。它支持金宝app
自动分化
并且可以包含由CPU计算的“正常”数组
gpuArrays
.如何使用
dlarrays
这超出了本文的范围,所以我只展示如何创建它们并链接到文档。
X = randn(3,5);
dlX = dlarray(X)使用dlX所做的任何事情都将使用CPU进行计算
如果我们想要
dlarray
在GPU上创建
gX = randn(3,5,“gpuArray”);
dlgX = dlarray(gX)你用dlgX做的任何事情都将使用GPU进行计算
高数组——当行数多于内存时使用
高大的数组
对于具有数百万甚至数十亿行的表格数据非常有用。事实上,如此多的行,您永远无法将它们全部加载到内存中。
假设您的所有数据都存储在一个名为。csv文件的文件夹中
mydata
.我们首先创建一个
数据存储
指向所有这些文件。
数据存储(“mydata \ * . csv”);
注意,我们并没有将所有的数据加载到内存中,我们只是创建了一个对象,
ds,
它表示并指向数据。我们可以看到它的类型
类(ds)
在此基础上进行操作
数据存储
现在我们从它创建一个高数组。因为我已经安装了并行计算工具箱,所以我还将启动一个本地池
高
数组操作是并行执行的。如果没有并行计算工具箱,所有的安装都将按顺序执行。
删除(gcp (“nocreate”))%确保当前没有并行池
parpool (“进程”);
Tt =高(ds)
这显示了数据的预览。注意,tall数组的高度是未知的(MATLAB只是告诉我们有“M”行),因为我们还没有解析所有的文件。我们可以对这个高数组进行操作,就像它是MATLAB中的任何其他表一样。
我们求均值
BigThings
列
卑鄙的(卑鄙的)
这演示了高数组和普通内存中的MATLAB数组之间的另一个区别
Deffered评价
.在显式请求执行计算之前,所有内容都不计算。当对高数组进行多次操作时,这种行为允许MATLAB在被要求评估最终结果时最小化通过数据的次数。
我们要求使用
收集
命令。因为我有并行计算工具箱,所以使用本地进程池自动并行完成。
收集(BigThingsMean)
Ans = 4.6679
分布式阵列——将您的阵列分布在HPC集群的多个节点上
正如你可以使用的
高(foo)
要创建高数组,可以使用
分布式(foo)
创建分布式数组。使用分布式数组,结果是
是
在内存中,但是这个内存是在多个worker之间共享的。确保这些worker位于HPC集群的多个节点上,并且完全分布式、并行计算是属于您的。
第一个例子创建了一个
分布式
数组
一个
从一个普通数组
X
这并不是特别有用,因为如果数组适合单个机器的内存,那么使用分布式数组就没有多大意义了。我们将看到更复杂、更有用的创建方法
分布式
数组。
从普通数组X创建分布式数组
X = rand(4);
A =分布(X);
你可以使用这个变量
一个
作为一个单一的实体,而不必担心它的分布式性质。例如,计算奇异值分解的代码与我们处理普通数组的代码是相同的。
distres = svd(A);计算分布式阵列的svd, A
结果仍然是一个分布式数组
类(分配)
当您准备将结果返回到客户机内存中时,请使用
收集
函数,就像处理一个高数组一样。但是,在这里必须小心确保我们只请求适合客户端机器内存的结果。
%从集群返回
Res =收集(distres)
这是一个普通的MATLAB数组。
类(mysvd)
在这里,我展示了如何从一个普通的MATLAB数组创建分布式数组,当您仔细考虑它时,除了用于原型设计之外,它有点毫无意义。
如果您可以将X放入内存中,那么使用分布式数组而不是普通数组没有任何好处。
我们还可以使用函数,直接在worker上创建分布式数组
兰德,randn
而且
0
.这样,整个矩阵就不必放入客户机的内存中。例如,
random = rand(5,“分布式”);
类(distRandom)
共分布数组-分布式数组用户的高级动作
分布式
数组实际上是一种方便的底层数据类型的用户界面
codistributed
数组。我们可以这样想:A
分布式
数组是指整个分布式矩阵的抽象,您可以使用它而不用担心它的分布式性质。存在于每个worker上的数组的部分是a
codistributed
数组中。
明确使用
codistributed
数组是一个相当高级的动作,因为它们几乎总是在内部使用
spmd
块本身是比许多用户使用的更高级的并行结构。
删除(gcp (“nocreate”))%确保当前没有并行池
parpool (“进程”2);创建一个有2个工人的池
现在我们有游泳池了,我们可以
spmd
块
spmd每个worker运行spmd块的内容
格式紧凑的
A = 0 (80,1000);
D =共分布(A)
流("这个worker的D类是%s"类(D))
结束
流("在spmd块外的D的类是%s"类(D))
上面的例子有点傻,因为每个worker都会创建
整个
数组
一个
在使用
codistributed
函数将其传播到各个工作人员。然而,它的目的是展示幕后发生的事情。
外
的
spmd
block在我们的客户端MATLAB中,
D
是一个
分布式
引用整个矩阵的数组。
内部
的
spmd
块,因此在每个工人上,D是a
codistributed
数组中。我们可以得到
D
对象存储在每个工作者上
getLocalPart ()
函数在
spmd
块。
关于共分布数组的进一步讨论超出了本文的范围,但实际上您可以使用它们来更好地控制分布式数组。例如,您可以对存储在每个工作人员或更改上的部分执行一些独特的操作
如何
分布式数组分布在使用
codistributor
这就是MATLAB中一些数据类型的快速概览,这些数据类型有助于高性能计算。
- 类别:
- 高性能计算,
- MATLAB编程语言,
- 性能
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。