NoService 库0 码力 | 1 页 | 76.00 B | 6 月前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理分为前半段和后半段,前半段主要介绍现代 C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP ](https://git-scm.com/doc) - [GitHub 官方文档 ](https://docs.github.com/en) 古代: C 语言 近代: C++98 引入 STL 容器库 近现代: C++11 引入了 {} 初始化表达式 近现代: C++11 引入了 range-based for-loop 如果想使用 for_each 这个算法模板呢? 我知道可以用 accumulate )和生成器( generator ) 未来: C++20 标准库加入 format 支持 跑远了! • 鉴于 C++20 还没有普遍落地(例如 CMake 不支持 C++20 modules )因此我们的课程 基于 C++17 标准,有时会谈到 C++20 作为扩展阅读。 C++ 有哪些面向对象思想? C++ 思想:封装 比如要表达一个数组,需要:起始地址指针 v ,数组大小 nv 将多个逻辑上相关的变量包装成一个类0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南现代 CMake 模块化项目管理指南 彭于斌( @archibate ) 课件 & 源码: https://github.com/parallel101/course 往期录播: https://space.bilibili.com/263032155 找不到头文 件怎么办呀 CMake Cookbook 小彭老师建议 : ~~-·~·~-·~ -~·-·~·- 第一章:文件 / 就干净许多,只是创建了 biology 这个静态库对象,并通过 GLOB_RECRUSE 为他批量添加 了所有位于 src 和 include 下源码和头文件。 • 根项目的 CMakeLists.txt 负责处理全局有效的设定。而子 项目的 CMakeLists.txt 则仅考虑该子项目自身的设定,比 如他的头文件目录,要链接的库等等。 四、子项目的头文件 • 这里我们给 biology • 在声明和定义外面都套一层名字空间,例如此处我的子项目名是 biology ,那 我就 biology::Animal 。避免暴露全局的 Animal 。这是因为万一有个“不拘一 格”的第三方库也暴露个全局的 Animal ,两个符号就会发生冲突,由于类符号 都具有 weak 属性,链接器会随机选择一个覆盖掉,非常危险! • (关于符号的 weak 属性,以后单独开一门 C++ 课讲讲,这一课还是重点关注0 码力 | 56 页 | 6.87 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. 你所不知道的 lambda 表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 set 和 vector 的区别 • 都是能存储一连串数据的容器 。 • 区别 1 : set 会自动给其中的 元素从小到大排序,而 vector 会保持插入时的顺序。 • 拟出来的 + n 复杂度为 O(n) 。虽然低效,但至少可 以用了。 std::next 等价于 + • 但是这样手写三个 ++ 太麻烦了 ,而且是就地操作,会改变迭代 器本身。 • 因此标准库提供了 std::next 函 数,他的内部实现相当于这样: • 没错,他会自动判断迭代器是否 支持 + 运算,如果不支持,会 改为比较低效的调用 n 次 ++ 。 std::advance 等价于0 码力 | 83 页 | 10.23 MB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 第 5 章智能指针与内存管理 52 5.1 RAII 与引用计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 还为自身的标准库增加了非常多的工具和方法,诸如在语言自身标准的层面上制定了 std::thread,从而支持了并发编程,在不同平台上不再依赖于系统底层的 API,实现了语言层面的跨 平台支持;std::regex 提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功 的『范型』,而现代 C++ 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的 语言。Concept 在学习现代 C++ 之前,我们先了解一下从 C++11 开始,被弃用的主要特性: 注意:弃用并非彻底不能用,只是用于暗示程序员这些特性将从未来的标准中消失,应该尽 量避免使用。但是,已弃用的特性依然是标准库的一部分,并且出于兼容性的考虑,大部分 特性其实会『永久』保留。 • 不再允许字符串字面值常量赋值给一个 char *。如果需要用字符串字面值常量赋值和初始化一个 char *,应该使用 const0 码力 | 83 页 | 2.42 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅分为前半段和后半段,前半段主要介绍现代 C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 图像。总共只花了 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 启动多个 任务,一个负责下载,一个负责和用户交 互。并在主线程中等待该任务组里的任务 全部执行完毕。 • 区别在于,一个任务不一定对应一个线程0 码力 | 116 页 | 15.85 MB | 1 年前3
《深入浅出MFC》2/e还有,当然,您的深入浅出MFC! v 印尼. 雅加达robin.hood@ibm.net 对您的书总是捧读再三,即使翻烂了也值得。这本深入浅出MFC,不但具有学习价值, 亦极具参考价值。 我买您的第一本书,好象是「内存管理与多任务」。还记得当时热中突破640KB 内存, 发现该书如获至宝。数月前购买了深入浅出MFC,并利用闲暇时间翻阅学习(包括如厕 时间... )。 我的学习曲线比较不同,我比较倾向于了解事情的因,而不是该如何做事情。比方说,「应 正是人类的本能,空出更多的脑力心力与精力,追求更新的事物。 但是,作为信息教育体系一员的我,不能不有version control。事实上我亦从来没有忘记初学 MFC 的痛苦:C++ 语言本身的技术问题是其一,MFC 庞大类别库的命名规则是其二,熟知 的Windows 程序基本动作统统不见了是其三,对象导向的观念与application framework 的 包装是其四。初学MFC programming 时,我的脑袋犹如网目过大的筛子,什么东西都留不住; Menu 編輯器 / 301 Accelerator 編輯器 / 303 Dialog 編輯器 / 304 * Console 程式的專案管理 / 305 第㆔篇 淺出 MFC 程式設計 / 309 第5章 總觀 Application Framework / 311 什麼是 Application Framework0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vectorhttps://github.com/parallel101/course C++ 标准库五大件:容器( container ) C++ 标准库五大件:迭代器( iterator ) C++ 标准库五大件:算法( algorithm ) C++ 标准库五大件:仿函数( functor ) C++ 标准库五大件:分配器( allocator ) 侯捷 STL 侯捷 STL vector 释放了,更安 全。 https://github.com/zenustech/zeno/blob/master/zenovis/src/Scene.cpp vector 容器:生命周期由主对象管理 • C++ 中哪个运算符是最强的?我觉得是 } • 因为 } 标志着一个语句块的结束,在这里,他 会调用所有身处其中的对象的解构函数。比如 这里的 vector ,他的解构函数会释放动态数组 都会失效。 因此如果你是在语句块内获取的 data() 指针, 语句块外就无法访问了。 • 可见 data() 指针是对 vector 的一种引用,实 际对象生命周期仍由 vector 类本身管理。 vector 容器:延续生命周期 • 如果需要在一个语句块外仍然保持 data() 对 数组的弱引用有效,可以把语句块内的 vector 对象移动到外面的一个 vector 对象 上。0 码力 | 90 页 | 4.93 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 ,没有类型区分,导致很容易弄错单位,混淆时间点和时间段。 • 比如 t0 * 3 ,乘法对时间点而言根本是个无意义的计算,然而 C 语言把他们看做一样的 long 类型,从而容易让程序员犯错。 C++11 引入的时间标准库: std::chrono • 利用 C++ 强类型的特点,明确区分时间点与时间段,明确区分不同的时间单位。 • 时间点例子: 2022 年 1 月 8 日 13 点 07 分 10 秒 • 时间段例子: 类的成员函数 join() 来等待该进程结束。 std::thread 的解构函数会销毁线程 • 作为一个 C++ 类, std::thread 同样遵循 RAII 思想和三五法则:因为管理着资源, 他自定义了解构函数,删除了拷贝构造 / 赋 值函数,但是提供了移动构造 / 赋值函数。 • 因此,当 t1 所在的函数退出时,就会调用 std::thread 的解构函数,这会销毁0 码力 | 79 页 | 14.11 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型hash().pointer(11).dense(8) 。 封装起来,方便多层解耦 封装起来,方便多层解耦 封装起来,方便多层解耦 封装起来,方便多层解耦 封装起来,方便多层解耦 • 这样就封装好了,通过模板的方式实现了 自定义的稀疏数据结构: • hash().pointer(11).dense(8) 开源的体素处理库: OpenVDB • OpenVDB 的稀疏体积,可以存储符号距 bits |= 1 << n; • 可以设置 bits 的第 n 位为 1 。 • bits |= 0 << n; • 则没有任何改变。 std::vector:标准库帮你实现好了 • 其实标准库的 vector 是一个特化的版本 ,他会自动像刚刚说的把值看做 1bit ,然后八个 合并成一个 int8_t 。 • 不过效率比我们手写的低很多…… 不推荐使用 对象,而且效率很低。 • 如果配合用 decltype 和 auto 的话,他们不会正确推导出 bool ,影响我们正常使用模板元编 程。 • 一般认为 vector 是 C++ 标准库设计上的一个败笔,是为了向前兼容才保持这样不变的 。 • 他们就不应该直接特化 vector 而是哪怕搞另一个名字,比如 std::bit_vector 之类的都好 。 • 包括他的 0 码力 | 102 页 | 9.50 MB | 1 年前3
共 30 条
- 1
- 2
- 3













