C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程现代 C++ 进阶:模板元编程 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 高性能并行编程与优化 - 课程大纲 • 分为前半段和后半段,前半段主要介绍现代 C++ ,后半段主要介绍并行编程与优化。 ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 cpu 以上( GPU 专题) 为什么需要模板函数( template ) • 避免重复写代码。 • 比如,利用重载实现“将一个数乘以 2” 这个 功能,需要: 为什么面向对象在 HPC 不如函数式和元编程香了? 这个例子要是按传统的面向对象思想,可能是这样: 令 Int, Float, Double 继承 Numeric 接口类并实现 ,其中 multiply(int) 作为虚函数。然后定义: Numeric0 码力 | 82 页 | 12.15 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人图原生存储 索引 LSM-Tree 容灾保障 ( BR ) 元数据层 事务管理 MVOCC 计算层 Cypher AST 优化器 图计算 内存加速引 擎 服务接口 HTTP/RPC Spark 连接器 Python UDF 执行器 索引管理 一致性存储 RAFT 分片管理 元数据 集群管理 用户权限 GNN 应用层 Atlas 测试、集成测试、基准测试等 02 03 和文档系统以及 CI/CD 工具的良 好集成 完整的断言系统 异步协程 零成本抽象 强大的测试框架 REPL 命令行客户端 WebUI 面向分析师,提供图模型定义、数据管理、图查询分析、服务状态监控、用户管理能力 免代码,可视化定义实体、 边,设计图模型。 【亮点】 • 支持模型导入导出 • 拖拽式关系构建 • 丰富的样式配置 • 实时图结构预览 •0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器代器,分两种情况讨论。 • 当向 set 容器添加元素成功 时,该迭代器指向 set 容器 新添加的元素, bool 类型的 值为 true ; • 如果添加失败,即证明原 set 容器中已存有相同的元 素,此时返回的迭代器就指 向容器中相同的此元素,同 时 bool 类型的值为 false 。 • pairinsert(int val); http://c.biancheng 的作风。 • 注意: beg 必须在 end 之前,否则崩溃 。 • 用法举例: a.erase(a.find(2), a.find(4)); • 会删除 set 中所有满足 2 ≤ x < 4 的元 素(因为 set 有自动排序的特性,所有 元素都从小到大连续排列,所以删除 2 迭代器和 4 迭代器之间的元素其实就是 删除 2 ≤ x < 4 的元素) • iterator erase(iterator 后,违背了刚刚说的“ beg 必须在 end 之 前”这一规则,会导致标准库崩溃! • a.erase(a.find(2), a.find(4)); • 会删除 set 中所有满足 2 ≤ x < 4 的元 素 • 前提是 2 和 4 这两个元素在集合中存在 ! • iterator find(int const &val) const; • iterator erase(iterator first 0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程组中一个元素的赋值。 小技巧:网格跨步循环( grid-stride loop ) • 无论调用者指定了多少个线程 ( blockDim ),都能自动根据给定的 n 区间循环,不会越界,也不会漏掉几个元 素。 • 这样一个 for 循环非常符合 CPU 上常见 的 parallel for 的习惯,又能自动匹配不同 的 blockDim ,看起来非常方便。 从线程到板块 • 核函数内部,用之前说到的 ,如果不是就会漏掉最后几个元素。 • 主要是 C 语言的整数除法 n / nthreads ,他是向下取整的,比如 7 / 4 = 1 。 • 比如 n 为 65535 ,那么最后 127 个元 素是没有赋值的。 解决边角料难题 • 解决方法就是:采用向上取整的除法。 • 可是 C 语言好像没有向上整除的除法这 个运算符?没关系,用这个式子即可: • (n + nthreads - 先把 数据尺寸缩减 1024 倍到 CPU 可以接受的范围内,然 后让 CPU 完成的思路。 先读取到线程局部数组,然后分步缩减 • 刚刚我们直接用了一个 for 循环迭代所有 1024 个元 素,实际上内部仍然是一个串行的过程,数据是强烈 依赖的( local_sum += arr[j] 可以体现出,下一时刻 的 local_sum 依赖于上一时刻的 local_sum )。 •0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 single-instruction multiple-data )。 • 他可以大大增加计算密集型程序的吞吐量。 • 因为 SIMD 把 4 个 float 打包到一个 xmm 寄存器里同时运算,很像数学中矢量的逐元 素加法。因此 SIMD 又被称为矢量,而原始的一次只能处理 1 个 float 的方式,则称为 标量。 • 在一定条件下,编译器能够把一个处理标量 float 的代码,转换成一个利用 SIMD 指令的0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 模板类,使得 vector 的 resize 不会零初始化其中的 值。 加速比: 6.26 倍 并行筛选 8 (不推荐) 而是用 std::vector 作为 parallel_reduce 的元 素类型,通过合并得出最终结果,也是可以的。 很直观,可惜加速效果不好。 加速比: 2.04 倍 并行筛选 9 (用于 GPU ) 线程粒度很细,核心数量很多的 GPU ,往往没办法用 concurrent_vector0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器v]: m) { v = v2; } & & 相当于抓捕周树人的这个官兵 ( 编译器 ) 比较智能 他有一个真名 - 笔名对照表,知道两个名字指是同一个人 小彭老师不愧 是元宇宙鲁迅 小彭老师不愧 是元宇宙鲁迅 • 如果你想让你对局部变量 v 的修改,能对原本 map 中的 v 生效,就要得到 v 的指针, 因为只有指针是浅拷贝的,是可以远程修改另一个对象的。 • 这里说的指针,不光是0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型operator bool 的 std::_Bit_reference 对象,而且效率很低。 • 如果配合用 decltype 和 auto 的话,他们不会正确推导出 bool ,影响我们正常使用模板元编 程。 • 一般认为 vector是 C++ 标准库设计上的一个败笔,是为了向前兼容才保持这样不变的 。 • 他们就不应该直接特化 vector 而是哪怕搞另一个名字,比如 0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与0 码力 | 79 页 | 14.11 MB | 1 年前3
共 13 条
- 1
- 2













