主要内容

并行分区数据存储

并行分区数据存储,并行池中的每个工作台的一部分数据存储,可以在许多情况下提供优势:

  • 仅对整个数据存储的一部分或同时在几个定义的部件上执行一些操作。

  • 在数据存储中搜索特定值,所有工人在自己的分区上同时行动。

  • 对所有分区的工人进行减少计算。

此示例显示了如何使用划分并行化数据存储读取数据的读取。它使用Matlab中提供的航空公司数据的小型数据存储®,并从其中找到非南价值的平均值'arrdelay'柱子。

计算平均值的简单方法是将所有非NAN值的总和除以非NAN值的数量。以下代码以非并行方式首先为DataStore执行此操作。首先,您可以定义一个函数来实现计数和总和。如果要运行此示例,请在MATLAB命令搜索路径上的文件夹中复制并保存此函数。

功能[总,计数] = SumandCountArivaldelay(DS)总数= 0;count = 0;尽管Hasdata(DS)数据=读取(DS);总=总+总和(data.arrdelay,1,'omitnan');count = count + sum(〜isnan(data.arrdelay));结尾结尾

以下代码创建数据存储,调用函数,并计算没有任何并行执行的均值。这tTOC.函数用于时间执行,这里和稍后并行情况。

ds = datastore(repmat({'airlinesmall.csv'},20,1),'尾声''na');ds.selectedvariablenames ='arrdelay';重置(DS);TIC [总,计数] = SUMANDCOUNTARRIVIVEDELAY(DS)SUMTIME = TOC平均值=总/计数
总= 17211680 count = 2417320 sumtime = 7.7905平均值= 7.1201

划分函数允许您将数据存储区分为较小的部分,每个部分表示为数据存储本身。这些较小的数据存储在彼此完全独立工作,以便您可以在并行语言功能内与它们一起工作par循环和SPMD.块。

以下代码中的分区数由numpartitions.基于数据存储本身(DS.)和平行池(GCP.) 尺寸。这并不一定等于游泳池中的工人数量。在这种情况下,然后将循环迭代的数量设置为分区的数量(N.)。

以下代码在本地群集上启动并行池,然后在工人之间分区数据存储区以迭代循环。同样,调用单独的函数,包括par循环使计数和总和累积。如果要运行该示例,请复制并保存此函数。

功能[总,计数] = ParforsumandCountArivaldelay(DS)n = NumPartitions(DS,GCP);总= 0;count = 0;parII = 1:n%获取数据存储区的分区II。Subds = Partition(DS,N,II);[localtotal,localcount] = sumandcountarrialdelay(subds);总=总+ localtotal;count = count + localcount;结尾结尾

现在MATLAB代码调用此新功能,以便在并行循环迭代中可能发生非NAN值的计数和求和。

p = parpool('当地的',4);重置(DS);Tic [总,计数] = ParforsumandCountArivaldelay(DS)Parfortime = TOC平均值=总计/计数
使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数:4)。总计= 17211680 count = 2417320 parfortime = 6.4133平均值= 7.1201

可以显式设置该值而不是让软件计算分区数量,而是可以适当地分区以适应您的算法。例如,要将数据并行化SPMD.块,您可以指定工人的数量(numlabs.)作为要使用的分区数量。以下功能使用SPMD.块执行并行读取,并明确设置等于工人数量的分区数。要运行此示例,请复制并保存函数。

功能[总,计数] = spmdsumandcountarivaldelay(ds)SPMD.subds = partition(ds,numlabs,labindex);[总,计数] = SumandCountArivalDelay(Subds);结尾总=总和([总{:}]);count = sum([count {:}]);结尾

现在MATLAB代码调用使用使用的函数SPMD.堵塞。

重置(DS);TIC [总,计数] = SPMDSumandCountArivalDelay(DS)SPMDTIME = TOC平均值=总/计数
总= 17211680 COUNT = 2417320 SPMDTIME = 4.6729平均值= 7.1201
删除(p);
使用“本地”配置文件的并行池正在关闭。

通过比较变量中记录的时间来获得一些绩效改进的想法sumtime.Parfortime., 和spmdtime.。您的结果可能会有所不同,因为性能可能受到数据存储大小,并行池大小,硬件配置和其他因素的影响。