稀疏矩阵算法

以稀疏矩阵作为核心数据结构的算法

稀疏矩阵算法是以稀疏矩阵作为核心数据结构的算法。

算法概念
在科学与工程领域中进行数值计算时经常需要处理大型的稀疏矩阵,这些矩阵的特征一是阶数很大,二是含有大量的零元,使得无法使用传统的稠密矩阵存储方案和算法。由于矩阵阶数太大,若存储整个矩阵,将会占用大量的存储空间,甚至会超出计算系统的存储容量,因此需要设计专门的稀疏存储方案,尽可能的减少零元素的存储。
稀疏矩阵算法是以稀疏矩阵作为核心数据结构的算法。与稠密矩阵算法相比,稀疏矩阵算法的最大特点是通过只存储和处理非零元素从而大幅度降低存储空间需求以及计算复杂度,代价则是必须使用专门的稀疏矩阵压缩存储数据结构,因而在计算过程中引入了大量的离散间接寻址操作。稀疏矩阵算法是典型的不规则算法,计算访存比很低,并且计算过程中的访存轨迹与稀疏矩阵的稀疏结构相关,很难发掘计算过程中的时空局部性,因此在传统的基于Cache的处理器上稀疏矩阵算法的计算效率很低。为了提高稀疏矩阵算法的计算效率,需要从稀疏存储数据结构和稀疏矩阵算法两方面对现有算法进行改进。
按照应用领域的不同,稀疏矩阵算法分为两类,一类是非数值计算算法,典型代表是图搜索算法,包括宽度优先搜索等核心算法;另一类则是数值计算算法,典型代表是稀疏线性方程组求解,包括稀疏矩阵向量乘、稀疏三角方程组求解以及稀疏矩阵分解等核心算法。
算法
图遍历算法
图遍历算法是最基本的图算法之一,由指定节点开始,按照一定规则遍历图结构中所有的连通节点,包括宽度优先搜索(Breadth First Search,BFS)和深度优先搜索(Depth First Search, DFS)等核心算法。
作为最基本的图遍历算法,宽度优先搜索算法代表了图遍历算法的计算特性,具有非常重要的研究意义。一方面,BFS算法是最短路径、邻接查询、可达性查询等算法的实现基础,广泛应用于图分割、信念传播统计以及网络社区结构发现等领域;另一方面,BFS算法作为典型的数据密集型算法,体现了数据密集型应用对高性能计算系统的需求,广泛应用于大规模并行计算系统的数据处理能力评测,已经成为Parboil, Rodinia和Graph500等基准测试程序的核心算法。
在实际应用中,图的规模在不断增大,相应的,对图的存储和处理开销不断增加,有效地实现大规模并行BFS算法具有十分重要的意义。
稀疏线性方程组求解法
稀疏线性方程组的求解是对自然科学和社会科学中许多实际问题进行数值模拟时的关键技术之一。在高层建筑、桥梁、水坝、防洪堤的结构设计中,需对变形与应力情况进行模拟;在油气资源探测与分析、数值天气预报、飞行器的动力学分析中,需利用流体力学方程组进行模拟;在进行恒星大气分析与核爆实验时,常需利用辐射流体力学与粒子统计平衡等规律进行模拟。在对这些问题进行分析模拟时,通常利用偏微分方程建立数学模型。在对偏微分方程的离散求解过程中,稀疏线性方程组求解算法扮演着十分重要的角色。在许多不以偏微分方程建模的问题中,稀疏线性方程组求解同样发挥了重要的作用。在空中交通控制、电力线路中的最优电流问题中,需利用数学规划求解;在对采纳某项政策时在某给定条件下对国内、国际多个区域的相应经济指标进行预测时,需利用CGE模型进行分析;在可靠性分析、排队网络分析与计算机系统性能评估中,常利用具有大量状态的离散Markov链进行模拟。在这些问题的求解中,稀疏线性方程组的求解都占有重要位置,并且往往是整个计算过程中的性能瓶颈,稀疏线性方程组的高效求解是计算数学和工程应用中十分重要的课题之一。
解稀疏线性方程组的方法包括直接法(direct method)与迭代(iterative method)两类。直接法指在不考虑计算舍入误差的情况下,通过包括矩阵分解和三角方程组求解等有限步的操作求得方程组的精确解,因此又称精确法;迭代法指给定一个初始解向量,通过一定的计算构造一个向量列(一般通过逐次迭代得到一系列逼近精确值的近似解),向量列的极限为方程组理论上的精确解。迭代法对存储空间的需求低,在求解高阶非病态稀疏线性方程组方面具有一定优势。然而,迭代法不适合求解病态问题,性能因问题而异,并且面临精度控制、收敛速度慢或不收敛等问题。与迭代法相比,直接法的通用性好,求解结果精度高,性能稳定。当矩阵分解结果能够被多次后续计算重用以及多右端项时,直接法的优势尤其明显。在有限元分析、模拟电路瞬态仿真等应用领域的商用软件均采用直接法求解器作为标准的稀疏线性方程组求解器。但直接法的缺点在于对存储资源要求较高,无法处理高阶稀疏矩阵。
一般来说,迭代法的求解速度高于直接法。但是,如果使用直接法时矩阵分解过程能够被很多后续计算重复使用,则后续的三角阵求解可以非常快速实现,此时直接法在性能上具有优势。典型例子是模拟电路瞬态仿真,这时需要多次以Newton-Raphson方法求解非线性方程,每一次求解均会在工作点附近展开为线性方程,而且所有线性方程的矩阵分解方式都是固定的,因此求解该类问题最好的方法是直接法。稀疏矩阵的矩阵分解在GPU上的实现是很困难的,主要难点在于现有算法的数据依赖性导致可利用的并行性不足。此外,矩阵元素的排列顺序对计算过程中间结果矩阵的非零元素个数有很大影响,同时矩阵分解后的非零元素的分布与原来矩阵可能很不相同。
迭代法的理论基础相对复杂,并且具有多种不同的具体算法,但其基本形式均为从一个猜测解出发,通过多次迭代逐渐收敛,当误差满足一定条件时迭代中止。共扼梯度法(CG)是迭代法的主流方法之一,特别适合于特征值为良态分布的对称正定方程组;其它迭代法包括Jacobi、逐次超松弛(SOR)、广义极小剩余(GMRES)、预条件共扼梯度(PCG)等。迭代法的核心算法是稀疏矩阵向量乘(SpMV),因此实现SpMV的高效并行结构也是实现迭代法的基础。
直接法由高斯消元法发展向来,求解过程包括矩阵排序(matrix ordering)符号分解(symbolic factorization)、数值分解(numerical factorization)、三角方程组求解((triangular solves)四个步骤。其中,矩阵排序和符号分解属于预处理部分。矩阵排序通过启发算法置换稀疏矩阵的行列,试图在后续计算中维持矩阵的稀疏性或数值稳定性。符号分解则是预先对矩阵分解后的稀疏结构进行预测,预先分配存储空间并记录数据相关性。直接法的计算瓶颈在于数值分解部分和三角方程组求解部分,高效的直接法求解依赖于二者的高效实现。
对于一个稀疏线性方程组是选择直接法还是迭代法求解,一般有如下原则:对于低阶矩阵或大型带状矩阵所对应的线性方程组,用直接法求解;而对于大型(非带形)矩阵所对应的线性方程组,用迭代方法求解。实际上,选用何种方法还要看具体的应用背景,比如,对于线性规划和一些结构工程应用,只有直接法是切实可行的。对于精度要求很高的问题,还可以采用由直接法得到初始解再用迭代法进行迭代的方法求解,这种方法称为迭代精化法。
挑战
面向算法加速器的稀疏矩阵算法并行化方法
由于算法加速器采用了与通用处理器完全不同的体系结构和编程模型,因此需要专门设计针对算法加速器的并行程序。与通用处理器相比,算法加速器能够运行更多的线程,因此一方面需要将计算任务划分为更多的子任务,实现细粒度并行;另一方面需要考虑线程间的负载均衡和数据局部性,特别是线程间的通信和同步开销。与通用处理器相比,算法加速器更容易受到不规则访存和计算的影响,因此必须通过矩阵预处理等手段提高计算的规则性和数据的局部性。
通用处理器与算法加速器协同计算策略
异构体系结构的计算单元包括通用处理器和算法加速器两部分。在学术研究中通常分别针对这两种计算单元设计并行算法,但在实际应用中,需要同时利用计算系统的所有计算资源以获取最高性能。然而,现有的针对通用处理器和算法加速器的并行算法分别采用了不同的编程模型和优化策略,无法直接互相迁移,并且在协同计算过程中,不但需要在两个平台上都能高效运行的并行程序,而且需要实现通信与计算的重叠以隐藏数据传输的开销,这些都要求对现有的算法针对异构平台进行重新设计。
面向稀疏结构特征的数据结构和算法映射
不同应用领域的稀疏矩阵往往具有不同的稀疏结构特征,这些特征因问题而异;具有不同稀疏结构特征的稀疏矩阵往往对应不同的最优存储方案以及不同的并行算法实现。在计算过程中,对于稀疏矩阵算法的不同计算阶段,会因稀疏结构导致的计算特征的不同而适合在通用处理器或算法加速器上运行或是由二者协同计算。因此,研究矩阵的稀疏结构并设计相应的数据结构和算法映射策略,能够有效提高算法对于不同矩阵和不同计算平台的适应性。
全国各地天气预报查询

上海市

  • 市辖区
  • 云南省

  • 临沧市
  • 云南省

  • 丽江市
  • 云南省

  • 保山市
  • 云南省

  • 大理白族自治州
  • 云南省

  • 德宏傣族景颇族自治州
  • 云南省

  • 怒江傈僳族自治州
  • 云南省

  • 文山壮族苗族自治州
  • 云南省

  • 昆明市
  • 云南省

  • 昭通市
  • 云南省

  • 普洱市
  • 云南省

  • 曲靖市
  • 云南省

  • 楚雄彝族自治州
  • 云南省

  • 玉溪市
  • 云南省

  • 红河哈尼族彝族自治州
  • 云南省

  • 西双版纳傣族自治州
  • 云南省

  • 迪庆藏族自治州
  • 内蒙古自治区

  • 乌兰察布市
  • 内蒙古自治区

  • 乌海市
  • 内蒙古自治区

  • 兴安盟
  • 内蒙古自治区

  • 包头市
  • 内蒙古自治区

  • 呼伦贝尔市
  • 内蒙古自治区

  • 呼和浩特市
  • 内蒙古自治区

  • 巴彦淖尔市
  • 内蒙古自治区

  • 赤峰市
  • 内蒙古自治区

  • 通辽市
  • 内蒙古自治区

  • 鄂尔多斯市
  • 内蒙古自治区

  • 锡林郭勒盟
  • 内蒙古自治区

  • 阿拉善盟
  • 北京市

  • 市辖区
  • 吉林省

  • 吉林市
  • 吉林省

  • 四平市
  • 吉林省

  • 延边朝鲜族自治州
  • 吉林省

  • 松原市
  • 吉林省

  • 白城市
  • 吉林省

  • 白山市
  • 吉林省

  • 辽源市
  • 吉林省

  • 通化市
  • 吉林省

  • 长春市
  • 四川省

  • 乐山市
  • 四川省

  • 内江市
  • 四川省

  • 凉山彝族自治州
  • 四川省

  • 南充市
  • 四川省

  • 宜宾市
  • 四川省

  • 巴中市
  • 四川省

  • 广元市
  • 四川省

  • 广安市
  • 四川省

  • 德阳市
  • 四川省

  • 成都市
  • 四川省

  • 攀枝花市
  • 四川省

  • 泸州市
  • 四川省

  • 甘孜藏族自治州
  • 四川省

  • 眉山市
  • 四川省

  • 绵阳市
  • 四川省

  • 自贡市
  • 四川省

  • 资阳市
  • 四川省

  • 达州市
  • 四川省

  • 遂宁市
  • 四川省

  • 阿坝藏族羌族自治州
  • 四川省

  • 雅安市
  • 天津市

  • 市辖区
  • 宁夏回族自治区

  • 中卫市
  • 宁夏回族自治区

  • 吴忠市
  • 宁夏回族自治区

  • 固原市
  • 宁夏回族自治区

  • 石嘴山市
  • 宁夏回族自治区

  • 银川市
  • 安徽省

  • 亳州市
  • 安徽省

  • 六安市
  • 安徽省

  • 合肥市
  • 安徽省

  • 安庆市
  • 安徽省

  • 宣城市
  • 安徽省

  • 宿州市
  • 安徽省

  • 池州市
  • 安徽省

  • 淮北市
  • 安徽省

  • 淮南市
  • 安徽省

  • 滁州市
  • 安徽省

  • 芜湖市
  • 安徽省

  • 蚌埠市
  • 安徽省

  • 铜陵市
  • 安徽省

  • 阜阳市
  • 安徽省

  • 马鞍山市
  • 安徽省

  • 黄山市
  • 山东省

  • 东营市
  • 山东省

  • 临沂市
  • 山东省

  • 威海市
  • 山东省

  • 德州市
  • 山东省

  • 日照市
  • 山东省

  • 枣庄市
  • 山东省

  • 泰安市
  • 山东省

  • 济南市
  • 山东省

  • 济宁市
  • 山东省

  • 淄博市
  • 山东省

  • 滨州市
  • 山东省

  • 潍坊市
  • 山东省

  • 烟台市
  • 山东省

  • 聊城市
  • 山东省

  • 菏泽市
  • 山东省

  • 青岛市
  • 山西省

  • 临汾市
  • 山西省

  • 吕梁市
  • 山西省

  • 大同市
  • 山西省

  • 太原市
  • 山西省

  • 忻州市
  • 山西省

  • 晋中市
  • 山西省

  • 晋城市
  • 山西省

  • 朔州市
  • 山西省

  • 运城市
  • 山西省

  • 长治市
  • 山西省

  • 阳泉市
  • 广东省

  • 东莞市
  • 广东省

  • 中山市
  • 广东省

  • 云浮市
  • 广东省

  • 佛山市
  • 广东省

  • 广州市
  • 广东省

  • 惠州市
  • 广东省

  • 揭阳市
  • 广东省

  • 梅州市
  • 广东省

  • 汕头市
  • 广东省

  • 汕尾市
  • 广东省

  • 江门市
  • 广东省

  • 河源市
  • 广东省

  • 深圳市
  • 广东省

  • 清远市
  • 广东省

  • 湛江市
  • 广东省

  • 潮州市
  • 广东省

  • 珠海市
  • 广东省

  • 肇庆市
  • 广东省

  • 茂名市
  • 广东省

  • 阳江市
  • 广东省

  • 韶关市
  • 广西壮族自治区

  • 北海市
  • 广西壮族自治区

  • 南宁市
  • 广西壮族自治区

  • 崇左市
  • 广西壮族自治区

  • 来宾市
  • 广西壮族自治区

  • 柳州市
  • 广西壮族自治区

  • 桂林市
  • 广西壮族自治区

  • 梧州市
  • 广西壮族自治区

  • 河池市
  • 广西壮族自治区

  • 玉林市
  • 广西壮族自治区

  • 百色市
  • 广西壮族自治区

  • 贵港市
  • 广西壮族自治区

  • 贺州市
  • 广西壮族自治区

  • 钦州市
  • 广西壮族自治区

  • 防城港市
  • 新疆维吾尔自治区

  • 乌鲁木齐市
  • 新疆维吾尔自治区

  • 伊犁哈萨克自治州
  • 新疆维吾尔自治区

  • 克孜勒苏柯尔克孜自治州
  • 新疆维吾尔自治区

  • 克拉玛依市
  • 新疆维吾尔自治区

  • 博尔塔拉蒙古自治州
  • 新疆维吾尔自治区

  • 吐鲁番市
  • 新疆维吾尔自治区

  • 和田地区
  • 新疆维吾尔自治区

  • 哈密市
  • 新疆维吾尔自治区

  • 喀什地区
  • 新疆维吾尔自治区

  • 塔城地区
  • 新疆维吾尔自治区

  • 巴音郭楞蒙古自治州
  • 新疆维吾尔自治区

  • 昌吉回族自治州
  • 新疆维吾尔自治区

  • 自治区直辖县级行政区划
  • 新疆维吾尔自治区

  • 阿克苏地区
  • 新疆维吾尔自治区

  • 阿勒泰地区
  • 江苏省

  • 南京市
  • 江苏省

  • 南通市
  • 江苏省

  • 宿迁市
  • 江苏省

  • 常州市
  • 江苏省

  • 徐州市
  • 江苏省

  • 扬州市
  • 江苏省

  • 无锡市
  • 江苏省

  • 泰州市
  • 江苏省

  • 淮安市
  • 江苏省

  • 盐城市
  • 江苏省

  • 苏州市
  • 江苏省

  • 连云港市
  • 江苏省

  • 镇江市
  • 江西省

  • 上饶市
  • 江西省

  • 九江市
  • 江西省

  • 南昌市
  • 江西省

  • 吉安市
  • 江西省

  • 宜春市
  • 江西省

  • 抚州市
  • 江西省

  • 新余市
  • 江西省

  • 景德镇市
  • 江西省

  • 萍乡市
  • 江西省

  • 赣州市
  • 江西省

  • 鹰潭市
  • 河北省

  • 保定市
  • 河北省

  • 唐山市
  • 河北省

  • 廊坊市
  • 河北省

  • 张家口市
  • 河北省

  • 承德市
  • 河北省

  • 沧州市
  • 河北省

  • 石家庄市
  • 河北省

  • 秦皇岛市
  • 河北省

  • 衡水市
  • 河北省

  • 邢台市
  • 河北省

  • 邯郸市
  • 河南省

  • 三门峡市
  • 河南省

  • 信阳市
  • 河南省

  • 南阳市
  • 河南省

  • 周口市
  • 河南省

  • 商丘市
  • 河南省

  • 安阳市
  • 河南省

  • 平顶山市
  • 河南省

  • 开封市
  • 河南省

  • 新乡市
  • 河南省

  • 洛阳市
  • 河南省

  • 漯河市
  • 河南省

  • 濮阳市
  • 河南省

  • 焦作市
  • 河南省

  • 省直辖县级行政区划
  • 河南省

  • 许昌市
  • 河南省

  • 郑州市
  • 河南省

  • 驻马店市
  • 河南省

  • 鹤壁市
  • 浙江省

  • 丽水市
  • 浙江省

  • 台州市
  • 浙江省

  • 嘉兴市
  • 浙江省

  • 宁波市
  • 浙江省

  • 杭州市
  • 浙江省

  • 温州市
  • 浙江省

  • 湖州市
  • 浙江省

  • 绍兴市
  • 浙江省

  • 舟山市
  • 浙江省

  • 衢州市
  • 浙江省

  • 金华市
  • 海南省

  • 三亚市
  • 海南省

  • 三沙市
  • 海南省

  • 儋州市
  • 海南省

  • 海口市
  • 海南省

  • 省直辖县级行政区划
  • 湖北省

  • 十堰市
  • 湖北省

  • 咸宁市
  • 湖北省

  • 孝感市
  • 湖北省

  • 宜昌市
  • 湖北省

  • 恩施土家族苗族自治州
  • 湖北省

  • 武汉市
  • 湖北省

  • 省直辖县级行政区划
  • 湖北省

  • 荆州市
  • 湖北省

  • 荆门市
  • 湖北省

  • 襄阳市
  • 湖北省

  • 鄂州市
  • 湖北省

  • 随州市
  • 湖北省

  • 黄冈市
  • 湖北省

  • 黄石市
  • 湖南省

  • 娄底市
  • 湖南省

  • 岳阳市
  • 湖南省

  • 常德市
  • 湖南省

  • 张家界市
  • 湖南省

  • 怀化市
  • 湖南省

  • 株洲市
  • 湖南省

  • 永州市
  • 湖南省

  • 湘潭市
  • 湖南省

  • 湘西土家族苗族自治州
  • 湖南省

  • 益阳市
  • 湖南省

  • 衡阳市
  • 湖南省

  • 邵阳市
  • 湖南省

  • 郴州市
  • 湖南省

  • 长沙市
  • 甘肃省

  • 临夏回族自治州
  • 甘肃省

  • 兰州市
  • 甘肃省

  • 嘉峪关市
  • 甘肃省

  • 天水市
  • 甘肃省

  • 定西市
  • 甘肃省

  • 平凉市
  • 甘肃省

  • 庆阳市
  • 甘肃省

  • 张掖市
  • 甘肃省

  • 武威市
  • 甘肃省

  • 甘南藏族自治州
  • 甘肃省

  • 白银市
  • 甘肃省

  • 酒泉市
  • 甘肃省

  • 金昌市
  • 甘肃省

  • 陇南市
  • 福建省

  • 三明市
  • 福建省

  • 南平市
  • 福建省

  • 厦门市
  • 福建省

  • 宁德市
  • 福建省

  • 泉州市
  • 福建省

  • 漳州市
  • 福建省

  • 福州市
  • 福建省

  • 莆田市
  • 福建省

  • 龙岩市
  • 西藏自治区

  • 山南市
  • 西藏自治区

  • 拉萨市
  • 西藏自治区

  • 日喀则市
  • 西藏自治区

  • 昌都市
  • 西藏自治区

  • 林芝市
  • 西藏自治区

  • 那曲市
  • 西藏自治区

  • 阿里地区
  • 贵州省

  • 六盘水市
  • 贵州省

  • 安顺市
  • 贵州省

  • 毕节市
  • 贵州省

  • 贵阳市
  • 贵州省

  • 遵义市
  • 贵州省

  • 铜仁市
  • 贵州省

  • 黔东南苗族侗族自治州
  • 贵州省

  • 黔南布依族苗族自治州
  • 贵州省

  • 黔西南布依族苗族自治州
  • 辽宁省

  • 丹东市
  • 辽宁省

  • 大连市
  • 辽宁省

  • 抚顺市
  • 辽宁省

  • 朝阳市
  • 辽宁省

  • 本溪市
  • 辽宁省

  • 沈阳市
  • 辽宁省

  • 盘锦市
  • 辽宁省

  • 营口市
  • 辽宁省

  • 葫芦岛市
  • 辽宁省

  • 辽阳市
  • 辽宁省

  • 铁岭市
  • 辽宁省

  • 锦州市
  • 辽宁省

  • 阜新市
  • 辽宁省

  • 鞍山市
  • 重庆市

  • 重庆市

  • 市辖区
  • 陕西省

  • 咸阳市
  • 陕西省

  • 商洛市
  • 陕西省

  • 安康市
  • 陕西省

  • 宝鸡市
  • 陕西省

  • 延安市
  • 陕西省

  • 榆林市
  • 陕西省

  • 汉中市
  • 陕西省

  • 渭南市
  • 陕西省

  • 西安市
  • 陕西省

  • 铜川市
  • 青海省

  • 果洛藏族自治州
  • 青海省

  • 海东市
  • 青海省

  • 海北藏族自治州
  • 青海省

  • 海南藏族自治州
  • 青海省

  • 海西蒙古族藏族自治州
  • 青海省

  • 玉树藏族自治州
  • 青海省

  • 西宁市
  • 青海省

  • 黄南藏族自治州
  • 黑龙江省

  • 七台河市
  • 黑龙江省

  • 伊春市
  • 黑龙江省

  • 佳木斯市
  • 黑龙江省

  • 双鸭山市
  • 黑龙江省

  • 哈尔滨市
  • 黑龙江省

  • 大兴安岭地区
  • 黑龙江省

  • 大庆市
  • 黑龙江省

  • 牡丹江市
  • 黑龙江省

  • 绥化市
  • 黑龙江省

  • 鸡西市
  • 黑龙江省

  • 鹤岗市
  • 黑龙江省

  • 黑河市
  • 黑龙江省

  • 齐齐哈尔市