书签 分享 收藏 举报 版权申诉 / 10

基于线程构造块的超大规模矩阵多核并行克劳特分解方法.pdf

  • 上传人:n****g
  • 文档编号:4215393
  • 上传时间:2018-09-07
  • 格式:PDF
  • 页数:10
  • 大小:448.12KB
  • 摘要
    申请专利号:

    CN201010571856.6

    申请日:

    2010.12.03

    公开号:

    CN102486727A

    公开日:

    2012.06.06

    当前法律状态:

    授权

    有效性:

    有权

    法律详情:

    授权|||实质审查的生效IPC(主分类):G06F 9/44申请日:20101203|||公开

    IPC分类号:

    G06F9/44; G06F17/16

    主分类号:

    G06F9/44

    申请人:

    同济大学

    发明人:

    马健; 张丽岩; 李克平; 孙剑

    地址:

    200092 上海市杨浦区四平路1239号

    优先权:

    专利代理机构:

    上海科盛知识产权代理有限公司 31225

    代理人:

    赵继明

    PDF完整版下载: PDF下载
    内容摘要

    本发明涉及基于线程构造块的超大规模矩阵多核并行克劳特分解方法,该分解方法包括以下步骤:1)将传统Crout方法中可以并行计算的部分改写为符合TBB需要的规范类;2)设置问题初始值;3)进入Crout方法的行循环;4)调用parallel_reduce并行模块类,将每一行的最大主元保存在临时向量中,同时计算并保存比例因子;5)进入Crout方法的列循环;6)确定新的主元及比例因子,修改TINY,每一行除以主元;8)完成超大规模矩阵分解,得到因部分主元法而改变了的行列排列次序。与现有技术相比,本发明具有能够大幅度提高矩阵LU分解的运行效率、且能跨平台、可扩展、应用广泛等优点。

    权利要求书

    1: 基于线程构造块的超大规模矩阵多核并行克劳特分解方法, 其特征在于, 该分解方 法包括以下步骤 : 1) 线程构造块 (TBB) 并行计算平台的安装与环境设置 ; 2) 分析并抽取传统克劳特 (Crout) 方法中可以并行计算的部分, 利用 TBB 并行模板类 改写为符合 TBB 需要的规范类 ; 3) 设置问题初始值 ; 4) 进入 Crout 方法的行循环 ; 5) 调用 parallel_reduce 并行模块类, 将每一行的最大主元保存在临时向量中, 同时 计算并保存比例因子 ; 6) 进入 Crout 方法的列循环 ; 7) 确定新的主元及比例因子, 修改 TINY, 每一行除以主元, 判断列循环是否结束, 如果 判断为否则转到步骤 6), 判断行循环是否结束, 如果判断为否则转到步骤 4) ; 8) 运行结束, 完成超大规模矩阵分解, 得到因部分主元法而改变了的行列排列次序。
    2: 根据权利要求 1 所述的基于线程构造块的超大规模矩阵多核并行克劳特分解方法, 其特征在于, 所述的步骤 3) 中的问题初始值包括矩阵的规模、 矩阵的行数、 列数, 输入矩 阵。

    说明书


    基于线程构造块的超大规模矩阵多核并行克劳特分解方法

        技术领域 本发明涉及一种超大规模矩阵分解方法, 尤其是涉及基于线程构造块的超大规模 矩阵多核并行克劳特 (Crout) 分解方法。
         背景技术 Intel 刚刚推广的线程构建模块 (Threading Building Blocks, TBB) 是基于 C++ 的多线程并行编程模型, 用于支持多核处理器的并行计算, 具有成熟的数据结构, 支持可扩 展的线程嵌套并行, 支持可扩展内存分配、 支持多种系统平台以及多种编译器支持。TBB 的 编程模式是使用模板作为并行迭代模型。 这使得程序员很方便的处理同步、 负载平衡、 缓存 优化等问题, 而能轻松地实现自动调度的并行程序, 充分利用 CPU 的多核运算能力及其他 系统资源。 TBB 提升了程序的伸缩性及可扩展性, 并且完全支持嵌套的并行编程。 程序员可 以创建自己的并行组件, 以构建大型的并行程序。同时由于 TBB 是芯片制造商 Intel 开发 的, 对于多核平台有着更好的支持。
         TBB 是一个开源的 C++ 模板库, 它可将线程抽象成任务, 然后创建可靠、 可移植且 可扩展的并行应用程序。使用 TBB 编写基于任务的并行应用程序, 有助于提高跨多核平台 上运行的可扩展软件的开发效率。 通本地线程和线程封装器等其它线程化方法相比, TBB 是 执行并行应用程序最高效的方式, 它能够充分利用多核平台的并行性能。 TBB 有以下三个显 著的优点 : 1)TBB 对线程进行抽象, 将其提高到任务的高度, 简化了并行应用程序的开发工 作; 2) 基于 TBB 开发的应用程序的性能可以随着处理器内核数量的增加而自动提升 ; 3)TBB 能够减少死锁和资源竞争等常见线程错误, 提供了一个跨平台、 可扩展的并行解决方案。
         目前, 在理论研究和实际应用中, 矩阵求逆都有广泛的应用, 如求解线性方程组、 动态规划、 计算机图形处理、 控制工程等等。目前, 矩阵求逆的方法主要有以下几种 : (1) 伴 随矩阵法 ; (2) 初等变换法 ; (3) 高斯 - 约当消去法 ; (4) 三角分解法。下面分别加以介绍。
         (1) 伴随矩阵法。利用矩阵的伴随矩阵及矩阵的行列式来求得矩阵的逆矩阵。此 方法一般适用于维数较小的矩阵
         (2) 初等变换法。 原矩阵和单位矩阵同时进行初等行 ( 或列 ) 变换, 当原矩阵变成 单位矩阵的时候, 单位矩阵就变成了原矩阵的逆矩阵。
         (3) 高斯 - 约当消去法 : 又称高斯消去法、 高斯消元法, 实际上就是我们俗称的加 减消元法。数学上, 高斯 - 约当消去法, 由高斯和约当得名, 它是线性代数中的一个算法, 用 于求解线性方程组的解, 求解矩阵的秩, 以及求解可逆方矩阵的逆。当用于一个矩阵时, 高 斯消去产生 “行消去梯形形式” 。
         在消元的过程中, 可能出现主元为零的情况, 这时消元法无法进行 ; 即使主元不为 零但很小时, 若用其作除数, 会导致其它元素的数量级严重增长和舍入误差的扩散, 最后也 使得计算解不可靠。为使高斯 - 约当消去法具有较好的数值稳定性, 可以使用完全主元素 消去法, 但完全主元素消去法在选主元时要花费较多机器时间, 为此又考虑使用列主元消 去法, 但由于仍须选主元, 计算量也较大。对于良态问题, 高斯 - 约当消去法也可能给出很
         坏的结果, 这说明高斯 - 约当消去法的算法很不稳定。事实上, 一般的矩阵都是病态矩阵, 采用高斯 - 约当消去法不能得到满意的结果。
         (4) 三角分解法
         三角分解法是将方阵分解成一个上三角矩阵和一个下三角矩阵, 该方法又被称为 LU 分解法。该分解方法的用途主要在简化大矩阵的行列式值的计算, 矩阵求逆运算和求解 联立方程组。 需要注意的是, 这种分解方法所得到的上下三角形矩阵不是唯一的, 还可找到 若干对不同的上下三角矩阵对, 它们的乘积也会得到原矩阵。矩阵可以进行 LU 分解是有条 件的, 它要求其为方阵且它的所有顺序主子式均不等于零。LU 分解的主要优点在于它能用 公式表示费时的消去步骤, 只对系数矩阵进行操作。LU 分解的一个动机是它为矩阵求逆提 供了一个有效的方式, 也为评估方程组的状态提供了一个方法。
         在上述的矩阵求逆方法中, 伴随矩阵法及初等变换法, 易于理解, 适合手动求解, 而对于大规模矩阵的求解, 这两种方法不太适合 ; 高斯 - 约当消去法及 LU 分解法便于程序 的实现, 在大多数条件下, 能够适应大规模矩阵的求解。 但是, 对于大规模或超大规模矩阵, 高斯 - 约当消去法及传统的串行 LU 分解法的计算量往往过大, 对计算机的性能要求较高, 算法的实时性不高, 对于某些时间有严格要求的应用不太适合。 发明内容 本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种能够大幅度提 高矩阵 LU 分解的运行效率、 且能跨平台、 可扩展、 应用广泛的基于线程构造块的超大规模 矩阵多核并行克劳特分解方法。
         本发明的目的可以通过以下技术方案来实现 : 基于线程构造块的超大规模矩阵多 核并行克劳特分解方法, 其特征在于, 该分解方法包括以下步骤 : 1)TBB 并行计算平台的安 装与环境设置 ; 2) 分析并抽取传统 Crout 方法中可以并行计算的部分, 利用 TBB 并行模板 类改写为符合 TBB 需要的规范类 ; 3) 设置问题初始值 ; 4) 进入 Crout 方法的行循环 ; 5) 调 用 parallel_reduce 并行模块类, 将每一行的最大主元保存在临时向量中, 同时计算并保 存比例因子 ; 6) 进入 Crout 方法的列循环 ; 7) 确定新的主元及比例因子, 修改 TINY, 每一行 除以主元, 判断列循环是否结束, 如果判断为否则转到步骤 6), 判断行循环是否结束, 如果 判断为否则转到步骤 4) ; 8) 运行结束, 完成超大规模矩阵分解, 得到因部分主元法而改变 了的行列排列次序。
         所述的步骤 3) 中的问题初始值包括矩阵的规模、 矩阵的行数、 列数, 输入矩阵。
         与现有技术相比, 本发明具有效率高、 跨平台、 可扩展、 应用广泛等优点, 本发明的 并行 Crout 方法能够大幅度提高矩阵 LU 分解的运行效率 ; 在此基础上, 通过本发明能够大 幅度提高矩阵求逆的效率, 进而验证了本发明的有效性与高效性。并行 Crout 方法的适用 条件为 : 如果矩阵的所有子式都是非零的, 即可使用本发明来进行 LU 分解, 进而可以求得 该矩阵的逆或线性方程组的解等。当矩阵规模达到百万级别的时候, 本发明比串行 Crout 方法约提高了 13.7%, 并比高斯 - 约当消去法约提高了 77%。故本发明具有非常大的实用 价值和广泛的应用前景。
         附图说明图 1 为本发明的满足 TBB 的求最大主元类结构图 ; 图 2 为本发明的并行 Crout 方法流程图 ; 图 3 为利用本发明的并行 Crout 方法求矩阵逆阵的流程图 ; 图 4 为利用本发明求解矩阵逆阵的结果示意图。具体实施方式
         下面结合附图和具体实施例对本发明进行详细说明。
         实施例
         TBB 定义了任务的概念, 在初始化 TBB 任务调度时, 由任务调度器对象 task_ scheduler_init 实现多任务的分配和并行计算, 支持多线程的划分。在调用并行计算的模 板类时, 由模板类参数指定循环处理的数值范围以及任务粒度参数。任务粒度参数决定了 任务划分的粒度, 如果粒度太大, 不能充分提高运行效率 ; 如果粒度太小, 过度的并行化任 务分配造成的开销反而降低了运行效率。在无法获得合适任务粒度情况下可以使用 TBB 提 供的自动分配函数 auto_partitioner() 帮助用户设置合适的任务粒度参数。
         以 parallel_reduce 设计的求解最大主元素模板类为例, 详细说明 TBB 设计并行 最大主元素算法的实现过程, 以供 Crout 方法调用。首先, 基于 parallel_reduce 模板将此 过程封装成类 MaxElement, 其作用是求解最大主元素。类 MaxElement 必须包括的接口为 operator 和构造函数, 具体形式如下 : class MaxElement{
         ……
         void operator()(const blocked_range&r){
         void operator()(const blocked_range&r){
         for(size_t i = r.begin() ; i != r.end() ; ++i){
         ……
         }}}
         // 分出一个支线, 如果要访问 x, 应该保证原子操作
         MaxElement(MaxElement&x, tbb::split) :
         my_a(x.my_a), value_of_max(FLT_MIN), index_of_max(-1){…… }
         // 合并支线
         void join(const MaxElement&y){
         ……
         }}
         // 构造函数
         MaxElement(DOUBLE*a) :
         my_a(a), value_of_max(FLT_MIN), index_of_max(-1){}
         };
         其中 operator 接口是并行处理的主要部分, 主要功能是进行并行循环优化, 将循 环的参数修改成 TBB 定义的 blocked_range 模板类, 能够支持循环体内任务的并行划分。 在 operator 接口中, 并行地执行各小块中的比较大小操作, 并返回小块中的最大值。当
         TBB 决定分出一个 blocked_range 时, 会调用 MaxElement(MaxElement&x, tbb::split), 这 个 tbb::split 只是一个点位符, 用于和拷贝构造函数相区别。当 TBB 合并 blocked_range 时, 会调用 voidjoin(MaxElement&y), 本例中合并就意味着把多个结果进行运算, 将最终的 结果保存并返回。 构造函数主要实现参数的初始化以及从整个任务空间中分离并构建子任 务。在完成并行模板类的编写之后, 初始化 TBB 任务调度器, 调用上述编写的并行模板, 返 回计算结果, 最后结束 TBB 任务调度。
         利用 TBB 设计并行 Crout 方法的基本步骤如下 :
         步骤一 : TBB 并行计算平台的安装与环境设置 ;
         步骤二 : 分析并抽取传统 Crout 方法中可以并行计算的部分, 利用 TBB 并行模板类 改写为符合 TBB 需要的规范类 ;
         步骤三 : 设置问题初始值, 即矩阵的规模、 矩阵的行数、 列数, 输入矩阵等 ;
         步骤四 : 进入 Crout 方法的行循环 ;
         步骤五 : 调用 parallel_reduce 并行模块类, 将每一行的最大主元保存在临时向 量中, 同时计算并保存比例因子, 因此采用 TBB 进行并行设计对提高方法效率至关重要 ;
         步骤六 : 进入 Crout 方法的列循环 ;
         步骤七 : 确定新的主元及比例因子, 修改 TINY, 每一行除以主元。若列循环未结束 则转到步骤六, 判断行循环是否结束, 如果判断为否则转到步骤 4) ; 否则转到步骤四 ;
         步骤八 : 结束, 得到因部分主元法而改变了的行列排列次序。
         为了验证并行 Crout 方法的正确性、 有效性及评价本发明的实用性, 下面通过本 发明求解矩阵的逆来验证与评价, 其基本步骤如下 :
         步骤一 : TBB 并行计算平台的安装与环境设置 ;
         步骤二 : 读入文件, 其中包括输入矩阵及相关参数设置 ;
         步骤三 : 设置问题初始值, 即矩阵的行数、 列数, 输入矩阵 ;
         步骤四 : 利用本发明的并行 Crout 方法对输入矩阵进行 LU 分解 ;
         步骤五 : 进入矩阵的行循环 ;
         步骤六 : 进入矩阵的列循环 ;
         步骤七 : 通过回代函数将矩阵按列求逆 ;
         步骤八 : 增加列计数, 若列循环未结束则转到步骤六 ; 增加行计数, 若行循环未结 束则转到步骤五 ;
         步骤九 : 结束, 得到输入矩阵的逆矩阵, 写入到文件。
         如图 1、 2 所示, 本发明对传统 Crout 分解方法进行分析, 把其中的关键步骤进行并 行化处理, 并利用 Intel 公司的线程构建块来实现并行化。本发明充分利用了线程构建块 的灵活性、 跨平台性及稳定性, 实现基于线程构建块的并行 Crout 分解方法, 并将该方法应 用于矩阵求逆, 经过大量仿真实验显示, 本发明能够大幅度提高传统 Crout 分解方法的效 率, 进而大幅度提高使用了本发明的矩阵求逆方法的效率。
         本发明由一个符合线程构建块规范的求最大主元类、 最大主元调用类和利用了最 大主元调用类的 Crout 分解方法组成, 符合线程构建块规范的求最大主元类提供了具体的 并行处理的部分、 任务的线程分支划分及合并等功能 ; 最大主元类调用类提供了对求最大 主元类的调用封装, 且提供了对其进行线程划分的粒度控制参数 ; 并行化的 Crout 分解方法利用了线程并行化的优点, 充分利用了计算机的资源, 提高了传统 Crout 分解方法的效 率。本发明可以运行于多个系统平台, 如 Windows, Linux, Unix 等系统。
         图 1 为本发明求最大主元类的结构图, 以下对图中的各部分的详细描述 :
         在部分 101 中, 实现 operator 接口, 其是并行处理的主要部分, 主要功能是进行并 行循环优化, 将循环的参数修改成 TBB 定义的 blocked_range 模板类, 能够支持循环体内任 务的并行划分 ;
         在部分 102 中, 实现带 tbb::split 的分支创建函数接口, 当 TBB 决定分出一个 blocked_range 时, 会调用 MaxElement(MaxElement&x, tbb::split), 这个 tbb::split 只是 一个点位符, 用于和拷贝构造函数相区别 ;
         在部分 103 中, 实现 join 合并函数接口, 当 TBB 合并 blocked_range 时, 会调用 void_join(MaxElement&y), 本例中合并就意味着把多个结果进行运算, 将最终的结果保存 并返回 ;
         在部分 104 中, 实现构造函数接口, 构造函数主要实现参数的初始化以及从整个 任务空间中分离并构建子任务。
         图 2 为本发明的并行 Crout 方法流程图, 下面对图中的各步骤进行详细描述 : 在步骤 201 中, 读入需要分解的矩阵, 初始化行值 i, 列值 j, 内含比例因子向量 vv[i], 极小数 TINY, 临时变量等。然后执行步骤 202 ;
         在步骤 202 中, 按行循环, 递增行, 求内含比例因子。然后执行步骤 203 ;
         在步骤 203 中, 调用并行的求最大主元类算法 : 求解各行的主元素和比例因子。 然 后执行步骤 204 ;
         在步骤 204 中, 按列循环, 递增列。然后执行步骤 205 ;
         在步骤 205 中, 计算新的候选主元素及交换比例因子, 替换原有的候选主元素及 交换比例因子。然后执行步骤 206 ;
         在步骤 206 中, 判断矩阵是否为奇异矩阵, 如果是则赋 TINY 为零, 否则 TINY 保持 不变。然后执行步骤 207 ;
         在步骤 207 中, 矩阵中的每一行除以主元素。如果按列循环未结束, 则执行步骤 204 ; 如果按列循环结束但按行循环未结束, 则执行步骤 202 ; 如果按列循环与按行循环都 已结束, 则执行步骤 208 ;
         在步骤 208 中, 结束函数 : 输出因部分主元法而改变了的行排列次序, 可以根据此 排列次序得到矩阵的 LU 分解矩阵。
         图 3 为利用并行 Crout 方法求矩阵的逆阵的流程图, 下面对图中的各步骤进行详 细描述 :
         在步骤 301 中, 通过对话框选择需要的输入文件, 选择的矩阵文件为 TXT 格式, 数 据结构格式为 : 第一行为矩阵的行数 (row) ; 第二行为矩阵的列数 (col), 在本应用中行数 等于列数 (row = col = n), 即这里的矩阵为 n 维方阵 ; 第三行开始为矩阵的值。然后执行 步骤 302 ;
         在步骤 302 中, 根据读入的矩阵维数读取需要的数值并初始化相关变量及数据结 构。然后执行步骤 303 ;
         在步骤 303 中, 利用本发明并行 Crout 方法对读入的矩阵进行分解。然后执行步
         骤 304 ; 在步骤 304 中, 控制矩阵的行循环 i, 然后执行步骤 305 ;
         在步骤 305 中, 控制矩阵的列循环 j, 然后执行步骤 306 ;
         在步骤 306 中, 通过回代函数对计算的矩阵进行处理。若 i < n 且 j < n, 则返回 步骤 305 ; 若 i < n 且 j >= n, 则返回步骤 304 ; 若 i >= n 且 j >= n, 执行步骤 307 ;
         在步骤 307 中, 结束矩阵求逆计算, 输出矩阵的逆及相关的计算参数 : 方法的名 称、 运算时间、 方法线程数, 方法子矩阵大小等。执行步骤 308 ;
         在步骤 308 中, 将结果写入到 TXT 文件中, 供使用者进一步分析。
         图 4 中详细比较了并行 crout 方法、 串行 crout 方法、 高斯 - 约当消去法在求解矩 阵时的效率。由参考线可以看出, 当矩阵维数大于等于 256 时, 并行 crout 方法的运行时间 优于串行 crout 方法, 更明显优于高斯 - 约当消去法的运行时间 ; 并且随着矩阵维数的增 加, 这种趋势越明显。当矩阵规模达到百万级别的时候, 本发明比串行 Crout 方法约提高了 13.7%, 并比高斯 - 约当消去法约提高了 77%。即对于大规模或超大规模矩阵而言, 并行 crout 方法明显优于高斯 - 约当消去法, 也优于串行 crout 方法。因此, 本发明具有很高的 实用价值与广泛的应用前景。
        

    关 键  词:
    基于 线程 构造 超大规模 矩阵 多核 并行 克劳特 分解 方法
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:基于线程构造块的超大规模矩阵多核并行克劳特分解方法.pdf
    链接地址:https://www.zhuanlichaxun.net/p-4215393.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1