主要内容

在多个GPU上运行MATLAB功能

此示例显示了如何并行在多个GPU上运行MATLAB代码,首先是在本地计算机上,然后扩展到群集。作为示例问题,该示例使用逻辑图,该方程是建模人口增长的方程式。

MATLAB中越来越多的功能提供自动并行支持,包括多GPU支持,而无需任何额外的编码。金宝app有关详细信息,请参阅运行具有自动并行支持的MATLAB功能金宝app。例如,火车网功能为培训神经网络和推理提供了多GPU支持。金宝app有关更多信息,请参阅并行扩展深度学习,在GPU和云中扩展(深度学习工具箱)

使用单个GPU

要在单个GPU上运行计算,请使用gpuarray对象作为启用GPU的MATLAB功能的输入。要了解有关启用GPU功能的更多信息,请参见在GPU上运行MATLAB功能

创建GPUARRAYS的增长率,r,人口,X。有关创建GPUarrays的更多信息,请参阅在GPU上建立数组

n = 1000;r = gpuarray.linspace(0,4,n);x = rand(1,n,'gpuarray');

使用简单的算法来迭代逻辑图。由于该算法在GPUarrays上使用启用GPU的运算符,因此在GPU上运行的计算。

计算= 1000;为了n = 1:数字x = r。*x。*(1-x);结尾

完成计算后,将增长率策划针对人群。

情节(r,x,'。');

如果您需要更多的性能,则GPUArrays支持几个选项。金宝app对于列表,请参阅gpuarray功能页面。例如,此示例中的算法仅在gpuarrays上执行元素操作,因此您可以使用arrayfun功能以将其用于GPU。

使用多个GPUparfor

您可以使用parfor- 循环分发为了- 平行工人之间的环路迭代。如果您的计算使用启用GPU的功能,则计算在工作人员的GPU上运行。例如,如果您使用Monte Carlo方法随机模拟了种群的演变,则同时使用多个GPU计算模拟parfor-环形。

创建一个平行池,其中包括与GPU一样多的工人。要确定可用的GPU数量,请使用gpudevicecount功能。默认情况下,MATLAB为每个工人分配了不同的GPU,以获得最佳性能。有关在平行池中选择GPU的更多信息,请参见在并行池中使用多个GPU

numgpus = gpudevicecount(“可用的”);parpool(numgpus);
使用“本地”配置文件...连接到2位工人。

定义仿真数,并在GPU中创建一个数组以存储每个仿真的总体向量。

数字= 100;x = zeros(numsimulations,n,'gpuarray');

用一个parfor循环向池中的工人分发模拟。循环内部的代码为初始总体创建一个随机的GPUARRAY,并在其上迭代逻辑图。由于该代码在GPUArrays上使用了启用GPU的运算符,因此计算会自动运行在工人的GPU上。

parfori = 1:numsimulations x(i,:) = rand(1,n,,'gpuarray');为了n = 1:数字x(i,:) = r。*x(i,:)。*(1-x(i,:));结尾结尾

完成计算后,绘制所有模拟的结果。每种颜色代表不同的模拟。

图图(r,x,'。');

如果您需要对计算的更大控制,则可以使用更高级的并行功能。例如,您可以使用Parallel.Pool.Dataqueue在计算过程中从工人那里发送数据。例如,请参阅参数扫描期间的情节与Parfor

如果要生成一组可再现的随机数,则可以控制Worker GPU上的随机数生成。有关更多信息,请参阅控制工人的随机数流

与多个GPU异步一起使用帕菲瓦尔

您可以使用帕菲瓦尔在平行池工人上不同步运行计算。如果您的计算使用启用GPU的功能,则计算在工作人员的GPU上运行。例如,您在多个GPU上进行了Monte Carlo模拟。

要在工人完成后保持计算结果,请使用将来的对象。在每个仿真的结果中,预先分配一系列未来对象。

f(numSimulations)= Parallel.FevalFuture;

运行计算帕菲瓦尔,您必须将它们放入功能中。例如,myparallelfcn包含单个模拟的代码。

类型myparallelfcn
函数x = myParallelfCn(r)n = 1000;x = gpuarray.rand(1,n);计算= 1000;n = 1:数字x = r。*x。*(1-x);结尾

用一个为了循环循环浏览模拟,并使用帕菲瓦尔在平行池中的工人上将它们异步运行。myparallelfcn在GPUArrays上使用启用GPU的功能,因此它们在工作人员的GPU上运行。因为帕菲瓦尔异步执行计算,它不会阻止MATLAB,并且您可以在计算发生时继续工作。

为了i = 1:numsimulations f(i)= parfeval(@myparallelfcn,1,r);结尾

从中收集结果帕菲瓦尔当他们准备好时,您可以使用获取图或者fetchnext关于将来的对象。另外,您可以使用后到达或者毕竟在准备就绪时会自动调用结果。例如,要在完成后立即绘制每个模拟的结果,请使用后到达关于将来的对象。每种颜色代表不同的模拟。

aftereach(f,@(x)图(r,x,'。'),0);

在集群中使用多个GPU

如果您可以访问具有多个GPU的群集,则可以扩展计算。使用Parpool功能以在集群上启动并行池。当您这样做时,平行功能,例如parfor循环或帕菲瓦尔,在集群工人上运行。如果您的计算在GPUArrays上使用启用GPU的功能,则这些功能在群集工作人员的GPU上运行。要了解有关集群上的并行功能的更多信息,请参阅从桌面到群集扩展

快速多节点GPU通金宝app信的高级支持

MATLAB中的一些多GPU功能®, 包含火车网通过快速互连以提高性能,以通过快速互连进行直接通信进行优化。

如果您有适当的硬件连接,则多个GPU之间的数据传输使用快速对等通信(包括NVLink)(如果有)。

如果您使用的是Infiniband等机器之间快速互连的Linux计算集群,或者使用了不同机器上GPU之间的快速互连(例如GPUDIRECT RDMA),则您可能能够利用MATLAB中的快速多节点支持。金宝app通过设置环境变量,对池中金宝app的所有工人启用此支持parallel_server_fast_multinode_gpu_communication1。在集群配置文件管理器中设置此环境变量。

此功能是用于GPU通信的NVIDIA NCCL库的一部分。要配置它,您必须设置其他环境变量来定义网络接口协议,尤其是nccl_socket_ifname。有关更多信息,请参阅NCCL文档特别是关于NCCL环境变量

也可以看看

||||||

相关示例

更多关于

外部网站