主要内容

在多gpu上运行MATLAB函数

这个例子展示了如何在多个gpu上并行运行MATLAB®代码,首先在本地机器上,然后扩展到集群。作为一个样本问题,这个例子使用了逻辑图,这是一个模拟人口增长的方程。

MATLAB中越来越多的特性提供了自动并行支持,包括多gpu支持,而不需要任何额外的编码。万博1manbetx详细信息请参见运行MATLAB函数与自动并行支持万博1manbetx.例如,trainNetwork函数为神经网络的训练和推理提供了多gpu支持。万博1manbetx有关更多信息,请参见并行、gpu和云中扩展深度学习(深度学习工具箱)

使用单GPU

要在单个GPU上运行计算,使用gpuArray对象作为gpu支持的MATLAB函数的输入。要了解有关启用gpu的功能的更多信息,请参见在图形处理器上运行MATLAB函数

创建GPU数组定义增长率,r,以及人口,x.有关创建的更多信息gpuArray对象,看到在GPU上建立array

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

使用一个简单的算法迭代逻辑图。因为算法使用了gpu支持的运算符gpuArray输入数据,计算在GPU上运行。

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

计算完成后,绘制增长率与人口的关系图。

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

如果需要更高的性能,GPU阵列支持多种选项。万博1manbetx有关列表,请参见gpuArray功能页面。例如,本例中的算法仅在GPU数组上执行逐元素的操作,因此可以使用arrayfun函数为GPU预编译它们。

使用多个图形处理器parfor

你可以使用parfor分配-循环并行工作者之间的-循环迭代。如果你的计算使用GPU支持的函数,那么计算在worker的GPU上运行。例如,如果您使用蒙特卡洛方法随机模拟种群的进化,则模拟是通过多个gpu并行计算的parfor循环。

创建一个具有与可用gpu数量相同的worker的并行池parpool.若要确定可用的gpu数量,请使用gpuDeviceCount函数。默认情况下,MATLAB为每个worker分配不同的GPU以获得最佳性能。有关在并行池中选择gpu的详细信息,请参见并行池使用多gpu

numgpu = gpuDeviceCount(“可用”);parpool (numGPUs);
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:2)。

定义模拟的数量,并在GPU中创建一个数组来存储每个模拟的总体向量。

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

使用一个parfor循环将模拟分发给池中的工作人员。循环内的代码创建一个随机gpuArray对于初始总体,并在其上迭代逻辑映射。因为代码使用了gpu支持的运算符gpuArray输入数据后,计算自动在worker的GPU上运行。

parforX(i,:) = rand(1,N,“gpuArray”);n=1: X(i,:) = r.*X(i,:).*(1-X(i,:));结束结束

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

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

使用默认首选项,parpool启动流程工作者的并行池。在进程worker上并行运行代码通常会导致数据被复制到每个worker,这在使用GPU阵列时可能会使用大量的GPU内存。相反,线程工作者可以共享内存。为了减少内存使用和降低数据传输成本,可以通过调用parpool(“线程”).线程工作者只支持进程工作者可用万博1manbetx的函数的一个子集。有关更多信息,请参见选择基于线程的环境和基于进程的环境

如果需要更好地控制计算,可以使用更高级的并行功能。例如,你可以使用aparallel.pool.DataQueue在计算过程中从工作人员发送数据。有关示例,请参见使用parfor进行参数扫描时绘图

如果想要生成一组可重复的随机数,可以在worker的GPU上控制随机数的生成。有关更多信息,请参见GPU上的随机数流

异步使用多个图形处理器parfeval

你可以使用parfeval在并行池工作线程上异步运行计算。如果你的计算使用GPU支持的函数,那么计算在worker的GPU上运行。例如,在多个gpu上异步运行蒙特卡罗模拟。

为了在工作线程完成计算后保存计算结果,可以使用future对象。为每个模拟的结果预分配一个未来对象数组。

f(numSimulations) = parallel.FevalFuture;

用于运行计算parfeval,你必须把它们放在一个函数中。例如,myParallelFcn包含单个模拟的代码。

类型myParallelFcn
函数x = myParallelFcn(r) N = 1000;x = gpuArray.rand(1,N);numIterations = 1000;n=1:numIterations x = r.*x.*(1-x);结束结束

使用一个循环模拟,并使用parfeval在并行池中的工作线程上异步运行它们。myParallelFcn开启gpu功能gpuArray输入数据,所以它们在worker的GPU上运行。因为parfeval异步执行计算,它不会阻塞MATLAB,并且在计算发生时您可以继续工作。

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

从…收集结果parfeval当它们准备好了,你就可以使用了fetchOutputsfetchNext在未来对象上。你也可以用afterEach毕竟在结果准备就绪时自动调用结果上的函数。例如,要在每个模拟完成后立即绘制结果,请使用afterEach在未来对象上。每种颜色代表不同的模拟。

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


               

集群中使用多个图形处理器

如果您可以访问具有多个gpu的集群,那么您可以扩展计算。使用parpool命令用于启动集群上的并行池。当您这样做时,并行的特性,如parfor循环或parfeval,在集群worker上运行。如果你的计算使用gpu功能gpuArray输入数据,然后这些函数在集群worker的GPU上运行。注意,集群特性仅在基于流程的环境中受支持。万博1manbetx有关在集群上运行并行特性的详细信息,请参见从桌面扩展到集群

高级支持快速多节点万博1manbetxGPU通信

MATLAB中的一些多gpu特性®,包括trainNetwork,通过快速互连优化了直接通信,以提高性能。

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

如果您使用的Linux计算集群具有机器之间的快速互连(如Infiniband),或者不同机器上的gpu之间的快速互连(如GPUDirect RDMA),那么您可能能够利用MATLAB中的快速多节点支持。万博1manbetx通过设置环境变量,对池中万博1manbetx的所有工作人员启用此支持PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION1.在集群概要文件管理器中设置此环境变量。

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

另请参阅

||||||

相关的例子

更多关于

外部网站