主要内容

在多个gpu上运行MATLAB函数

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

MATLAB中越来越多的特性提供自动并行支持,包括多gpu支持,而不需要任何额外的编码。金宝app有关详细信息,请参见运行MATLAB函数与自动并行支持金宝app.例如,trainNetwork函数为神经网络训练和推理提供多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 = 1, N,“gpuArray”);

使用一个简单的算法来迭代逻辑图。因为算法在gpuArrays上使用了支持GPU的操作符,所以计算在GPU上运行。

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

计算完毕后,将增长率与人口作对比。

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

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

使用多个图形处理器parfor

您可以使用parfor循环分配在并行工作人员之间循环迭代。如果你的计算使用GPU启用的功能,那么计算运行在工作器的GPU上。例如,如果您使用蒙特卡罗方法来随机模拟种群的进化,模拟将使用多个gpu并行计算parfor循环。

创建一个具有尽可能多的可用gpu的并行池。要确定可用图形处理器的数量,请使用gpuDeviceCount函数。默认情况下,MATLAB为每个worker分配不同的GPU以获得最佳性能。有关在并行池中选择gpu的更多信息,请参见并行池中使用多个gpu

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

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

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

使用一个parfor循环将模拟分发给池中的工作人员。循环中的代码为初始人口创建一个随机的gpuArray,并在其上迭代逻辑映射。因为代码在gpuArrays上使用了支持GPU的操作符,所以计算会自动在worker的GPU上运行。

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

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

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

如果需要更好地控制计算,可以使用更高级的并行功能。例如,你可以用aparallel.pool.DataQueue在计算过程中从工人那里发送数据。例如,请参见Plot During Parameter Sweep with parfor

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

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

您可以使用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使用gpuArrays上使能GPU的功能,所以它们运行在worker的GPU上。因为parfeval异步执行计算,它不会阻塞MATLAB,你可以继续工作,而计算发生。

if (i) = parfeval(@myParallelFcn,1,r);结束

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

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

在集群中使用多个gpu

如果您可以访问具有多个gpu的集群,那么您可以扩展计算。使用parpool命令功能,在集群上启动并行池。当你这样做时,并行特性,例如parfor循环或parfeval,在集群worker上运行。如果你的计算使用gpuArrays上启用了GPU的功能,那么这些功能将在集群工作器的GPU上运行。要了解关于在集群上运行并行特性的更多信息,请参见从桌面扩展到集群

高级支持快速多节点金宝appGPU通信

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

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

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

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

另请参阅

||||||

相关的例子

更多关于

外部网站