此示例演示如何在多个GPU上并行运行MATLAB代码,首先在本地计算机上运行,然后扩展到集群。作为示例问题,此示例使用logistic映射,这是一个模拟人口增长的方程。
MATLAB中越来越多的功能提供自动并行支持,包括多gpu支持,无需任何额外编码。有关详细信息,请参阅金宝app使用自动并行支持运行MATLAB功能金宝app.例如,列车网络
功能提供了用于培训神经网络和推理的多GPU支持。金宝app有关更多信息,请参阅在云中并行扩展深度学习(深度学习工具箱).
在单个GPU上运行计算,使用gpuArray
对象作为支持GPU的MATLAB函数的输入。要了解有关支持GPU的函数的更多信息,请参阅在GPU上运行MATLAB函数.
为增长率创建gpuarray,R
,以及人口,x
.有关创建GPUARRAYS的更多信息,请参阅在GPU上建立阵列.
n = 1000;r = gpuarray.linspace(0,4,n);x = rand(1,n,'gpuarray');
使用简单的算法迭代逻辑图。由于该算法在GPU上使用启用GPU的运算符,因此计算在GPU上运行。
数量=1000;对于n = 1:numiterations x = r。* x。*(1-x);终止
计算完成后,绘制人口增长率图。
图(r,x,'.');
如果需要更高的性能,gpuArrays支持多个选项。有关列表,请参阅金宝appgpuArray
功能页面。例如,该示例中的算法仅对GPUARRASE执行元素 - 明智的操作,因此您可以使用arrayfun
功能将它们预计为GPU。
帕弗
您可以使用帕弗
要分发的循环对于
-并行工作者之间的循环迭代。如果您的计算使用支持GPU的函数,那么计算将在工作程序的GPU上运行。例如,如果使用蒙特卡罗方法随机模拟总体的演化,则使用多个GPU并行计算模拟帕弗
环
创建具有尽可能多的可用GPU的并行池。要确定可用GPU的数量,请使用gpudeviceCount.
功能。默认情况下,Matlab为每个工人分配不同的GPU以获得最佳性能。有关在并行池中选择GPU的详细信息,请参阅在并行池中使用多个GPU.
numgpus = gpudevicecount(“可用”);parpool(numgpus);
正在使用“本地”配置文件启动并行池(parpool)…连接到2个工作进程。
定义模拟的数量,并在GPU中创建一个数组来存储每个模拟的总体向量。
数值模拟=100;X=零(数值模拟,N,'gpuarray');
使用帕弗
循环将模拟分发给池中的工人。循环中的代码为初始群体创建了一个随机的GPUARRAY,并迭代Logistic地图。因为代码使用支持GPU的运算符在GPUARRASE上,所以计算自动在工作者的GPU上运行。
帕弗i = 1:numsimulation x(i,:) = rand(1,n,'gpuarray');对于n=1:numIterations X(i,:)=r.*X(i,:).*(1-X(i,:);终止终止
计算完成后,绘制所有模拟的结果。每种颜色表示不同的模拟。
图绘图(r,x,'.');
如果您需要更好地控制您的计算,您可以使用更高级的并行功能parallel.pool.DataQueue
在计算期间从工人发送数据。例如,看到使用parfor在参数扫描期间绘图.
如果要生成可重复的随机数集,则可以控制工作人员GPU上的随机数生成。有关更多信息,请参阅控制工人的随机数流.
帕菲尔
您可以使用帕菲尔
在并行池工作室中异步运行计算。如果您的计算使用启用GPU的函数,则计算在工作者的GPU上运行。例如,您异步地在多个GPU上运行Monte Carlo仿真。
要在工作人员完成计算后保留计算结果,请使用future对象。为每个模拟的结果预先分配未来对象的数组。
f(NUMSIMULATION)=并行.FEVALFUTURE;
计算帕菲尔
,必须将它们放置在函数中。例如MyFCN
包含单个模拟的代码。
类型MyFCN
函数x=myParallelFcn(r)N=1000;x=gpuArray.rand(1,N);numIterations=1000;对于N=1:numIterations x=r*x*(1-x);end-end
使用对于
循环通过模拟循环,并使用帕菲尔
在并行池中的工作进程上异步运行它们。MyFCN
在gpuarray上使用启用GPU的函数,因此它们在辅助程序的GPU上运行。因为帕菲尔
异步执行计算,它不会阻塞MATLAB,您可以在计算过程中继续工作。
对于i = 1:numsimulations f(i)= parfeval(@ myparallelfcn,1,r);终止
收集结果帕菲尔
当他们准备好了,你可以使用获取输出
或者下一个
在未来的物体上。此外,您可以使用after
或者毕竟
在准备就绪时会自动调用结果上的功能。例如,在完成后立即绘制每个模拟的结果after
关于未来的物体。每种颜色表示不同的模拟。
图持有在sulteAp(f,@(x)plot(r,x,'.'),0);
如果您可以访问具有多个GPU的集群,那么您可以扩大计算规模。使用帕尔普
函数在群集中启动并行池。当你这样做时,并行功能,如帕弗
循环或帕菲尔
,在集群工作者上运行。如果您的计算使用启用GPU的函数在GPUARRASE上,那么这些函数在群集工作者的GPU上运行。要了解有关群集上运行并行功能的更多信息,请参阅从桌面缩放到群集.
after
|fetchOutputs(Fevalfuture)
|gpuArray
|GPudevice.
|帕菲尔
|帕弗
|帕尔普