新一代分布式高性能图数据库的构建 - 沈游人新一代分布式高性能图数据库的构建 北京海致星图科技有限公司 2023-06-18 沈游人 数据库与大数据专场 海致简介—企业级知识图谱开创者 专业顶尖技术团队支撑 超 700 人团队,其中 80% 为技术人员,创始团队在完成全球第一个中文知 识图谱网站研发后,探索知识图谱技术在企业领域的应用。 2021 年,海致院 士专家工作站成立,站内清华大学计算机博士生占比达 90% 以上。 高性能图计算是高性能计算、图计算两项技术融合产生的新的技术方向,满足人们对更大规模、更复 杂数据的实时处理和存储需求,是计算机领域竞争新战略制高点。 产学结合、协同创新,打造全球领先的国产自研图数据库 AtlasGraph ,培育世界级的图计算软硬件 生态体系,保持对全球科技竞争的战略均衡。 海致高性能图计算院士专家工作站 海致获得“ 2021 年 CCF 科学技术奖科技进步卓越奖” CCF 生活中无处不在的图 图分析技术分类 图查询 • 使用图数据库的查询语言进行点边搜索 图算法 • 中心性算法 • 社区算法 • 路径算法 • … 图深度学习 • 图嵌入 • 图卷积 • 图注意力网络 • 图自编码器 图查询及其应用场景 图查询 • 使用图数据库的查询语言进行点边的关联查询,可以快速完成传统数据库难以完成的 多度点边关 联 当前图的典型应用场景 路径识别 群体挖掘0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器C++ 标准库系列课 - 你所不知道的 set 容 器 by 小彭老师( @archibate ) 课件 & 代码: https://github.com/parallel101/course 上期回顾: https://www.bilibili.com/video/BV1qF411T7sd 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2. 你所不知道的 拟出来的 + n 复杂度为 O(n) 。虽然低效,但至少可 以用了。 std::next 等价于 + • 但是这样手写三个 ++ 太麻烦了 ,而且是就地操作,会改变迭代 器本身。 • 因此标准库提供了 std::next 函 数,他的内部实现相当于这样: • 没错,他会自动判断迭代器是否 支持 + 运算,如果不支持,会 改为比较低效的调用 n 次 ++ 。 std::advance 等价于 • 如果找不到,则返回 end() 迭代器。 • 刚刚说过, end() 指向的是 set 的尾部 再之后一格元素,他指向的是一个不存在 的地址,不可能有任何元素在那里!因此 end() 常被标准库用作一个标记,来表示 找不到的情况。 Python 中的 find 找不 到元素时会返回 -1 来表示,也是这个思 想。 • iterator find(int const &val) const;0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程项目的文件后缀名全部改成 .cu ,都能编 译出来。 • 这是 CUDA 的一大好处, CUDA 和 C++ 的关 系就像 C++ 和 C 的关系一样,大部分都兼容 ,因此能很方便地重用 C++ 现有的任何代码库 ,引用 C++ 头文件等。 • host 代码和 device 代码写在同一个文件内,这 是 OpenCL 做不到的。 编写一段在 GPU 上运行的代码 • 定义函数 kernel ,前面加上 blockDim ,看起来非常方便。 从线程到板块 • 核函数内部,用之前说到的 blockDim.x + blockIdx.x + threadIdx.x 来获取线程在整个 网格中编号。 • 外部调用者,则是根据不同的 n 决定板块的 数量( gridDim ),而每个板块具有的线程 数量( blockDim )则是固定的 128 。 • 因此,我们可以用 n / 128 作为 gridDim ,类型为 T 的数组 抽象的 std::allocator 接口 • vector 会调用 std::allocator的 allocate/deallocate 成员 函数,他又会去调用标准库的 malloc/free 分配和释放内存空间 (即他分配是的 CPU 内存)。 • 我们可以自己定义一个和 std::allocator 一样具有 allocate/deallocate 0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南gmake 。 对于 VS 7 , 它被设置为 devenv. 对于 Nmake 构建文件,它的值为 nmake 。 • CMAKE_DL_LIBS: 包含 dlopen 和 dlclose 的库的名称。 • CMAKE_COMMAND: 指向 cmake 可执行程序的全路径。 • CMAKE_CTEST_COMMAND: 指向 ctest 可执行程序的全路径。 • CMAKE_EDIT_COMMAND: 第 3 章:链接库文件 main.cpp 调用 mylib.cpp 里的 say_hello 函数 改进: mylib 作为一个静态库 改进: mylib 作为一个动态库 改进: mylib 作为一个对象库 https://www.scivision.dev/cmake-object-libraries/ 对象库类似于静态库,但不生成 .a 文件,只由 CMake 记住该库生成了哪些对象文件 mylib 作为一个对象库 https://www.scivision.dev/cmake-object-libraries/ 对象库类似于静态库,但不生成 .a 文件,只由 CMake 记住该库生成了哪些对象文件 对象库是 CMake 自创的,绕开了编译器和操作系统的各种繁琐规则,保证了跨平台统一性 。 在自己的项目中,我推荐全部用对象库 (OBJECT) 替代静态库 (STATIC) 避免跨平台的麻烦0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化数据。如果没有,则从内存中读取,并存储到缓存中; 如果有,则直接使用缓存中的数据。 • 这样一来,访问的数据量比较小时,就可以自动预先加 载到这个更高效的缓存里,然后再开始做运算,从而避 免从外部内存读写的超高延迟。 缓存的分级结构 查看高速缓存大小: lscpu • 可以看到我们 x86 电脑的缓存结构分为三级。 • 一级缓存分为数据缓存和指令缓存,其中数据缓存有 32 KB , 数组就完全不会被读取,不会占用内 存带宽,从而带宽利用率是 100% ,因此比 AOS 快了 2 倍。 AOSOA :两者得兼 • 还有一种办法就是让 MyClass 内部是 SOA ,而外部仍是一个 vector的 AOS—— 这种内存布局称为 AOSOA 。 • 缺点是必须保证数量是 1024 的整数倍, 而且因为要两次指标索引,随机访问比较 烦。 被编译器自动优化成 了 memset ,而 memset 内部利用了 stream 指令得以更快写入。 写入 1 比写入 0 更慢?解决 • 解决办法就是,我们也用 stream 指令, 这样就可以和标准库优化过的 memset 一 样快了。 Intel Intrinsics Guide • _mm 系列指令出自 头文件。 • 指令的文档可以看这个网站: • https://www 0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化map, set, string 等 …… constexpr :强迫编译器在编译期求值(续) 发现:会让编译变得很慢,因为这 50000 次迭代是在编译期进行的。 第 2 章:内联 调用外部函数: call 指令 @PLT 是 Procedure Linkage Table 的缩 写,即函数链接表。链接器会查找其他 .o 文件中是否定义了 _Z5otheri 这个符号, 如果定义了则把这个 以他用了。不过注意这样编译出的程序,可能 放到别人不支持 AVX 的电脑上没法运行。 数组清零:自动调用标准库的 memset memcpy 同理,不必为了高效,手动改 写成对 memcpy/memset 的调用,影响 可读性。编译器会自动分析你是在做拷贝 或是清零,并优化成对标准库这俩的调用 。 从 0 到 1024 填充: SIMD 加速 paddd :四个 int 的加法 movdqa 优化失败 因为编译器看不到那个文件的 other 函数里是什么,哪怕 other 在定义他的文件里是个空函数,他也不敢优化掉。 解决方案:放在同一个文件里 结论:避免在 for 循环体里调用外部函数,把他们移到 同一个文件里,或者放在头文件声明为 static 函数。 将 other 放到 和 func 同一个 .cpp 文件里,这样编译器看得到 other 的函 数体,就可以内联化该函数0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 C++ 的四大特殊函数变成了多 态的虚函数,这就是被小彭老师称为自动 虚克隆 (auto-vitrual-clone) 的大法。 Zeno 中对 OpenVDB 对象的封装 • 开源的体积数据处理库 OpenVDB 中有许多“网格”的类(可以理解为多维数组),例如: • openvdb::Vec3fGrid , FloatGrid , Vec3IGrid , IntGrid , PointsDataGrid (type-erasure) 的大法 。 类型擦除:还是以猫和狗为例 • 例如右边的猫和狗类,假设这两个类是某个第 三方库里写死的,这个第三方库的作者可能没 上过《面向对象程序设计》,居然没有定义一 个公用的 Animal 基类并设一个 speak 为虚 函数。现在你抱怨也没有用,因为这个库是按 LGPL 协议开源的,你只能链接他,不能修改 他的源码,但你的老板却要求你把 speak 变 成一个虚函数!怎么样,是不是准备好递交辞 return zzz; }() • 可以在表达式层面里插入一个语句块,本 质上是立即求值的 lambda 表达式(内部 是分号级别,外部是逗号级别)。 • 在函数体内也可以这样: • [&]{ xxx; yyy; return zzz; }() • 来在语句块内使用外部的局部变量。 带有构造函数和解构函数的类 • 实际上,只需定义一个带有构造函数和解构函 数的类(这里的 Helper ),然后一个声明该类0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南就干净许多,只是创建了 biology 这个静态库对象,并通过 GLOB_RECRUSE 为他批量添加 了所有位于 src 和 include 下源码和头文件。 • 根项目的 CMakeLists.txt 负责处理全局有效的设定。而子 项目的 CMakeLists.txt 则仅考虑该子项目自身的设定,比 如他的头文件目录,要链接的库等等。 四、子项目的头文件 • 这里我们给 biology Carer )中用到了其他模块( Animal )的类或函数,则需要 在新模块( Carer )的头文件和源文件中都导入其他模块( Animal )的头 文件。 • 注意不论是项目自己的头文件还是外部的系统的头文件,请全部统一采用 < 项目名 / 模块名 .h> 的格式。不要用 “模块名 .h” 这种相对路径的格式,避 免模块名和系统已有头文件名冲突。 十、依赖其他模块但不解引用,则可以只前向声明不导入头文件 • 在声明和定义外面都套一层名字空间,例如此处我的子项目名是 biology ,那 我就 biology::Animal 。避免暴露全局的 Animal 。这是因为万一有个“不拘一 格”的第三方库也暴露个全局的 Animal ,两个符号就会发生冲突,由于类符号 都具有 weak 属性,链接器会随机选择一个覆盖掉,非常危险! • (关于符号的 weak 属性,以后单独开一门 C++ 课讲讲,这一课还是重点关注0 码力 | 56 页 | 6.87 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅图像。总共只花了 1 分钟。 图形学爱好者:我看中的是多核,目的是加速比,如果是单核,那多线程对我无用! 某互联网公司:我看中的是异步,目的是无阻塞,即使是单核,多线程对我也有用。 因特尔开源的并行编程库: TBB https://link.springer.com/chapter/10.1007%2F978-1-4842-4398-5_2 安装 TBB • Ubuntu: • sudo apt-get article/details/111681426 详见 https://www.bilibili.com/video/BV1fa411r7zp 的 1:18:48 上一课的案例代码:基于标准库 基于 TBB 的版本:任务组 • 用一个任务组 tbb::task_group 启动多个 任务,一个负责下载,一个负责和用户交 互。并在主线程中等待该任务组里的任务 全部执行完毕。 • 区别在于,一个任务不一定对应一个线程 小彭老师单方面宣布:一切默认开启 tests , docs 构建目标的 cmake 项目,有病啊! 你妨碍别人作为子模块用你的项目。没错说的就是你 OpenSim ,张心欣当时浪费好多时间伺候这个沙雕库。 还要指定一个环境变量 SIMBODY_HOME 指向他的依赖项 SimBody 的源码路径,这么 dedicated 让人咋 用? 第 4 章:任务域与嵌套 https://link.springer0 码力 | 116 页 | 15.85 MB | 1 年前3
Zadig 产品使用手册面向多云友好,厂商中立,全球多地跨云跨域 安全可靠自动化部署 云原生 CI/CD 工具 Tekton Argo 使用门槛高、学习成本高 需要额外建设全流程能力 接入和使用都极其简单,内置模板库 和最佳实践,基于平台工程打造,可以轻松连 接一切工具链 企业自建 DevOps 流程平台 围绕 Jenkins 或 CI/CD 工具 搭建流程串接胶水平台 局限性大扩展性差 内部推广难度极高 产研全流程拉通需求到上线所需的代码、服务、配置和数据的一致性交付 Jira 飞书 项管 其他 自测 环境 Argo K8s JFrog YAML 产品 开 发 测 试 运维 产研运一体化 解决方案 免运维模板库 效能洞察 云原生 IDE 插 件 交付中心 发布中心 测试中心 高并发工作流 云原生环境 对接需求管理 测试管理 Spinnaker Jenkins Rancher JMeter IDE 热部署 • 更新镜像 • 更新配置 • 更新数据 • 日常调试 开发工程师 • 日常测试验证 • 自动化测试 测试工程师 • 升级预发环境 • 升级生产环境 • 变更数据库 发布工程师 核心场景介绍:不同角色工程师基于统一协作平面,操作使用自动化工作流和云原生环境 面向角色 功能描述 工作流名称样例 具体配置 开发工程师 CI 过程 project-unit-test0 码力 | 52 页 | 22.95 MB | 1 年前3
共 31 条
- 1
- 2
- 3
- 4













