运行在多个gpu MATLAB函数
这个例子展示了如何运行MATLAB代码在多个并行gpu,首先在本地机器上,然后扩大到一个集群。作为一个示例问题,使用逻辑映射的例子中,一个方程,人口的增长模型。
越来越多的功能在MATLAB提供自动并行的支持,包括multi-gpu支持,不需要任何额外的编码。金宝app有关详细信息,请参见MATLAB函数自动并行支持运行金宝app。例如,trainNetwork
函数提供了multi-gpu支持训练神经网络和推理。金宝app有关更多信息,请参见并行扩展深度学习,在gpu上,在云端(深度学习工具箱)。
使用一个GPU
运行一个GPU计算,使用gpuArray
对象作为输入GPU-enabled MATLAB函数。更多地了解GPU-enabled功能,看看运行在GPU MATLAB函数。
创建gpuArrays增长率,r
人口,x
。创建gpuArrays更多信息,请参阅建立数组GPU。
N = 1000;r = gpuArray.linspace (0 4 N);兰德(x = 1, N,“gpuArray”);
使用一个简单的算法迭代逻辑映射。因为该算法使用GPU-enabled gpuArrays运营商,计算在GPU上运行。
numIterations = 1000;为n = 1: numIterations x = r。* . * (1 - x);结束
计算完成后,对人口的增长速度。
情节(r, x,“。”);
如果你需要更多的性能,gpuArrays支持几个选项。金宝app列表,请参阅gpuArray
功能页面。例如,该算法在这个示例中只执行对gpuArrays element-wise操作,所以您可以使用arrayfun
函数为GPU预编译它们。
使用多个gpu与parfor
您可以使用parfor
循环分配为
循环迭代并行的工作之一。如果你的计算使用GPU-enabled函数,那么计算运行在GPU上的工人。例如,如果您使用蒙特卡罗方法随机模拟种群的进化,模拟计算与多个gpu并行使用parfor
循环。
创建一个平行的池和尽可能多的工人gpu可用。确定可用gpu的数量,使用gpuDeviceCount
函数。默认情况下,MATLAB分配一个不同的GPU每个工人的最佳性能。在选择gpu并行池的更多信息,参见使用多个gpu并行池。
numGPUs = gpuDeviceCount (“可用”);parpool (numGPUs);
开始平行池(parpool)使用“本地”概要文件…连接到两个工人。
定义的模拟,在GPU中创建一个数组来存储为每个模拟人口向量。
numSimulations = 100;X = 0 (numSimulations N,“gpuArray”);
使用一个parfor
池中循环模拟分发给工人。循环内的代码创建一个随机gpuArray初始种群,并迭代逻辑图。因为代码使用GPU-enabled gpuArrays运营商,计算自动运行在GPU上的工人。
parfori = 1: numSimulations X(我:)=兰特(1,N,“gpuArray”);为n = 1: numIterations X(我:)= r。* X(我:)。* (1 - X(我,:));结束结束
计算完成后,所有模拟的结果。每一种颜色代表一个不同的模拟。
图绘制(r, X,“。”);
如果你需要更好地控制你的计算,可以使用更先进的并行功能。例如,您可以使用一个parallel.pool.DataQueue
发送的数据在计算工人。例如,看到的在参数扫描与parfor情节。
如果你想生成一组重复的随机数,可以控制工人GPU的随机数生成。有关更多信息,请参见控制随机数流工人。
使用多个异步gpuparfeval
您可以使用parfeval
在并行运行异步计算池的工人。如果你的计算使用GPU-enabled函数,那么计算运行在GPU上的工人。作为一个例子,你跑蒙特卡罗模拟在多个异步gpu。
工人们完成后进行计算的结果,使用未来的对象。Preallocate未来对象的数组,每个仿真的结果。
f (numSimulations) = parallel.FevalFuture;
计算与运行parfeval
,你必须把它们在一个函数。例如,myParallelFcn
的代码包含一个模拟。
类型myParallelFcn
函数x = myParallelFcn (r) N = 1000;x = gpuArray.rand (1, N);numIterations = 1000;为n = 1: numIterations x = r。* . * (1 - x);结束结束
使用一个为
循环遍历模拟,和使用parfeval
异步运行它们的工人并行池。myParallelFcn
使用gpuArrays GPU-enabled功能,所以他们运行在GPU上的工人。因为parfeval
执行异步计算,它不会阻止MATLAB,你可以继续工作,而计算发生。
为i = 1: numSimulations f (i) = parfeval (@myParallelFcn 1 r);结束
收集的结果parfeval
当他们准备好了,你可以使用fetchOutputs
或fetchNext
对未来的对象。同时,您可以使用afterEach
或毕竟
自动调用函数结果当他们准备好了。例如,阴谋的结果每个仿真完成后立即使用afterEach
对未来的对象。每一种颜色代表一个不同的模拟。
图保存在afterEach (f, @ (x)情节(r, x,“。”),0);
使用多个集群gpu
如果你访问一个与多个gpu集群,然后你可以扩大你的计算。使用parpool
函数在集群上开始一个平行的池。当你这样做的时候,并行特性,比如parfor
循环或parfeval
在集群上运行工人。如果你计算使用gpuArrays GPU-enabled功能,那么这些功能运行在GPU集群的工人。更多地了解集群上运行的并行特性,明白了从桌面到集群规模。
先进的快速支持多节金宝app点GPU沟通
一些在MATLAB multi-GPU功能®,包括trainNetwork
,是直接通过快速互联通信优化改进性能。
如果你有适当的硬件连接,那么多个gpu使用快速的点对点通信之间的数据传输,包括NVLink,如果可用。
如果您使用的是Linux集群计算与机器间快速互联如Infiniband,或快速gpu在不同的机器之间的互联,如GPUDirect RDMA,您可以利用MATLAB快速多节点支持。金宝app启用这个支持所有的工人在金宝app你的池通过设置环境变量PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION
来1
。集群中设置这个环境变量配置文件管理器。
这个特性是NVIDIA GPU NCCL库的一部分沟通。配置它,你必须设置额外的环境变量来定义网络接口协议,特别是NCCL_SOCKET_IFNAME
。有关更多信息,请参见NCCL文档特别是部分NCCL环境变量。
另请参阅
gpuArray
|gpuDevice
|parpool
|parfor
|parfeval
|fetchOutputs
|afterEach
相关的例子
- 运行在GPU MATLAB函数
- 从桌面到集群规模
- 并行扩展深度学习,在gpu上,在云端(深度学习工具箱)