主要内容

运行在多个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函数

创建GPU数组定义增长率,r人口,x。有关创造的更多信息gpuArray对象,看到建立数组GPU

N = 1000;r = gpuArray.linspace (0 4 N);兰德(x = 1, N,“gpuArray”);

使用一个简单的算法迭代逻辑映射。因为该算法使用GPU-enabled运营商gpuArray输入数据,计算在GPU上运行。

numIterations = 1000;n = 1: numIterations x = r。* . * (1 - x);结束

计算完成后,对人口的增长速度。

情节(r, x,“。”);

如果你需要更多的性能,GPU数组支持几个选项。金宝app列表,请参阅gpuArray功能页面。例如,该算法在这个示例中只在GPU执行element-wise操作数组,所以您可以使用arrayfun函数为GPU预编译它们。

使用多个gpu与parfor

您可以使用parfor循环分配循环迭代并行的工作之一。如果你的计算使用GPU-enabled函数,那么计算运行在GPU上的工人。例如,如果您使用蒙特卡罗方法随机模拟种群的进化,模拟计算与多个gpu并行使用parfor循环。

创建一个平行的池和尽可能多的工人使用gpu可用parpool。确定可用gpu的数量,使用gpuDeviceCount函数。默认情况下,MATLAB分配一个不同的GPU每个工人的最佳性能。在选择gpu并行池的更多信息,参见使用多个gpu并行池

numGPUs = gpuDeviceCount (“可用”);parpool (numGPUs);
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:2)。

定义的模拟,在GPU中创建一个数组来存储为每个模拟人口向量。

numSimulations = 100;X = 0 (numSimulations N,“gpuArray”);

使用一个parfor池中循环模拟分发给工人。循环内的代码创建一个随机的gpuArray初始种群,迭代逻辑映射。因为代码使用GPU-enabled运营商gpuArray输入数据,计算自动运行在GPU上的工人。

parfori = 1: numSimulations X(我:)=兰特(1,N,“gpuArray”);n = 1: numIterations X(我:)= r。* X(我:)。* (1 - X(我,:));结束结束

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

图绘制(r, X,“。”);

默认首选项,parpool开始一个平行的过程的工人。运行代码并行处理工人往往导致数据被复制到每个工人可以使用大量的GPU内存使用GPU时数组。相比之下,工人线程可以共享内存。减少内存使用量,降低数据传输成本,使用并行的线程池工人通过调用parpool(“线程”)。线工人只支持功能的一个子集用于金宝app过程的工人。有关更多信息,请参见在线程之间进行选择和基于流程的环境

如果你需要更好地控制你的计算,可以使用更先进的并行功能。例如,您可以使用一个parallel.pool.DataQueue发送的数据在计算工人。例如,看到的在参数扫描与parfor情节

如果你想生成一组重复的随机数,可以控制随机数生成GPU的工人。有关更多信息,请参见在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使用GPU-enabled功能gpuArray输入数据,所以他们运行在GPU上的工人。因为parfeval执行异步计算,它不会阻止MATLAB,你可以继续工作,而计算发生。

i = 1: numSimulations f (i) = parfeval (@myParallelFcn 1 r);结束

收集的结果parfeval当他们准备好了,你可以使用fetchOutputsfetchNext对未来的对象。同时,您可以使用afterEach毕竟自动调用函数结果当他们准备好了。例如,阴谋的结果每个仿真完成后立即使用afterEach对未来的对象。每一种颜色代表一个不同的模拟。

图保存afterEach (f, @ (x)情节(r, x,“。”),0);


               

使用多个集群gpu

如果你访问一个与多个gpu集群,然后你可以扩大你的计算。使用parpool函数在集群上开始一个平行的池。当你这样做的时候,并行特性,比如parfor循环或parfeval在集群上运行工人。如果你计算使用GPU-enabled函数gpuArray输入数据,那么这些功能运行在GPU集群的工人。注意,只在基于流程的环境支持集群功能。金宝app更多地了解集群上运行的并行特性,明白了从桌面到集群规模

先进的快速支持多节金宝app点GPU沟通

一些在MATLAB multi-GPU功能®,包括trainNetwork,是直接通过快速互联通信优化改进性能。

如果你有适当的硬件连接,那么多个gpu使用快速的点对点通信之间的数据传输,包括NVLink,如果可用。

如果您使用的是Linux集群计算与机器间快速互联如Infiniband,或快速gpu在不同的机器之间的互联,如GPUDirect RDMA,您可以利用MATLAB快速多节点支持。金宝app启用这个支持所有的工人在金宝app你的池通过设置环境变量PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION1。集群中设置这个环境变量配置文件管理器。

这个特性是NVIDIA GPU NCCL库的一部分沟通。配置它,你必须设置额外的环境变量来定义网络接口协议,特别是NCCL_SOCKET_IFNAME。有关更多信息,请参见NCCL文档特别是部分NCCL环境变量

另请参阅

||||||

相关的例子

更多关于

外部网站