C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化从汇编角度看编译器优化 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 缓存机制 8.GPU Linkage Table 的缩 写,即函数链接表。链接器会查找其他 .o 文件中是否定义了 _Z5otheri 这个符号, 如果定义了则把这个 @PLT 替换为他的地 址。 对 PLT 感兴趣?看 https://www.cnblogs.com/pannengzhi/p/2018-04-09-about-got-plt.html 编译器优化: call 变 jmp 多个函数定义在同一个文件中0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针从计算机组成原理看 C 语言指针 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 请问下面这三段代码有什么错误? • float x = -3.14; • printf(“%f\n”, abs(x)); ,对调用者自由度更 高。 • 例子: clGetPlatformIDs , glGetProgramInfo 等专业 API 函数刻在 DNA 里的调用方法 。 错误典型:返回栈上数组的地址 • 看右边这个例子,这是我在一份看起来很 专业的 CFD 代码里看到的,真的泵不住 了。 • int a[1024] 是一个定长数组,是在栈上分 配的。而栈变量的特点是,函数 return 后 就会释放掉,这时返回的指针就是指向一 ASCII 码 • 我们知道 C 语言中的字符常量形如:‘ a’ 表示一个英文字符 a 。实际上 ‘ a’ 等价于 他的 ASCII 码 97 。 • 作为实验,我们可以把 char 设为 97 看 看,会发现结果没有任何不同。 • 这说明 ‘ a’ 只是一个方便程序员理解的写 法,实际上等价于直接写他的 ASCII 码。 字符组成的数组 • 字符组成的数组,就是字符串 • 这里我们在栈上创建了一个长度为0 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming无分支的方法对于乱序和有序的数据一样 高效,性能吊打了传统的分支方法。 • 对于传统分支的做法,为什么排序了的更 高效?既然无分支更高效,我要怎样优化 才能让我的程序变成无分支的呢?那就来 看本期性能优化专题课吧! 分支预测成败对性能的影响 排序为什么对有分支的版本影响那么大 为什么需要流水线 • 为了高效, CPU 的内部其实是一个流水 线 (pipeline) 。流水线的目的是能把原本 • 例如,右边你今天早上的任务清单。 • 请问你这些任务总共需要多少时间? 任务 时间 占用资源 洗脸 5 分钟 眼睛,嘴巴,手 烧开水 10 分钟 煤气灶 刷牙 5 分钟 嘴巴,手 看比站 15 分钟 眼睛 吃饭 30 分钟 嘴巴,手 拉粑粑 20 分钟 屁股 为什么需要流水线 • 一些懒得动脑子的同学可能会脱口而出, 不就是 5 + 10 + 5 + 15 + 30 + 存器来指令解码单元才开始继续工作,很 低效。 任务 时间 占用资源 洗脸 5 分钟 眼睛,嘴巴,手 烧开水 10 分钟 煤气灶 刷牙 5 分钟 嘴巴,手 看比站 15 分钟 眼睛 吃饭 30 分钟 嘴巴,手 拉粑粑 20 分钟 屁股 洗脸 烧开水 刷牙 看比站 吃饭 拉粑粑 5 10 5 15 30 20 为什么需要流水线 • 更高效的办法是,观察每个任务都占用哪些 资源,所占用资源不冲突的可以同时进行,0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU 9 及以上( Linux 用户) CMake 3.12 及以上(跨平台作业) Git 2.x (作业上传到 GitHub ) CUDA Toolkit 10.0 以上( GPU 专题) 从一个案例看 C++ 的历史 • 求一个列表中所有数的和: # 参考资料 - [ 热心观众整理的学习资料 ](https://github.com/jiayaozhang/OpenVDB_and_TBB) - weak_ptr 理解为 shared_ptr 的弱引用。 但 weak_ptr 能提供失效检测,更安全。 智能指针:作为类的成员变量 • 可以在类中使用智能指针作为成员变量。需要根据实际情况 (主要是看所有权),判断要用哪一种智能指针: 1. unique_ptr :当该对象仅仅属于我时。比如:父窗口中指向子 窗口的指针。 2. 原始指针:当该对象不属于我,但他释放前我必然被释放时。 有一定风险。比如:子窗口中指向父窗口的指针。0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU 的这种模式称为静态多态, 和虚函数、抽象类的动态多态相对。 • 静态多态的优点是:性能开销小,存储大小固定。 缺点是:类型固定,不能运行时扩充。 用 variant 不用 visit ,就像看四大 名著不看红楼梦,后面我忘了,总 之就是只能度过一个相对失败的人 生 :) std::visit :还支持多个参数 • 其实还可以有多个 variant 作为参数。 • 相应地 lambda0 码力 | 82 页 | 12.15 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台扫 码 查 看 案 例 细 节 典型案例: Zadig 帮助 平均每周自动部署 1200 次 Zadig 可用性极高,没有 Zadig 集成测试完 全没法做。 —— 字节跳动 SRE 工程师卢肇 兴 解决方案: Gerrit + Zadig 实现机器自动验证 扫 码 查 看 案 例 细 大集群 / 几十个项目 / 上百服务高频交付 “ 我们通过 Zadig 能更快落地标准化、自动化的 CI/CD ,给研发更好的用户体验,高效稳定地完成服务 的构建与发布更新,同时也从公司角度落实降本增效的 理念。” —— 小鹏汽车自动驾驶运维总监 温晓 健 4 条产品线已有 1 条接入验证和迭代端云混合部署和自 测环境拉起能力,足够成熟时将0 码力 | 59 页 | 81.43 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU overhead 。 总结:各种并行模式 • 从串行到并行,从来就没有什么万能膏药。 • CPU 上的并行尚且如此,何况 GPU 。 • 熟悉原理、反复实验,才能优化出好程序。 • 本课仅入门,深入可以看 Pro TBB 这本书。 • 优化重点在于程序的瓶颈部分,不用在小细节上 浪费精力。如果有个 O(n²) 的循环体,则只看他 ,并无视一旁的 O(n) 循环体。 小彭老师锐评时间 比如刚刚例子:并行筛选0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU 在运行物理解算的时候,界面会卡住,算完一帧后窗口才能刷新一遍 ,导致解算过程中基本别想做事,这一定程度上归功于 opengl 原始的单线程设计。 • 正面教材: zeno 可以在解算过程中,随时拖动滑块看前几帧的结果,编辑场景图,修改 节点间的连接,为下一次解算做准备,同时当前已经启动的物理解算还能在后台继续正常 运行。虽然 zeno 也用了 opengl ,但他用多进程成功在 opengl 的百般拖后腿下实现了0 码力 | 79 页 | 14.11 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器写入用 [] • 很多同学会困惑,为什么要设计两套, C++ 他爸是精神分裂症吗? • 恰恰相反, C++ 是中两个函数不论读写都一视同仁: at 总是抛出异常, [] 总是默默创建 。 • 这么看 Python 才是精分:同一个 [] 函数在读取的时候抛出异常,写入的时候又默默创建 。 • 例如:一个同学问小彭老师在干嘛? • 小彭老师说“我在吃答辩。”那么同学认为这个答辩指的是三体动画,小彭老师在看三体动画。 flag 先忽略,就当他是普通的平衡二叉树好了。 • 注意看,这颗二叉树是有规律的。 • 首先看根节点 5 ,他的左子节点是 2 ,右子节点是 8 。 2 < 5 < 8 。 • 满足:左子节点 < 父节点 < 右子节点 2 set 查找为什么高效 1 4 5 8 7 2 set 查找为什么高效 • 注意看,这颗二叉树是有规律的。 • 再看看节点 2 ,他的左子节点是 ,他的左子节点是 1 ,右子节点是 4 。 1 < 2 < 4 。 • 满足:左子节点 < 父节点 < 右子节点 1 4 5 8 7 2 set 查找为什么高效 • 注意看,这颗二叉树是有规律的。 • 再看看节点 8 ,他的左子节点是 7 ,没有右子节点。 7 < 8 。 • 满足:左子节点 < 父节点 1 4 5 8 7 2 set 查找为什么高效 • 这就是二叉排序树的构建规则。0 码力 | 90 页 | 8.76 MB | 1 年前3
共 17 条
- 1
- 2













