SuperMap iObjects Java 11i 开发指南
并行计算  

多线程并行计算

并行计算(Parallel Computing)是将一个任务分解成若干个小任务并协同执行以完成求解的过程,是增强复杂问题解决能力和提升性能的有效途径。多核计算机的出现,改变了并行计算只服务于巨型机和计算机集群的局面。如今,多核微处理器的发展更是使得非常普及的个人 PC 也具备了并行计算能力。

并行计算可以通过多种途径实现,包括多进程、多线程以及其他多种方式。针对多核计算机,本文主要讨论多线程并行计算(或称多核并行计算)。并行计算技术可将一项任务分解为多个线程,这些线程可由多颗 CPU 内核并行运行,从而能够充分和更加高效地利用多核计算资源,从而降低单个问题的求解时间,节省成本,也能够满足更大规模或更高精度要求的问题求解需求。

下图对比了串行与并行。当一个任务被划分为 A、B、C 三个子任务时,串行需要依次执行三个子任务,而多线程并行则可以通过三个线程同时执行三个子任务。

串行与并行

SuperMap 并行计算

地理空间分析具有算法逻辑复杂、数据规模大等普遍特点,是一种计算密集、数据密集型功能,通过并行计算可以充分利用多核计算资源,从而大大降低分析时间,提高性能。目前,SuperMap 对包括栅格分析水文分析拓扑预处理在内的诸多分析功能提供并行计算能力。在本文的其余部分,将着重介绍如何设置并行计算的线程数目,以及支持并行计算的接口。

下图是在并行计算支持下,一台普通的四核个人计算机上某次执行"提取等值线"分析时 CPU 的使用情况。当使用 1 个线程分析时,CPU 利用率较低,只有一个 CPU 参与运算,当设置并行线程数为 4 时,所有四颗 CPU 核心都参与运算,CPU 利用率最高可达 100%。

多线程并行计算CPU利用率

提示 提 示:

  1. 不同的分析功能,性能提升情况不尽相同。不同平台和硬件配置在性能提升程度上也存在差异。
  2. 支持 Windows、Linux 32 位和 64 位平台。
  3. 由于数据库引擎数据读写时间相对较长,因此整体性能提升效果没有文件型引擎显著。

如何设置线程数目

目前提供两种方式修改并行计算所使用的线程数目。一是调用相关接口,二是修改配置文件。

1. 通过相应接口修改

在 Data 模块的 Environment 类中,提供 get/setOMPNumThreads 的方法,用于返回或者设置并行计算所使用的线程数目。例如,设置线程数目为 4:

com.supermap.data.Environment.setOMPNumThreads(4);

2. 通过配置文件修改

系统配置文件 SuperMap.xml 中的 <OMPNumThreads></OMPNumThreads> 节点用于指定线程数目,初始值为 2。SuperMap.xml 位于组件产品安装目录\Bin 文件夹下。例如,设置线程数目为 4:

<OMPNumThreads>4</OMPNumThreads>

以上两种方式具有一些区别和需要注意的地方:

  1. 应用程序启动时会优先读取配置文件中的线程数。在程序运行过程当中可通过调用 setOMPNumThreads 方法来修改线程数目,否则使用应用程序启动时从配置文件中读取到的值。
  2. 使用 setOMPNumThreads 方法修改线程数会立即生效,同时自动修改配置文件中的值;而配置文件中的线程数目只在应用程序启动时被读取一次,手动修改配置文件后,需要重新启动应用程序才能生效。
  3. 线程数目的有效范围为 1-16。如果配置文件中的线程数目超出范围,则设置无效,使用默认值 2;如果 setOMPNumThreads 方法设置的值超出范围,则会抛出异常。

对于如何设置合理的线程数目,可以参考以下建议:

  1. 指定的多个线程将在计算机处理器所有核之间分配,当线程数目等于处理器总核数时,所有核都参与计算,可以充分利用计算机的计算资源。
  2. 线程数目多于计算机核数时,线程调度与负载均衡问题可能导致占用更多时间,即使分析计算的时间进一步降低,也可能导致整体性能提升不明显。因此不建议这样做。

支持并行计算的接口

目前,SuperMap 并行计算支持栅格分析水文分析拓扑预处理网络分析叠加分析空间查询等分析功能,具体的支持情况将分模块进行说明。注意,已过时的接口不受并行计算支持,因此以下表格提到的方法均不包含已过时的同名方法。

1. 栅格分析

com.supermap.analyst.spatialanalyst 包中栅格分析功能对并行计算支持情况如下表所示:

功能块 功能细分 对应接口 所在类
插值 IDW插值 所有 2 个 interpolate 重载方法 Interpolator
RBF插值
简单克吕金插值
普通克吕金插值
泛克吕金插值
密度插值
表面特征提取 提取等值线 所有 16 个 extractIsoline 重载方法 SurfaceAnalyst
提取等值面 所有 14 个 extractIsoregion 重载方法
地形计算
坡度分析 calculateSlope 方法 CalculationTerrain
坡向分析 calculateAspect 方法
生成三维晕渲图 calculateHillShade 方法
生成正射三维影像 所有 2 个 calculateOrthoImage 方法
计算表面面积 computeSurfaceArea 方法
计算表面体积 computeSurfaceVolume 方法
查找极值 findExtremum 方法
填挖方分析 栅格填挖方 cutFill 方法
斜面填挖方 cutFill 方法
反算填挖方 cutFill 方法
栅格概括
栅格重分级 reclass 方法 GeneralizeAnalyst
栅格重采样 resample 方法
栅格聚合 aggregate 方法
可视性分析
可视域分析 单点可视域分析 calculateViewShed 方法 VisibilityAnalyst
多点可视域分析 calculateViewShed 方法

2. 水文分析

水文分析功能位于 com.supermap.analyst.terrainanalyst 包内,目前所有 10 个分析功能均支持并行计算。支持情况如下表所示:

功能块 功能细分 对应接口 所在类
水文分析 填充洼地 所有 2 个 fillSink 方法 HydrologyAnalyst
流向分析 所有 2 个 flowDirection 方法
计算累积汇水量 flowAccumulation 方法
计算流长 flowLength 方法
计算流域盆地 basin 方法
生成汇水点栅格 pourPoints 方法
流域分割 所有 2 个 watershed 方法
河流分级 streamOrder 方法
连接水系 streamLink 方法
提取矢量水系 streamToLine 方法

3. 拓扑

com.supermap.data.topology 包内的拓扑模块,目前提供拓扑预处理的并行计算支持。

功能块 功能细分 对应接口 所在类
拓扑预处理 拓扑预处理 所有 4 个 preprocess 方法 TopologyValidator

注意 注 意:

  1. 拓扑预处理中的“调整多边形走向”处理不支持并行计算。如果只进行该项预处理,修改线程数不会降低分析时间。

4.网络分析

网络分析位于com.supermap.analyst.networkanalyst包内,目前,最佳路径分析、最近设施查找、旅行商和物流配送这四个交通网络分析功能支持并行计算。

功能块 功能细分 对应接口 所在类
交通网络分析 最佳路径分析 FindPath 方法 TransportationAnalyst
最近设施查找 所有 2 个 FindClosestFacility 方法
旅行商分析 FindTSPPath 方法
物流配送 所有 2 个 FindMTSPPath 方法

5.叠加分析

叠加分析位于com.supermap.analyst.spatialanalyst包内,目前,所有接口只对线面叠加都支持并行计算。

功能块 功能细分 对应接口 所在类
叠加分析 裁剪 所有 3 个clip 方法(只支持线面对象) OverlayAnalyst
擦除 所有 3 个 erase 方法(只支持线面对象)
合并 所有 3 个union 方法(只支持线面对象)
相交 所有 3 个 intersect 方法(只支持线面对象)
同一 所有 3 个 identity 方法(只支持线面对象)
对称差 所有 3 个 xOR 方法(只支持线面对象)
更新 所有 3 个 update 方法(只支持线面对象)

6.空间查询

空间查询位于com.supermap.data包内。

功能块 功能细分 对应接口 所在类
空间查询 包含 query 方法(只支持面对象作为查询对象) DatasetVector
求交 query 方法(只支持面对象作为查询对象)

 

  版权所有© 北京超图软件股份有限公司。保留所有权利。