C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming,下一次 CPU 就会总结经验,预判到下 一次应该也是分支 A ,并且把 90% 的流水线用于预先执行分支 A 的剧本, 10% 的流水 线用于预先执行分支 B 。如果预判成功,的确走了分支 A ,那么只会浪费 10% 的算力; 如果预判失败,最后走了分支 B ,那就不得不把预先执行分支 A 的数据全部删了,浪费 90% 的算力。这就是 CPU 的分支预测,根据历史的分支记录总结经验,不断调整两个分 说他存在内存中,随时可 能被改写, CPU 难以预判执行到 call [pointer] 的时候这个指针会指向哪里,无法预取。 • CPU 伺候函数指针的方法和条件跳转一样,也是根据历史记录总结经验,多次执行后 CPU 会根据之前每次跳转的地址推测下一次可能也是同样的地址,并试图预取这个地址。 • 例如:定义一个函数指针 void (*func)(int x); 则对他的调用 (*func)(42);0 码力 | 47 页 | 8.45 MB | 1 年前3
《深入浅出MFC》2/eRusty(枫桥驿站CompBook 版) 深入浅出MFC 我读好几遍了,讲一句实在话,这本书给我的帮助真的很多!毕竟这样深 入挖MFC 运作原理的书难找!要学MFC 又没有Windows SDK 经验者,建议跟 Programming Windows 95 with MFC 一起看,学起MFC 会比较扎实。 若单纯就「买了会不会后悔」来判断一本书到底好不好,这本书我觉得物超所值! 内坜. 元智Richard 这是我所谓的浅出。 本书分为四大篇。第一篇提出学习MFC 程序设计之前的必要基础,包括Windows 程序的 基本观念以及C++ 的高阶议题。「学前基础」是相当主观的认定,不过,基于我个人的学习 经验以及教学经验,我的挑选应该颇具说服力。第二篇介绍Visual C++ 整合环境开发工具。 本篇只不过是提纲挈领而已,并不企图取代Visual C++ 使用手册。然而对于软件使用的老 手,此篇或已足以让您掌握Visual 形状(不管 什么形状)都display 出来」的一般化动作作,这就是个失败的语言。C++ 是成功的,自 然有它的整治方式。 记住,「对象导向」观念是描绘现实世界用的。所以,你可以以真实生活中的经验去思 考程序设计的逻辑。 61 this 指针 刚刚我才说过,两个矩形对象rect1 和rect2 各有自己的m_color 成员变量,但 rect1.setcolor 和rect2.setcolor0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化冷知识:并行地给浮点数组每个元素做一次加法反而更慢。 • 因为一次浮点加法的计算量和访存的超高延迟相比实在太少了。 • 计算太简单,数据量又大,并行只带来了多线程调度的额外开销 。 • 小彭老师经验公式: 1 次浮点读写 ≈ 8 次浮点加法 • 如果矢量化成功( SSE ): 1 次浮点读写 ≈ 32 次浮点加法 • 如果 CPU 有 4 核且矢量化成功: 1 次浮点读写 ≈ 128 次浮点加 RAM read 的时间指的是 读一个缓存行( 64 字节)所花费的时间。 • 根据计算: 125/64*4≈8 • 即从主内存读取一次 float 花费 8 个 cycle , 符合小彭老师的经验公式。 • “right” 和“ wrong” 指的是分支预测是否成功。 多少计算量才算多? • 看右边的 func ,够复杂了吧?也只是勉勉强强超过一 点内存的延迟了,但在 6 个物理核心上并行加速后, cpubound 我们已经仁至义尽地尽量 消除了。 • 如果单单采用手动预取,或者单单采用循环分块,那反而还会变慢。这就是性能调优中的一 大难点:某个改动可能对性能没有效果,甚至反而产生负面效果。然而有经验的优化人员会 知道,这不一定意味着这项改动是错的:有可能要配合多个改动一起上,才能有正面效果。 • 性能优化我们需要尝试所有的排列组合,而不能使用控制变量法,否则无法发现这种组合拳 。 用 stream0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理如果一个类定义了拷贝构造函数或拷贝赋值函数, 那么您必须最好同时定义移动构造函数或移动赋值 函数,否则低效。 三五法则是前人总结的,避免犯错的经验。 只告诉做什么,不告诉为什么,是不深入的。 让我们通过撞南墙的方式来深入理解一下。 更多这样的前人经验可以参考: https://github.com/isocpp/ CppCoreGuidelines 三五法则:拷贝构造函数 • 在 = 时,默认是会拷贝的。比如右边这样:0 码力 | 96 页 | 16.28 MB | 1 年前3
面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭合作创办源伞科技,致力于推动静态 分析技术在企业中的应用 目录 代码质量管理是个大问题 静态分析+代码评审的实践 学习和强调,红线和惩罚,100%的测试 覆盖率,和事后复盘并不够 有经验的程序员也会犯错 对代码提要求很难监督落实 测试更多是验证功能,很难检测编码缺陷 代码的快速变化使质量更难管 生产质量是责任 靠运维和事后复盘善后够吗? 静态分析工具:半智能的代码分析机器人0 码力 | 39 页 | 6.88 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版解算法工作原理和数据结构底层实现。 ‧ 提倡读者互助学习,欢迎大家在评论区提出问题与分享见解,在交流讨论中共同进步。 0.1.1 读者对象 若你是算法初学者,从未接触过算法,或者已经有一些刷题经验,对数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 、体验变好等)。 在工程领域中,大量问题是难以达到最优解的,许多问题只是被“差不多”地解决了。问题的难易程度一方 面取决于问题本身的性质,另一方面也取决于观测问题的人的知识储备。人的知识越完备、经验越多,分析 问题就会越深入,问题就能被解决得更优雅。 17 第 2 章 复杂度分析 Abstract 复杂度分析犹如浩瀚的算法宇宙中的时空向导。 它带领我们在时间与空间这两个维度上深入探索,寻找更优雅的解决方案。 com 348 ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略比较浅显,我们通过一些大概的思考与 尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验与 算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是0 码力 | 379 页 | 18.48 MB | 10 月前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅tbb::static_partitioner 用于循环体不均匀的情况效果不好 tbb::simple_partitioner 用于循环体不均匀的情况效果很好 tbb::affinity_partitioner 记录历史,下次根据经验自动负载均衡 tbb::simple_partitioner 粒度为 1 太细了,效果不好 tbb::static_partitioner 粒度自动变成 n / 4 ,效果好 tbb::simple_partitioner0 码力 | 116 页 | 15.85 MB | 1 年前3
Hello 算法 1.0.0b4 C++版C#, Swift, Zig 等语言。 ‧ 鼓励读者在章节讨论区互帮互助、共同进步,提问与评论通常可在两日内得到回复。 0.1.1. 读者对象 若您是算法初学者,从未接触过算法,或者已经有一些刷题经验,对数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么这本书正是为您量身定制! 如果您已经积累一定刷题量,熟悉大部分题型,那么本书可助您回顾与梳理算法知识体系,仓库源代码可以 被当作“刷题工具库”或“算法字典”来使用。 原因包括: ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略都比较浅显,我们通过一些大概的思考 与尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验 与算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是 ∑ ?=1 ?? 本题目标是求得所有整数因子的最大乘积,即 max( ? ∏ ?=1 ??) 我们需要思考的是:切分数量 ? 应该多大,每个 ?? 应该是多少? 贪心策略确定 根据经验,两个整数的乘积往往比它们的加和更大。假设从 ? 中分出一个因子 2 ,则它们的乘积为 2(? − 2) 。我们将该乘积与 ? 作比较: 2(? − 2) ≥ ? 2? − ? − 4 ≥ 00 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版Rust、C 和 Zig 等语言。 ‧ 鼓励读者在线上章节评论区互帮互助、共同进步,提问与评论通常可在两日内得到回复。 0.1.1 读者对象 若你是算法初学者,从未接触过算法,或者已经有一些刷题经验,对数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 com 348 ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略比较浅显,我们通过一些大概的思考与 尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验与 算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是 ?=1 ?? 本题的目标是求得所有整数因子的最大乘积,即 max( ? ∏ ?=1 ??) 我们需要思考的是:切分数量 ? 应该多大,每个 ?? 应该是多少? 1. 贪心策略确定 根据经验,两个整数的乘积往往比它们的加和更大。假设从 ? 中分出一个因子 2 ,则它们的乘积为 2(? − 2) 。我们将该乘积与 ? 作比较: 2(? − 2) ≥ ? 2? − ? − 4 ≥ 00 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b5 C++版st、Dart、Zig 等 语言。 ‧ 鼓励读者在章节讨论区互帮互助、共同进步,提问与评论通常可在两日内得到回复。 0.1.1 读者对象 若您是算法初学者,从未接触过算法,或者已经有一些刷题经验,对数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么这本书正是为您量身定制! 如果您已经积累一定刷题量,熟悉大部分题型,那么本书可助您回顾与梳理算法知识体系,仓库源代码可以 被当作“刷题工具库”或“算法字典”来使用。 以下原因。 ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略都比较浅显,我们通过一些大概的思考 与尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验 与算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是 ?=1 ?? 本题目标是求得所有整数因子的最大乘积,即 max( ? ∏ ?=1 ??) 我们需要思考的是:切分数量 ? 应该多大,每个 ?? 应该是多少? 1. 贪心策略确定 根据经验,两个整数的乘积往往比它们的加和更大。假设从 ? 中分出一个因子 2 ,则它们的乘积为 2(? − 2) 。我们将该乘积与 ? 作比较: 2(? − 2) ≥ ? 2? − ? − 4 ≥ 00 码力 | 377 页 | 30.69 MB | 1 年前3
共 11 条
- 1
- 2













