这个例子说明了如何在平行本地计算机上运行多个GPU的MATLAB代码,第一,然后扩展到集群。作为样品的问题,该示例使用逻辑映射,一个方程模型的群体的生长。
越来越多的在MATLAB特征提供自动平行的支撑,包括多GPU的支持,而不需要任何额外的编码。万博1manbetx有关详细信息,请参阅运行MATLAB与自动并行支持功能万博1manbetx。例如,trainNetwork
功能提供了神经网络和推理的训练多GPU的支持。万博1manbetx欲了解更多信息,请参阅规模达深学习并行和云(深学习工具箱)。
在单一GPU,使用运行计算gpuArray
对象作为输入来启用GPU-MATLAB函数。要了解更多关于启用GPU-功能,请参阅在GPU上运行MATLAB功能。
对于增长率创建gpuArrays,[R
,人口,X
。有关创建gpuArrays的更多信息,请参阅在GPU上建立阵列。
N = 1000;R = gpuArray.linspace(0,4,N);X =兰特(1,N,'gpuArray');
使用一个简单的算法遍历物流地图。由于算法使用GPU使运营商在gpuArrays,在计算上的GPU上运行。
numIterations = 1000;对于N = 1:numIterations X = R * X *(1-X);结束
当计算完成后,暗算人口的增长速度。
图(R,X,'');
如果您需要更多的性能,gpuArrays支持几个选项。万博1manbetx有关列表,请参阅gpuArray
功能页面。例如,在这个例子中,算法只执行对gpuArrays元素的运算,所以你可以使用arrayfun
功能预编译他们的GPU。
PARFOR
您可以使用PARFOR
循环分布对于
-loop平行工人迭代。如果你的计算使用GPU启用的功能,然后将计算在工人的GPU上运行。例如,如果使用蒙特卡洛方法随机模拟群体的进化中,模拟可使用计算与多GPU并联PARFOR
环。
创建一个平行的泳池,尽可能多的工人提供的GPU。要确定GPU的可用数量,可使用gpuDeviceCount
功能。默认情况下,MATLAB分配一个不同的GPU,以每个工人获得最佳性能。有关在并行池中选择GPU的更多信息,请参阅使用多个GPU在并行池。
parpool(gpuDeviceCount);
开始使用“本地”的个人资料...连接到2名工人并行池(parpool)。
限定的模拟次数,并且在GPU建立一个数组来存储每个模拟人口矢量。
numSimulations = 100;X =零(numSimulations,N,'gpuArray');
用一个PARFOR
循环来模拟分发到工人池。循环内的代码创建初始人口随机gpuArray,迭代和物流地图就可以了。是因为代码使用启用GPU运营商对gpuArrays时,自动计算上工人的GPU上运行。
PARFORI = 1:numSimulations X(I,:) =兰特(1,N,'gpuArray');对于n = 1时:numIterations X(I,:) = R * X(I,:)*(1-X(I,:));结束结束
当计算完成后,绘制所有模拟的结果。每种颜色代表不同的模拟。
图图(R,X,'');
如果你需要在你的计算更大的控制权,你可以使用更先进的并联功能。例如,你可以使用parallel.pool.DataQueue
计算过程中发送从工人的数据。对于一个示例,请参见剧情在与PARFOR参数扫描。
如果你想生成一个可重复的随机数集,你可以控制在工人GPU的随机数生成。欲了解更多信息,请参阅在工人控制随机数流。
parfeval
您可以使用parfeval
在并行池工人异步运行计算。如果你的计算使用GPU启用的功能,然后将计算在工人的GPU上运行。举个例子,你运行多个GPU异步Monte Carlo模拟。
为了保持计算的结果后,工人们完成他们来说,未来的使用对象。预分配未来对象的数组的每个模拟的结果。
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
在gpuArrays使用启用GPU的功能,所以他们对工人的GPU上运行。因为parfeval
执行的计算异步,它不会阻止MATLAB,您可以继续工作,而计算发生。
对于I = 1:numSimulations F(1)= parfeval(@ myParallelFcn,1,R);结束
为了收集从结果parfeval
当他们准备好了,你可以使用fetchOutputs
要么fetchNext
对未来的对象。此外,您还可以使用afterEach
要么毕竟
自动调用该函数的结果时,他们准备好了。例如,绘制每个模拟它完成后,立即使用效果afterEach
对未来的对象。每种颜色代表不同的模拟。
身材保持上afterEach(F,@(x)的曲线图(R,X,''),0);
如果你有多个GPU访问群集,则可以扩展您计算。使用parpool
功能启动了集群上的并行池。当你这样做,并联功能,如PARFOR
环或parfeval
,运行在集群工人。如果您使用的计算上gpuArrays启用GPU的功能,那么这些功能的集群工人的GPU上运行。要了解更多有关在群集上运行的并行功能,请参阅从桌面扩展到集群。
afterEach
|fetchOutputs(FevalFuture)
|gpuArray
|gpuDevice
|parfeval
|PARFOR
|parpool