《A synchronization-free algorithm for parallel sparse triangular solves》读后总结

2023-05-16

正式读研之后看的第一篇文献。本着“只有记录下来的才是自己的”这一原则,记录一下。

论文提出的方法用来解决多元一次方程组中系数矩阵为下三角的情况(Lx = b中,L为下三角矩阵)

A示意图

如上图所示,对应的方程组如下“

a(0,0)x0 = b0

a(1,1)x1 = b1

a(2,1)x1 + a(2,2)x2 = b2

...

a(4,1)x1+a(4,2)x2+a(4,3)x3+a(4,4)x4 = b4

...

可以看到x0和x1可以直接得解,而x2必须等待x1计算完成之后才可以计算,同理x4必须等待x1,x2,x3计算完成以后才能开始计算。如果用x->y表示y必须等待x计算完成之后才能开始计算,则可得下图

 对这张解的顺序图进行拓扑排序,对不同层进行level标记,则可得下图

 可以看到,0和1可同时得解,之后解3和2,以此类推,最后解7。也就是说,处于同级level的元素不存在顺序关系,可被同时计算。处于不同level的元素必须满足计算顺序。所以程序总体上说是按照level串行进行,同层level并行进行。上述把解放到不同level的方法就是level scheduling。由于需要提前对解的顺序图进行拓扑排序,分析level顺序、哪些元素可以被并行处理,程序运行起来还需要进行同步控制,保证整体计算的串行进行,这样代价是很大的。

而论文中提出的无同步(Synchronization-Free)做到了不必同步。方法是等待。在上例中,由于计算x2必须在计算x1之后进行,那么就让计算x2元素的线程等待x1计算完成之后再开始计算x2。

那怎么才能知道和自己相关的元素有没有被计算完成呢(如x2需要知道x1是否被计算完)?论文中提出了使用入度这一方法,当一个点在解的顺序图中的入度减为0以后,说明它的前驱节点已经全部计算完,这个结点可以计算。例如x1计算完成之后,则需要更新x2的入度-1;x3计算完后则需要更新x4和x5的入度。这里更新其他元素这一步也可以并行来做,如x3对x4和x5的更新 。

总体思想就是这样,一些细节看完代码再说,下面是算法代码

可以看到,算法主要分两个state,先是并行求不同点的入度(line3-7,preprocessing_state),然后在solve_state先是等待相关联元素先计算完(line11-13),再计算自身元素(line14),然后更新被关联元素(line15-24)。left_sum和row_idx等变量的含义查看算法的串行版本和矩阵的CSC存储格式即可。

这里要特别注意的是,1)算法第10行和第15行其实是动态并行,也就是多级并行,这里实现两级并行的手段是第一级并行(等待并计算自身负责元素)用wrap级并行,第二级并行(更新当前计算元素的后继节点入度)用thread级并行。为什么要这么设计呢?这就设计到cuda的特性了,执行指令的最小单位是wrap而不是thread,所以wrap内不同线程使用自旋锁的话会趋于死锁。设想第一级并行如果用了thread级并行,且都在一个wrap里,那么即便0号进程计算完了,也不会更新1号进程的负责元素的入度,因为同一个wrap内的线程是腿绑在一起往前跑的。1号进程不能跑完循环体执行到13行代码,那0号进程也别想走到13行代码,更别提通知1号进程,让1号进程开始计算,所以就要把不同元素的计算放到不同的wrap里面。2)第二级并行,同个wrap内的32个thread通知不同的后继节点,需要注意的就是这里只有32个进程可以用,假如待更新入度的后继节点多于32个,就只能循环利用这32个进程,也就是让wrap内的0号进程去通知第33个后继节点。

算法还在内存方面做了优化,使用了共享内存加速程序的计算,变量名字以s_开头的全部是共享内存,以d_开头的是设备内存。第17行对同片元素(即被同块线程处理元素)进行判断,如果是同片元素,那么更新同片变量(18、19行),如果不是,则更新非同片元素值(21、22行)。

注:代码的3-7行进行入度统计,由于自身元素也算作入度,所以11行入度减为1即可。

附(算法的串行版本):

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《A synchronization-free algorithm for parallel sparse triangular solves》读后总结 的相关文章

  • 数组中的重复元素[重复]

    这个问题在这里已经有答案了 这有点与this https stackoverflow com questions 2605766 how to find a duplicate element in an array of shuffled
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • 用于基本要素匹配的最坏情况 NlogN 算法

    查找两个相同大小数组的元素之间的唯一映射 https stackoverflow com questions 4411940 find the unique mapping between elements of two same size
  • Java 同步计数器 - get() 怎么样?

    众所周知这么简单x 不是原子操作 实际上是读 增量 写操作 这就是为什么它应该同步 但是关于get 我读过它也应该同步 但有人能解释一下为什么吗 通过引入来避免内存一致性错误happens before关系 当出现以下情况时该怎么办get
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 同步2个具有不同模式的数据库

    我们有一个使用通用表设计的标准化 SQL Server 2008 数据库 因此 我们没有为每个实体 例如产品 订单 订单项等 使用单独的表 而是使用通用表 实体 实例 关系 属性等 我们决定建立一个单独的非规范化数据库来快速检索数据 您能否
  • 使用 XCHG 解锁的自旋锁

    维基百科提供的使用 x86 XCHG 命令的自旋锁的示例实现是 Intel syntax locked The lock variable 1 locked 0 unlocked dd 0 spin lock mov eax 1 Set t
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 如何设计一种算法来计算倒数式数学数字难题

    我一直想这样做 但每次我开始思考这个问题时 它的指数性质都会让我大吃一惊 我希望能够理解的问题解决器和代码是针对倒计时数学问题的 给定一组数字 X1 到 X5 计算如何使用数学运算将它们组合起来生成 Y 您可以应用乘法 除法 加法和减法 那
  • 基本 Malloc/免费

    如果我的程序有这样的片段 struct Node node while node malloc 100 do stuff with node 这意味着每次我循环 while 循环时 我都会新分配节点指针指向的 100 个字节 对吧 如果这是
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 一种良好且简单的随机性测量方法

    获取一长整数序列 例如 100 000 个 并返回序列随机性的测量值的最佳算法是什么 该函数应返回单个结果 如果序列并非完全随机 则返回 0 如果完全随机 则返回 1 如果序列有点随机 它可以给出介于两者之间的东西 例如0 95 可能是一个
  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • 当给定块大小时反转单链表

    有一个单连接链表 并给出了块大小 例如 如果我的链表是1 gt 2 gt 3 gt 4 gt 5 gt 6 gt 7 gt 8 NULL我的块大小是4然后反转第一个4元素 然后是第二个 4 个元素 问题的输出应该是4 gt 3 gt 2 g
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • 颜色逻辑算法

    我们正在构建一个体育应用程序 并希望将团队颜色融入到应用程序的各个部分 现在 每个团队都可以使用几种不同的颜色来表示 我想做的是执行检查以验证两个团队颜色是否在彼此一定的范围内 这样我就不会显示两个相似的颜色 因此 如果团队 1 的主要团队
  • 核心数据 iCloud 同步中的关系完整性和验证

    考虑以下简单的实体模型 实体 A 与实体 B 具有一对一关系 称为b 实体 B 具有逆对一关系 称为a 这两种关系都不是可选的 A B b lt gt a 假设我们有两个设备 1 和 2 开始完全同步 每个对象都有一个 A 类对象和一个 B

随机推荐

  • 项目流标了怎么办?

    公开招标的项目如果出现流标现象 xff0c 是不能直接采取议标的方式 xff0c 或者直接采取竞争性谈判 单一来源采购 询价等非招标方式 xff0c 而应当组织二次招投标 xff0c 如果二次招标后仍然流标的 xff0c 可以核准后不再招标
  • xubuntu 14.04 LTS安装拼音输入法

    一 xff0c 安装fcitx sudo apt get install fcitx table wbpy 是不是很好记的样子 xff0c wb五笔py拼音 二 xff0c 配置fcitx desktop gnome language se
  • 整理库函数依赖关系

    问题 xff1a 现有一函数库 xff0c 这里是lapack3 5 lapack提供的每一个函数API都单独是一个 c 请给出这些API的相互调用关系 间接调用也要统计 xff0c 循环调用 xff08 如果可能的话 xff09 不计 进
  • 手把手教你写出正确的二分搜索!

    写出正确的二分搜索知易行难 xff0c 原理好像都懂 xff0c 但是实际上手就出各种错误 xff0c 例如如何确定循环终止条件 区间搜小判断条件等 这里就手把手教你写出正确的二分检索 xff01 二分法共有下面7种变式 是否存在数字t 返
  • SphereFace: Deep Hypersphere Embedding for Face Recognition

    Weiyang Liu 1 Yandong Wen 2 Zhiding Yu 2 Ming Li 3 Bhiksha Raj 2 Le Song 1 1 Georgia Institute of Technology 2 Carnegie
  • 一文解答你关于“轨道问题”的所有疑问!(有环链表问题)

    问题描述 xff1a 给定一个链表 xff0c 返回链表开始入环的第一个节点 如果链表无环 xff0c 则返回 NULL 我看过很多博客 xff0c 对于最优解法的解释无非两个字 xff0c 神奇 xff0c 并没有说明如何构思出这样的思路
  • 从bt到dp的困惑

    每一个dp的背后都必然有一个bt bt的基础上加上记忆化搜索 xff0c 然后对问题的拆分由从上到下变成从下到上 xff0c 即可转化为dp 但绝不是所有的bt就天然的可以转化为dp 例如下面这个例子 leetCode 115题 xff0c
  • 教练,我想学二叉树遍历!

    二叉树具有前序 中序 后序三种遍历方式 递归的相信大家都会写 xff0c 但是迭代的该怎么写呢 xff1f 怎样的迭代写法才能具有统一性便于理解呢 xff1f 请看下面具体的做法 xff0c 每种遍历方式各有2种策略 xff0c 基于栈的和
  • TVM优化原理学习

    没有看论文 xff0c 看了b站陈天奇的视频 xff0c 还有一些博客的分析 xff0c 学习了优化原理 后续需要深入理解再看论文 TVM对于神经网络的优化主要有两部分 xff0c 计算图优化和算子优化 xff0c 下面分开说明 计算图优化
  • 一个GDB调试的workflow

    我们要调试的程序是 include lt stdio h gt int main int p 61 NULL printf 34 p n 34 p p 61 3 printf 34 d n 34 p return 0 可以看到第6行会访问非
  • 记录一个很奇怪的bug,待解决

    一个很简单的矩阵求幂模板类的程序 xff0c 但是在vector lt vector lt T gt gt temp n vector lt T gt n 这一句不能执行 xff0c 会卡死 下面是完整的代码和输出 方阵的幂运算 xff0c
  • 听说还有人不懂右值和std::move()?

    1 左值和右值 左值是可以出现在等号左边的符号 xff0c 当然它也可以出现在等号右边 xff0c 例如int a等等 右值是能且只能出现在等号右边的符号 xff0c 例如5 xff0c abc 等等 右值细分为将亡值和纯右值 xff0c
  • 一个leetcode题目的bug记录【待解决】

    1403题目 xff0c 非递增顺序的最小子序列 题目很简单 xff0c 利用贪心的策略 xff0c 对数组从大到小排序 xff0c 然后尽量从前面取最小的满足题目要求的子数组即可 我的bug出在对数组从大到小排序这里 xff0c 报错代码
  • 字符串匹配KMP算法学习笔记

    字符串匹配 xff0c leetcode28题 时间复杂度O MN 的算法大家都会 xff0c 题解里面官方账号给出的利用字符串哈希判等的O N 算法也很优秀 本篇的重点是KMP算法 网上能搜到的KMP算法例子非常多 xff0c 其原理可以
  • 对std::set使用lower_bound的效率问题

    1488题 xff0c 洪水泛滥 在查找可用晴天时 xff0c 如果使用 auto last sunny it 61 sunny lower bound last rain 就会超时 而如果使用auto last sunny it 61 l
  • 升级CentOS 7.4内核版本的三种方案

    在实验环境下 xff0c 已安装了最新的CentOS 7 4操作系统 xff0c 现在需要升级内核版本 实验环境 CentOS 7 x86 64 Minimal 1708 iso CentOS Linux release 7 4 1708
  • 一些题解的思考集合。

    我觉得比较好 xff0c 比较关键 xff0c 比较难想到的思考点 xff0c 还有一些小疑惑 xff0c 统一记录在此 378题 xff0c 为什么返回的left一定是矩阵中的元素 xff0c 个人思考 75题 xff0c three w
  • 引用类型推导规则,完美转发

    类型推导规则 规则1 xff08 引用折叠规则 xff09 xff1a 如果间接的创建一个引用的引用 xff0c 则这些引用就会 折叠 在所有情况下 xff08 除了一个例外 xff09 xff0c 引用折叠成一个普通的左值引用类型 一种特
  • WIN10+MX150+VS2013安装CUDA9.2

    记录一下在自己PC上安装cuda的过程 OS是win10 xff0c IDE为VS2013 xff0c 显卡为GeForce MX150 xff08 驱动版本24 21 13 9882 xff09 1 首先确认自己系统的显卡可用 打开设备管
  • 《A synchronization-free algorithm for parallel sparse triangular solves》读后总结

    正式读研之后看的第一篇文献 本着 只有记录下来的才是自己的 这一原则 xff0c 记录一下 论文提出的方法用来解决多元一次方程组中系数矩阵为下三角的情况 Lx 61 b中 xff0c L为下三角矩阵 如上图所示 xff0c 对应的方程组如下