《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》读后总结 的相关文章

  • 如何使用 SyncAdapter 处理远程服务器的 RESTful 更新

    我观看了 Google I O REST 演讲并阅读了幻灯片 http www google com events io 2010 sessions developing RESTful android apps html http www
  • Java:如何实现3和?

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • 使到 n 个点的集合的欧氏距离之和最小的点

    我有一组点W x1 y1 x2 y2 xn yn 在 2D 平面上 你能找到一种算法 将这些点作为输入并返回一个点 x y 在 2D 平面上 距以下点的距离之和最小W 换句话说 如果 di Euclidean distance x y xi
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • Exposé 布局算法

    我正在制作一些项目 其布局类似于 Mac OS X 在 Expos 中对窗口所做的操作 它适应项目的长宽比和可用区域的长宽比 基本上 可用区域分为行和列 每个单元格 行和列的交集 中放置一个项目 这些项目必须保持其纵横比 此处width h
  • Python 给定 k 个分区的整数分区

    我正在尝试寻找或开发Python 的整数分区代码 仅供参考 整数分区将给定整数 n 表示为小于 n 的整数之和 例如 整数5可以表示为4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 我为此找到了许多解决方案 ht
  • 如何在给定目标索引数组的情况下对数组进行就地排序?

    你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
  • 如何求解:T(n) = T(n - 1) + n

    我已经解决了以下问题 T n T n 1 n O n 2 现在 当我解决这个问题时 我发现界限非常松散 我是否做错了什么 或者只是这样 您还需要一个递归关系的基本情况 T 1 c T n T n 1 n 为了解决这个问题 您可以首先猜测一个
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • 将嵌套字典中的所有键从camelCase转换为snake_case

    我有一本类似这样的字典 firstName abc lastName xyz favoriteMovies Star Wars The lone ranger favoriteCountries country China capitalC
  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • 快速搜索压缩文本文件

    我需要能够在大量压缩文件 txt 中搜索文本 压缩可能会改变为其他东西 甚至成为专有的 我想避免解压所有文件并压缩 编码 搜索字符串并在压缩文件中搜索 这应该可以通过对所有文件使用相同的码本使用霍夫曼压缩来实现 我不想重新发明轮子 所以 任
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 循环多个 UIAlertController

    在某些情况下 我的应用程序需要显示多个警报消息 错误消息在启动时收集 并且需要一次向用户显示一条 当第一个被确认后 应该呈现下一个 问题在于 显然 它们都试图同时执行 有没有一种聪明的方法可以同步执行此操作 这是一些简单描述我想要做的事情的
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对

随机推荐

  • 项目流标了怎么办?

    公开招标的项目如果出现流标现象 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 对应的方程组如下