C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅3.jpg)  # TBB 开启的并行编程之旅 by 彭于斌 (@archibate) 往期录播:https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码:https://github [Image](/uploads/documents/1/0/0/5/10051dd97d247e9f7a97909b93f2890b/p1_8.jpg) ## 高性能并行编程与优化 - 课程大纲 • 分为前半段和后半段,前半段主要介绍现代 C++,后半段主要介绍并行编程与优化。 1. 课程安排与开发环境搭建:cmake 与 git 入门 2. 现代 C++ 入门:常用 STL 容器,RAII 内存管理 3 编译器如何自动优化:从汇编角度看 C++ 5. C++11 起的多线程编程:从 mutex 到无锁并行 6. 并行编程常用框架:OpenMP 与 Intel TBB 7. 被忽视的访存优化:内存带宽与 cpu 缓存机制 8. GPU 专题:wrap 调度,共享内存,barrier 9. 并行算法实战:reduce,scan,矩阵乘法等 10. 存储大规模三维数据的关键:稀疏数据结构 110 码力 | 116 页 | 15.85 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming # 性能优化之无分支编程  Branchless Programming by uppercase,对于排序过的数据明显比乱序时高效。 - 无分支的方法对于乱序和有序的数据一样高效,性能吊打了传统的分支方法。 - 对于传统分支的做法,为什么排序了的更高效?既然无分支更高效,我要怎样优化才能让我的程序变成无分支的呢?那就来看本期性能优化专题课吧! ## 分支预测成败对性能的影响 ||Nanoseconds (ns)|Microseconds (μs)|Milliseconds hours, 40 mins| ## 排序为什么对有分支的版本影响那么大 ## 为什么需要流水线 - 为了高效,CPU 的内部其实是一个流水线 (pipeline)。流水线的目的是能把原本串行的一系列指令并行化。为了理解为什么需要流水线,我们先反过来,假设没有流水线,会有什么坏处。 例如,右边你今天早上的任务清单。 • 请问你这些任务总共需要多少时间? |任务|时间|占用资源| |---|---|---|0 码力 | 47 页 | 8.45 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器first; • V &v = tmp.second; ## map 的遍历:不修改也建议加引用 • 其实,就算遍历时不修改,还是建议加引用,在 K 和 V 类型尺寸很大时,可以节省性能。 - 因为引用最多只有 8 字节(指针的大小),而他指向的 V 可能是非常大的(比如 string 类型在栈上的空间就要消耗 32 字节,更不用说可能堆上还有),深拷贝一下要花费不少时间。 • d971de6ee1/p48_1.jpg) (深拷贝,浪费时间) ## map 的遍历:不修改也建议加引用 • 其实,就算遍历时不修改,还是建议加引用,在 K 和 V 类型尺寸很大时,可以节省性能。 - 因为引用最多只有 8 字节(指针的大小),而他指向的 V 可能是非常大的(比如 string 类型在栈上的空间就要消耗 32 字节,更不用说可能堆上还有),深拷贝一下要花费不少时间。 •0 码力 | 90 页 | 8.76 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南build 目录 • 切换到 build 目录 • 在 build 目录运行 cmake < 源码目录> 生成 Makefile - 执行本地的构建系统 make 真正开始构建(4 进程并行) - 让本地的构建系统执行安装步骤 回到源码目录 ## 现代 CMake 提供了更方便的 -B 和 --build 指令,不同平台,统一命令! • cmake -B build // 在源码目录用 2019 生成器;MacOS 系统默认是 Xcode 生成器。 - 可以用 -G 参数改用别的生成器,例如 cmake -GNinja 会生成 Ninja 这个构建系统的构建规则。Ninja 是一个高性能,跨平台的构建系统,Linux、Windows、MacOS 上都可以用。 - Ninja 可以从包管理器里安装,没有包管理器的 Windows 可以用 Python 的包管理器安装: • pip Ninja 则是专为性能优化的 cmake -GNinja -B build 合都是行业标准了。 bate@archer ~/Codes/course/11/template (master) $ ls build build.ninja CMakeCache.txt CMakeFiles cmake_install.cmake Ninja 和 Makefile 简单的对 性能上:Ninja >0 码力 | 166 页 | 6.54 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程/6be70db418434c4b3ebda53c2593beaa/p8_1.jpg) ## 声明为内联函数 - 注意,inline 在现代 C++ 中的效果是声明一个函数为 weak 符号,和性能优化意义上的内联无关。 • 优化意义上的内联指把函数体直接放到调用者那里去。 - 因此 CUDA 编译器提供了一个“私货”关键字:___inline___ 来声明一个函数为内联。不论是 CPU 函数还是 3\gg> $ 试试看。 你会看到 Hello, world! 打印了三遍! - 原来,三重尖括号里的第二个参数决定着启动 kernel 时所用 GPU 的线程数量。 - GPU 是为并行而生的,可以开启很大数量的线程,用于处理大吞吐量的数据。 。 - 而 sine 这种内部需要泰勒展开来计算,每次迭代计算量很大的循环体,并行才有较好的加速效果。称为计算瓶颈(cpu-bound)。 |Ben } } BENCHMARK(BM_parallel_sine); ## 浮点加法的计算量 - 冷知识:并行地给浮点数组每个元素做一次加法反而更慢。 因为一次浮点加法的计算量和访存的超高延迟相比实在太少了。 • 计算太简单,数据量又大,并行只带来了多线程调度的额外开销。 • 小彭老师经验公式:1 次浮点读写 ☐ 8 次浮点加法 - 如果矢量化成功(SSE):1 次浮点读写 invalidation)|10K - 1M| |Disk read|400K+| ## 多少计算量才算多? - 看右边的 func,够复杂了吧?也只是勉勉强强超过一点内存的延迟了,但在 6 个物理核心上并行加速后,还是变成 mem-bound 了。 • 加速比:1.36 倍 • 应该达到 6 倍(物理核心数量)才算理想加速比。 |Benchmark|Time|CPU|Iterations| |---|---|---|---|0 码力 | 147 页 | 18.88 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起[Image](/uploads/documents/b/9/2/9/b92965fc278f6399099ce51dd8119d4d/p1_2.jpg) ## 高性能并行编程与优化 - 课程大纲 • 分为前半段和后半段,前半段主要介绍现代 C++,后半段主要介绍并行编程与优化。 1. 课程安排与开发环境搭建:cmake 与 git 入门 2. 现代 C++ 入门:常用 STL 容器,RAII 内存管理 3 编译器如何自动优化:从汇编角度看 C++ 5. C++11 起的多线程编程:从 mutex 到无锁并行 6. 并行编程常用框架:OpenMP 与 Intel TBB 7. 被忽视的访存优化:内存带宽与 cpu 缓存机制 8. GPU 专题:wrap 调度,共享内存,barrier 9. 并行算法实战:reduce,scan,矩阵乘法等 10. 存储大规模三维数据的关键:稀疏数据结构 11 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 ## 硬件要求: 64 位(32 位时代过去了) 至少 2 核 4 线程(并行课...) 英伟达家显卡(GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户 ) GCC 9 及以上(Linux 用户) CMake 3.12 及以上(跨平台作业)0 码力 | 32 页 | 11.40 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程com/video/BV1fa411r7zp 课程 PPT 和代码:https://github.com/parallel101/course ## 高性能并行编程与优化 - 课程大纲 • 分为前半段和后半段,前半段主要介绍现代 C++,后半段主要介绍并行编程与优化。 1. 课程安排与开发环境搭建:cmake 与 git 入门 2. 现代 C++ 入门:常用 STL 容器,RAII 内存管理 3 编译器如何自动优化:从汇编角度看 C++ 5. C++11 起的多线程编程:从 mutex 到无锁并行 6. 并行编程常用框架:OpenMP 与 Intel TBB 7. 被忽视的访存优化:内存带宽与 cpu 缓存机制 8. GPU 专题:wrap 调度,共享内存,barrier 9. 并行算法实战:reduce,scan,矩阵乘法等 10. 存储大规模三维数据的关键:稀疏数据结构 11 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 ## 硬件要求: 64 位(32 位时代过去了) 至少 2 核 4 线程(并行课...) 英伟达家显卡(GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户 ) GCC 9 及以上(Linux 用户) CMake 3.12 及以上(跨平台作业)0 码力 | 82 页 | 12.15 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理bilibili.com/263032155 PPT 和代码:https://github.com/parallel101/course ## 高性能并行编程与优化 - 课程大纲 • 分为前半段和后半段,前半段主要介绍现代 C++,后半段主要介绍并行编程与优化。 1. 课程安排与开发环境搭建:cmake 与 git 入门 2. 现代 C++ 入门:常用 STL 容器,RAII 内存管理 3 编译器如何自动优化:从汇编角度看 C++ 5. C++11 起的多线程编程:从 mutex 到无锁并行 6. 并行编程常用框架:OpenMP 与 Intel TBB 7. 被忽视的访存优化:内存带宽与 cpu 缓存机制 8. GPU 专题:wrap 调度,共享内存,barrier 9. 并行算法实战:reduce,scan,矩阵乘法等 10. 存储大规模三维数据的关键:稀疏数据结构 11 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 ## 硬件要求: 64 位(32 位时代过去了) 至少 2 核 4 线程(并行课...) 英伟达家显卡(GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户 ) GCC 9 及以上(Linux 用户) CMake 3.12 及以上(跨平台作业)0 码力 | 96 页 | 16.28 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践拷贝构造函数)。 - 我们的目的是让基类能调用派生类的函数,其实本来是可以通过虚函数的,但是: • 1. 虚函数是运行时确定的,有一定的性能损失。 • 2. 拷贝构造函数无法作为虚函数。 - 这就构成了 CRTP 的两大常见用法: • 1. 更高性能地实现多态。 • 2. 伺候一些无法定义为虚函数的函数,比如拷贝构造,拷贝赋值等。 https://www.jianshu.com/p/0 码力 | 54 页 | 3.94 MB | 2 年前3
共 1000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 100













