新一代分布式高性能图数据库的构建 - 沈游人新一代分布式高性能图数据库的构建 北京海致星图科技有限公司 2023-06-18 沈游人 数据库与大数据专场 海致简介—企业级知识图谱开创者 专业顶尖技术团队支撑 超 700 人团队,其中 80% 为技术人员,创始团队在完成全球第一个中文知 识图谱网站研发后,探索知识图谱技术在企业领域的应用。 2021 年,海致院 士专家工作站成立,站内清华大学计算机博士生占比达 90% 以上。 专注于数据智能技术赋能中国数字经济发展 海致高性能图计算院士专家工作站 郑纬民 - 海致科技首席科学家 中国工程院院士、清华大学计算机科学与技术系教 授、中国计算机学会前理事长,中国计算机系统结构 的学科带头人,我国高性能计算和存储系统等方面的 泰斗和先行者。 2021 年 3 月 25 日,海致科技与清华大学计算机科学与技术系共同建设高性能图计算院士专家工作站 。 高性能图计算是高性能计算、图计算两项技术融合产生的新的技术方向,满足人们对更大规模、更复 术方向,满足人们对更大规模、更复 杂数据的实时处理和存储需求,是计算机领域竞争新战略制高点。 产学结合、协同创新,打造全球领先的国产自研图数据库 AtlasGraph ,培育世界级的图计算软硬件 生态体系,保持对全球科技竞争的战略均衡。 海致高性能图计算院士专家工作站 海致获得“ 2021 年 CCF 科学技术奖科技进步卓越奖” CCF 科学技术奖被认为是计算机科学与技术领域最具影响力的专业奖项之一,0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程过程。简单来说,进程是程序(应用程序,可执行文件)的一次执行。比如双击打开一个 桌面应用软件就是开启了一个进程。 • 线程是进程中的一个实体,是被系统独立分配和调度的基本单位。也有说,线程是 CPU 可 执行调度的最小单位。也就是说,进程本身并不能获取 CPU 时间,只有它的线程才可以。 • 从属关系:进程 > 线程。一个进程可以拥有多个线程。 • 每个线程共享同样的内存空间,开销比较小。 • 每个进程拥有独立的内存空间,因此开销更大。 在运行物理解算的时候,界面会卡住,算完一帧后窗口才能刷新一遍 ,导致解算过程中基本别想做事,这一定程度上归功于 opengl 原始的单线程设计。 • 正面教材: zeno 可以在解算过程中,随时拖动滑块看前几帧的结果,编辑场景图,修改 节点间的连接,为下一次解算做准备,同时当前已经启动的物理解算还能在后台继续正常 运行。虽然 zeno 也用了 opengl ,但他用多进程成功在 opengl 的百般拖后腿下实现了 并发。 示是否已经被释放。他会在解构检测这个 flag ,如果没有释放,则调用 unlock() ,否则 不调用。 • 然后可以直接调用 unique_lock 的 unlock() 函 数来提前解锁,但是即使忘记解锁也没关系, 退出作用域时候他还会自动检查一遍要不要解 锁。 std::unique_lock :用 std::defer_lock 作为参数 • std::unique_lock 的构造函数还可以有一0 码力 | 79 页 | 14.11 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南CMAKE_CURRENT_BINARY_DIR 表示当前输出目录的位置,例如 ~/hellocmake/build 。 project :初始化项目信息,并把当前 CMakeLists.txt 所在位置作为根 目录 和子模块的关系: PROJECT_x_DIR 和 CMAKE_CURRENT_x_DIR 的 区别 PROJECT_SOURCE_DIR 表示最近一次调用 project 的 CMakeLists.txt 所在的源码目时候是纯头文件,而 find_package(spdlog REQUIRED) 时却 变成预编译链接库的版本。(嗯,其实不是 PUBLIC 而是 INTERFACE ,因为伪对象没有实体) 和古代 CMake 做对比:为什么 PUBLIC 属性的传播机制如此便利 现代 CMake : 古代 CMake : 和 find_package(TBB CONFIG REQUIRED) 0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 模板函数?未免有些差强人意 • 索性把 eatTwice 声明为模板函数的确能解决问题,但模板函数不是面向对象的思路,并 且如果 cat 和 dog 是在一个 IObject 的指针里就会编译出错,例如右图的 vector(这是游戏引擎中很常见的用法)。 正确解法:额外定义一个 clone 作为纯虚函数,然后让猫和狗分别实现他 clone 的调用 • 这样一来,我们通用的 Vec3IGrid , IntGrid , PointsDataGrid • 我们并不知道他们之间的继承关系,可能有也可能没有。但是在 Zeno 中,我们必须有。 • 他们还有一些成员函数,这些函数可能是虚函数,也可能不是。 • 如何在不知道 OpenVDB 每个类具体继承关系的情况下,实现我们想要的继承关系,从而 实现封装和代码重用?简单,只需用一种被小彭老师称为类型擦除 (type-erasure) main 之前执行的不是 printf 而是别的比较复杂的表达式呢? • 可以用逗号表达式的特性,总是会返回后一个 值,例如 (x, y) 始终会返回 y ,哪怕 x 是 void 也没关系。因此只需要这样写就行: • static int helper = ( 任意表达式 , 0); 顺便一提: lambda 的妙用 • 小彭老师小技巧: • []{ xxx; yyy; return 0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程新特性,都可以用。甚至可以把任何一个 C++ 项目的文件后缀名全部改成 .cu ,都能编 译出来。 • 这是 CUDA 的一大好处, CUDA 和 C++ 的关 系就像 C++ 和 C 的关系一样,大部分都兼容 ,因此能很方便地重用 C++ 现有的任何代码库 ,引用 C++ 头文件等。 • host 代码和 device 代码写在同一个文件内,这 是 OpenCL 做不到的。 编写一段在 • 总的板块数量: gridDim • 线程 (thread) :并行的最小单位 • 板块 (block) :包含若干个线程 • 网格 (grid) :指整个任务,包含若干个板块 • 从属关系:线程<板块<网格 • 调用语法: <<>> 区分板块和线程有点麻烦?“扁平化”他们! • 你可能觉得纳闷,既然已经有线程可以并行了 ,为什么还要引入板块的概念?稍后会说明区 不过,这个功能同样需要开启 CUDA_SEPARABLE_COMPILATION 。 第 2 章:内存管理 如何从核函数里返回数据? • 我们试着把 kernel 的返回类型声明为 int ,试 图从 GPU 返回数据到 CPU 。 • 但发现这样做会在编译期出错,为什么? • 刚刚说了 kernel 的调用是异步的,返回的时候 ,并不会实际让 GPU 把核函数执行完毕,必须 cudaDeviceSynchronize() 0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程模板函数:特化的重载 • 有时候,一个统一的实现(比如 t * 2 )满 足不了某些特殊情况。比如 std::string 就 不能用乘法来重复,这时候我们需要用 t + t 来替代,怎么办呢? • 没关系,只需添加一个 twice(std::string) 即可,他会自动和已有的模板 twice(T) 之间相互重载。 模板函数:特化的重载(续) • 但是这样也有一个问题,那就是如果我用 左值类型: int & , int const & • 左值例子: a, *p, p[a] • 右值类型: int && • 右值例子: 1, a + 1, *p + 1 • 不理解右值和右值引用?没关系,老师也不理解,跳过即可! 理解 const :常值修饰符 • 与 & 修饰符不同, int const 和 int 可以看做两个不同的类型。不过 int const 是不可写 入的。 • 因此 带 auto 参数的 lambda 表达式,和模板 函数一样,同样会有惰性、多次编译的特 性。 C++20 前瞻:函数也可以 auto , lambda 也可以 • 如右图,两者的用法可以互换,更方便了 。 • 老师也欢迎同学们在作业中尝试 C++20 新特性,如果你们有相应的编译环境的话 。 • auto wrap(auto f) { • return 0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型加上去没有任何变化),是因为 第一个数太大了,要表示 1234000.01 需要 9 位有效位数。 • 而单精度浮点数 float 的底数有 23 位,指数有 8 位(图 1 )。 • 双精度浮点数 float 的底数有 52 位,指数有 11 位(图 2 )。 double: float: http://c.biancheng.net/view/314.html 以求最大值为案例 用定点数来表示 就很少,这样会有一点不精确,优点是和 float 之间转换的位运算实现起来比较简单。 double: float: bfloat16: 图片解释 bfloat16 , float16 , float32 的关系 bfloat16 因为指数一样是 8 位,所以范围没有变。 底数变少了,所以整个值域上的精度都有所降低。 实现 bfloat16 存储和转换 • 只要用指针转换来实现 bit-cast ,然后配合位运算0 码力 | 102 页 | 9.50 MB | 1 年前3
Rust分布式账务系统 - 胡宇Auticuro 分布式账务系统 1 2 3 4 事务层: Marker 分布式账务系统 A,B,C 在不同分区执行一个事务的 TCC 转账计划 ● 转账计划 ○ 有向无环图 ○ 节点是一个任务 ○ 边是依赖关系 ● 事务层 Marker 负责执行计划 ○ ACID 保证 ○ 依赖控制 ○ 条件执行 ○ 调度账户变动请求 跨分区转账 分布式账务系统 拥抱开源 github:0 码力 | 27 页 | 12.60 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南加了,则每次 cmake --build 时自动检测目录是否更新,如果目录有新文件了, CMake 会自动帮你重新运行 cmake -B build 更新 myvar 变量。 六、头文件和源文件的一一对应关系 • 通常每个头文件都有一个对应的源文件,两个文件名字应当相同 (方便我们理解,也方便 IDE 跳转),只有后缀名不一样。 • 如果是一个类,则文件名应和类名相同,方便查找 ( Animal XXX::xxx) 大多都能同时兼容现代和古代 • 大多现代的 Find/Config 文件,都同时兼容 现代和古代的用法。 • 特别古老的 Find 文件,则只能用古代的用法 。 • 例如右图是 FindCURL.cmake 的注释,可以 看到 IMPORTED Targets 章节是在介绍现代 的用法,而 Result Variables 章节是在介绍 古代的用法,我们尽量用现代的那种就行。0 码力 | 56 页 | 6.87 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化,但是 实际上还是 YX 序,和静态数组 的 a[y][x] 一样的,指标出现的顺 序并无关紧要。 …… ndarray :访问越界问题 • 在物理仿真中,常常需要访问在一个元素附近的几个元素。图 像处理中用到的模糊操作,也需要向上下左右扩散 w 个单位。 • 这样假如当前元素正好在二维网格的边界上,那再往外索引 w 个单位就会超出数组的界限,导致出错。对此有多种解决办法 : 1. 使用 b(i, t) 连续 32 次顺序访问(好)。 • c(t, j) 32 次在一个地址不动(一般)。 • 这样就消除不连续的访问了,从而内部的 i 循环可以顺利矢量化,且多个循环体之间 没有依赖关系, CPU 得以启动指令级并行 ,缓存预取也能正常工作,快好多! 实战案例:小内核卷积 最内层循环 unroll 一下更好 英文术语对照表 • 缓存行: cacheline • 一级缓存:0 码力 | 147 页 | 18.88 MB | 1 年前3
共 23 条
- 1
- 2
- 3













