这个示例展示了如何在多个gpu上并行运行MATLAB代码,首先是在本地机器上,然后扩展到集群。作为一个样本问题,这个例子使用了logistic图,这是一个模拟人口增长的方程。
MATLAB中越来越多的特性提供自动并行支持,包括多gpu支持,而不需要任何额外的编码。金宝app有关详细信息,请参见运行MATLAB函数与自动并行支持金宝app.例如,trainNetwork
函数为神经网络训练和推理提供多gpu支持。金宝app有关更多信息,请参见在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
当它们准备好了,你就可以使用了fetchOutputs
或fetchNext
关于未来对象。你也可以用afterEach
或毕竟
在结果准备好时自动调用函数。例如,要在每次模拟完成后立即绘制结果,请使用afterEach
关于未来对象。每种颜色代表不同的模拟。
图保存在afterEach (f, @ (x)情节(r, x,“。”), 0);
如果您可以访问具有多个gpu的集群,那么您可以扩展计算。使用parpool
命令功能,在集群上启动并行池。当你这样做时,并行特性,例如parfor
循环或parfeval
,在集群worker上运行。如果你的计算使用gpuArrays上启用了GPU的功能,那么这些功能将在集群工作器的GPU上运行。要了解关于在集群上运行并行特性的更多信息,请参见从桌面扩展到集群.
MATLAB中的一些多gpu特性®,包括trainNetwork
,通过快速互连进行直接通信,以提高性能。
如果有适当的硬件连接,那么多个gpu之间的数据传输将使用快速的点对点通信,如果可用,还包括NVLink。
如果您使用的Linux计算集群具有机器之间的快速互连(如Infiniband),或者不同机器上的gpu之间的快速互连(如GPUDirect RDMA),那么您可能能够利用MATLAB中的快速多节点支持。金宝app通过设置环境变量,在池中金宝app的所有工作人员上启用这种支持PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION
来1
.在集群概要文件管理器中设置此环境变量。
这个特性是NVIDIA NCCL库用于GPU通信的一部分。要配置它,您必须设置额外的环境变量来定义网络接口协议,尤其是NCCL_SOCKET_IFNAME
.有关更多信息,请参见NCCL文档特别是关于NCCL环境变量.
gpuArray
|gpuDevice
|parpool
|parfor
|parfeval
|fetchOutputs
|afterEach