在多个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_communication
至1
。在集群配置文件管理器中设置此环境变量。
此功能是用于GPU通信的NVIDIA NCCL库的一部分。要配置它,您必须设置其他环境变量来定义网络接口协议,尤其是nccl_socket_ifname
。有关更多信息,请参阅NCCL文档特别是关于NCCL环境变量。
也可以看看
gpuarray
|gpudevice
|Parpool
|parfor
|帕菲瓦尔
|获取图
|后到达
相关示例
- 在GPU上运行MATLAB功能
- 从桌面到群集扩展
- 并行扩展深度学习,在GPU和云中扩展(深度学习工具箱)