并行计算 |
并行计算(Parallel Computing)是将一个任务分解成若干个小任务并协同执行以完成求解的过程,是增强复杂问题解决能力和提升性能的有效途径。多核计算机的出现,改变了并行计算只服务于巨型机和计算机集群的局面。如今,多核微处理器的发展更是使得非常普及的个人 PC 也具备了并行计算能力。
并行计算可以通过多种途径实现,包括多进程、多线程以及其他多种方式。针对多核计算机,本文主要讨论多线程并行计算(或称多核并行计算)。并行计算技术可将一项任务分解为多个线程,这些线程可由多颗 CPU 内核并行运行,从而能够充分和更加高效地利用多核计算资源,从而降低单个问题的求解时间,节省成本,也能够满足更大规模或更高精度要求的问题求解需求。
下图对比了串行与并行。当一个任务被划分为 A、B、C 三个子任务时,串行需要依次执行三个子任务,而多线程并行则可以通过三个线程同时执行三个子任务。
地理空间分析具有算法逻辑复杂、数据规模大等普遍特点,是一种计算密集、数据密集型功能,通过并行计算可以充分利用多核计算资源,从而大大降低分析时间,提高性能。目前,SuperMap 对包括栅格分析、水文分析、拓扑预处理在内的诸多分析功能提供并行计算能力。在本文的其余部分,将着重介绍如何设置并行计算的线程数目,以及支持并行计算的接口。
下图是在并行计算支持下,一台普通的四核个人计算机上某次执行"提取等值线"分析时 CPU 的使用情况。当使用 1 个线程分析时,CPU 利用率较低,只有一个 CPU 参与运算,当设置并行线程数为 4 时,所有四颗 CPU 核心都参与运算,CPU 利用率最高可达 100%。
提 示:
目前提供两种方式修改并行计算所使用的线程数目。一是调用相关接口,二是修改配置文件。
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>
以上两种方式具有一些区别和需要注意的地方:
对于如何设置合理的线程数目,可以参考以下建议:
目前,SuperMap 并行计算支持栅格分析、水文分析、拓扑预处理、网络分析、叠加分析、空间查询等分析功能,具体的支持情况将分模块进行说明。注意,已过时的接口不受并行计算支持,因此以下表格提到的方法均不包含已过时的同名方法。
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 方法 |
水文分析功能位于 com.supermap.analyst.terrainanalyst 包内,目前所有 10 个分析功能均支持并行计算。支持情况如下表所示:
功能块 | 功能细分 | 对应接口 | 所在类 |
---|---|---|---|
水文分析 | 填充洼地 | 所有 2 个 fillSink 方法 | HydrologyAnalyst 类 |
流向分析 | 所有 2 个 flowDirection 方法 | ||
计算累积汇水量 | flowAccumulation 方法 | ||
计算流长 | flowLength 方法 | ||
计算流域盆地 | basin 方法 | ||
生成汇水点栅格 | pourPoints 方法 | ||
流域分割 | 所有 2 个 watershed 方法 | ||
河流分级 | streamOrder 方法 | ||
连接水系 | streamLink 方法 | ||
提取矢量水系 | streamToLine 方法 |
com.supermap.data.topology 包内的拓扑模块,目前提供拓扑预处理的并行计算支持。
功能块 | 功能细分 | 对应接口 | 所在类 |
---|---|---|---|
拓扑预处理 | 拓扑预处理 | 所有 4 个 preprocess 方法 | TopologyValidator 类 |
注 意:
网络分析位于com.supermap.analyst.networkanalyst包内,目前,最佳路径分析、最近设施查找、旅行商和物流配送这四个交通网络分析功能支持并行计算。
功能块 | 功能细分 | 对应接口 | 所在类 |
---|---|---|---|
交通网络分析 | 最佳路径分析 | FindPath 方法 | TransportationAnalyst 类 |
最近设施查找 | 所有 2 个 FindClosestFacility 方法 | ||
旅行商分析 | FindTSPPath 方法 | ||
物流配送 | 所有 2 个 FindMTSPPath 方法 |
叠加分析位于com.supermap.analyst.spatialanalyst包内,目前,所有接口只对线面叠加都支持并行计算。
功能块 | 功能细分 | 对应接口 | 所在类 |
---|---|---|---|
叠加分析 | 裁剪 | 所有 3 个clip 方法(只支持线面对象) | OverlayAnalyst 类 |
擦除 | 所有 3 个 erase 方法(只支持线面对象) | ||
合并 | 所有 3 个union 方法(只支持线面对象) | ||
相交 | 所有 3 个 intersect 方法(只支持线面对象) | ||
同一 | 所有 3 个 identity 方法(只支持线面对象) | ||
对称差 | 所有 3 个 xOR 方法(只支持线面对象) | ||
更新 | 所有 3 个 update 方法(只支持线面对象) |
空间查询位于com.supermap.data包内。
功能块 | 功能细分 | 对应接口 | 所在类 |
---|---|---|---|
空间查询 | 包含 | query 方法(只支持面对象作为查询对象) | DatasetVector 类 |
求交 | query 方法(只支持面对象作为查询对象) |