主要内容

在多gpu上运行MATLAB函数

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

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

使用单一GPU

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

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

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

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

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

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

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

如果您需要更高的性能,GPU阵列支持几个选项。有关列表,请参见gpuArray功能页面。例如,本例中的算法只在GPU阵列上执行基于元素的操作,因此您可以使用arrayfun函数为GPU预编译它们。

使用多个图形处理器parfor

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

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

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

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

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

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

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

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

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

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

如果需要更好地控制计算,可以使用更高级的并行功能。例如,你可以使用aparallel.pool.DataQueue在计算期间从工作者发送数据。示例请参见使用parfor在参数扫描期间绘制

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

异步使用多个gpuparfeval

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

要在工作者完成计算后保存计算结果,请使用future对象。为每个模拟的结果预先分配一个未来对象数组。

f (numSimulations) = parallel.FevalFuture;

用来进行计算parfeval,则必须将它们放在函数中。例如,myParallelFcn包含单个模拟的代码。

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

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

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

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

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


               

集群使用多个gpu

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

高级支持快速多节点GPU通信

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

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

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

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

另请参阅

||||||

相关的例子

更多关于

外部网站

Baidu
map