这个例子展示了如何运行MATLAB代码在多个并行gpu,首先在本地机器上,然后扩大到一个集群。作为一个示例问题,使用逻辑映射的例子中,一个方程,人口的增长模型。
越来越多的功能在MATLAB提供自动并行的支持,包括multi-gpu支持,不需要任何额外的编码。金宝app有关详细信息,请参见MATLAB函数自动并行支持运行金宝app。例如,trainNetwork
函数提供了multi-gpu支持训练神经网络和推理。金宝app有关更多信息,请参见并行扩展深度学习和云(深度学习工具箱)。
运行一个GPU计算,使用gpuArray
对象作为输入GPU-enabled MATLAB函数。更多地了解GPU-enabled功能,看看运行在GPU MATLAB函数。
创建gpuArrays增长率,r
人口,x
。创建gpuArrays更多信息,请参阅建立数组GPU。
N = 1000;r = gpuArray.linspace (0 4 N);兰德(x = 1, N,“gpuArray”);
使用一个简单的算法迭代逻辑映射。因为该算法使用GPU-enabled gpuArrays运营商,计算在GPU上运行。
numIterations = 1000;为n = 1: numIterations x = r。* . * (1 - x);结束
计算完成后,对人口的增长速度。
情节(r, x,“。”);
如果你需要更多的性能,gpuArrays支持几个选项。金宝app列表,请参阅gpuArray
功能页面。例如,该算法在这个示例中只执行对gpuArrays element-wise操作,所以您可以使用arrayfun
函数为GPU预编译它们。
parfor
您可以使用parfor
循环分配为
循环迭代并行的工作之一。如果你的计算使用GPU-enabled函数,那么计算运行在GPU上的工人。例如,如果您使用蒙特卡罗方法随机模拟种群的进化,模拟计算与多个gpu并行使用parfor
循环。
创建一个平行的池和尽可能多的工人gpu可用。确定可用gpu的数量,使用gpuDeviceCount
函数。默认情况下,MATLAB分配一个不同的GPU每个工人的最佳性能。在选择gpu并行池的更多信息,参见使用多个gpu并行的池中。
parpool (gpuDeviceCount);
开始平行池(parpool)使用“本地”概要文件…连接到两个工人。
定义的模拟,在GPU中创建一个数组来存储为每个模拟人口向量。
numSimulations = 100;X = 0 (numSimulations N,“gpuArray”);
使用一个parfor
池中循环模拟分发给工人。循环内的代码创建一个随机gpuArray初始种群,并迭代逻辑图。因为代码使用GPU-enabled gpuArrays运营商,计算自动运行在GPU上的工人。
parfori = 1: numSimulations X(我:)=兰特(1,N,“gpuArray”);为n = 1: numIterations X(我:)= r。* X(我:)。* (1 - X(我,:));结束结束
计算完成后,所有模拟的结果。每一种颜色代表一个不同的模拟。
图绘制(r, X,“。”);
如果你需要更好地控制你的计算,可以使用更先进的并行功能。例如,您可以使用一个parallel.pool.DataQueue
发送的数据在计算工人。例如,看到的在参数扫描与parfor情节。
如果你想生成一组重复的随机数,可以控制工人GPU的随机数生成。有关更多信息,请参见控制随机数流工人。
parfeval
您可以使用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
使用gpuArrays GPU-enabled功能,所以他们运行在GPU上的工人。因为parfeval
执行异步计算,它不会阻止MATLAB,你可以继续工作,而计算发生。
为i = 1: numSimulations f (i) = parfeval (@myParallelFcn 1 r);结束
收集的结果parfeval
当他们准备好了,你可以使用fetchOutputs
或fetchNext
对未来的对象。同时,您可以使用afterEach
或毕竟
自动调用函数结果当他们准备好了。例如,阴谋的结果每个仿真完成后立即使用afterEach
对未来的对象。每一种颜色代表一个不同的模拟。
图保存在afterEach (f, @ (x)情节(r, x,“。”),0);
如果你访问一个与多个gpu集群,然后你可以扩大你的计算。使用parpool
函数在集群上开始一个平行的池。当你这样做的时候,并行特性,比如parfor
循环或parfeval
在集群上运行工人。如果你计算使用gpuArrays GPU-enabled功能,那么这些功能运行在GPU集群的工人。更多地了解集群上运行的并行特性,明白了从桌面到集群规模。
afterEach
|fetchOutputs (FevalFuture)
|gpuArray
|gpuDevice
|parfeval
|parfor
|parpool