C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战边界条件:仅在第一层额外判断边界条件 进一步改进 VDB 导出:支持导出多个网格,并指定名称 进一步改进 VDB 导出: P-IMPL 模式 进一步改进 VDB 导出: F-IMPL 模式 Blender 渲染结果 改进 改进边界条件:外部边界流出而不是反弹,内部边界可以流出速度 Blender 中调整一下材质 Blender 中调整一下材质 改进对流:让烟雾随时间逐渐褪色 改进对流:让烟雾随时间逐渐褪色 改进对流:让烟雾随时间逐渐褪色 改进褪色:不是褪色 density ,而是褪色 temperature 改进褪色:不是褪色 density ,而是褪色 temperature 改进褪色:不是单纯地乘以 decayRate ,还和周围环境温度求平均值 改进温度:高温气体往上浮(作为外力来看待) 结果:更像火焰了 改进颜色场:让 clr 作为尘埃密度,密度越高越有向下坠落的趋势 问题:上面的尘埃无止境的飘下来 解决:纹理对象指定为 解决:纹理对象指定为 cudaAddressModeBorder 让越界访问自动变 0 即可 结果:小球加回来 改进温度:只有达到一定温度才会上升,否则(视为冷空气)下降 改进褪色:尘埃密度也会褪色0 码力 | 58 页 | 14.90 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅,其中 n 是元素个数 改进的并行缩并( GPU ) • 刚才那种方式对 c 比较大的情况不友好, 最后一个串行的 for 还是会消耗很多时间 。 • 因此可以用递归的模式,每次只使数据缩 小一半,这样基本每次都可以看做并行的 for ,只需 log2(n) 次并行 for 即可完成 缩并。 • 这种常用于核心数量很多,比如 GPU 上 的缩并。 结论:改进后的并行缩并的时间复杂度为 ,工作复杂度为 O(n+c) ,其中 n 是元素个数 改进的并行扫描( GPU ) 第一步、 4 个线程,每个处理 2 个元素的扫描,花了 1 秒 第而步、 4 个线程,每个处理 2 个元素的扫描,花了 1 秒 第三步、 4 个线程,每个处理 2 个元素的扫描,花了 1 秒 用电量: 3*4=12 度电 总用时: 1*3=3 秒 结论:改进后的并行扫描的时间复杂度为 O(logn) ,工作复杂度为 并行快速排序 (和刚刚手写的快速排序)加速比: 2.05 倍 改进:数据足够小时,开始用标准库串行的排序 (和标准库串行的 std::sort )加速比: 4.59 倍 封装好了: tbb::parallel_sort (和标准库串行的 std::sort )加速比: 4.80 倍 重新认识改进的并行缩并 • 其实之前提到“改进后的并行缩并”,也是一 种分治法的思想:大问题一分为二变成小0 码力 | 116 页 | 15.85 MB | 1 年前3
面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭静态分析工具:半智能的代码分析机器人 静态分析辅助代码评审 自动化工具+流程才是未来 Bug! Thx! Bug! 投入大 KPI不痛不痒 使用主体和责任主体不一致 一步登天想要终极AI 代码质量改进工具、流程落地难 Bug! No Thx! DevOps: 代码质量责任应该左移 设计 代码 开发 代码 评审 入库 测试 发布 1. 非研发人员主导,沟通成本高,推动修复周期长 使用了定理证明器求解可 行路径(精确,耗时) • 能跨函数分析 • 能处理指针 使用有深度的代码分析器 做到快速和准确 用尽量少机器完成一天几千次分析 每次分析10分钟要能结束 控制误报并建立反馈和改进机制 挑战:超大规模代码仓库 项目平均40分钟单机编译时间 项目平均编译代码量超百万行 编译的价值 C/C++代码逻辑受编 译参数深度控制 源代码索引和统计 提升开源静态分析工 具分析质量 如何做到10分钟反馈分析结果 系统地改进分析时间 编译流程 分析流程 依赖关系分析 分布式 编译 分布式 分析 分布式链接 跨模块分析 报告整合 缓存 缓存 缓存 缓存 硬核玩家:从理论上改进静态分析能力 PLDI 2018: 去掉路径 遍历分析中的冗余 ICSE 2019:路径遍历内 存泄漏分析的多项式算法 需求2:误报率要低 方法1: 数据驱动的改进循环 降低 误报率0 码力 | 39 页 | 6.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南mylib.cpp 里的 say_hello 函数 改进: mylib 作为一个静态库 改进: mylib 作为一个动态库 改进: mylib 作为一个对象库 https://www.scivision.dev/cmake-object-libraries/ 对象库类似于静态库,但不生成 .a 文件,只由 CMake 记住该库生成了哪些对象文件 改进: mylib 作为一个对象库 https://www0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化nx*nblur 需要缓存: blockSize*nx*nblur 改进:只对 X 循环做分块 BM_y_blur_tiled BM_y_blur_tiled_only_x 因此,可以只对 X 循环分块,并且把外 层改成 XY 序,形成 XYx 序。 需要缓存: blockSize*nx*nblur 需要缓存: blockSize*nblur 改进:只对 X 循环做分块 • 反而变慢了,是怎么回事?0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 是一个模板类,则 CRTP 的那个参数应包含派生类的模板参数,例 如: • template• struct Derived : Base > {}; CRTP 的改进:如果基类还想基于另一个类 • 现在我们的需求有变,需要新增一个“超狗 (superdog)” 类,他继承自普通狗 (dog) 。 • 这时我们可以给 IObjectClone 新增一个模板参数 0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化ivdep C/C++ 的缺点:指针的自由度过高,允许多个 immutable reference 指向同一个对象,而 Rust 从语法层面禁止,从而让编译器放心大胆 优化。 为什么标准委员会不改进一下?因为一旦放弃 兼容,就等于抛弃所有历史遗产的全新语言, 就和 Rust 无异,从而没有任何理由再学习 C++ 。 std::vector :也能实现 SOA ! 优化前 (AOS) 优化后0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针的)就需要起始地址和数组长度两个,才能确定 下来,也就是 char * 和 int 两个。 • 所以要把动态数组的引用传给函数,需要有两个 参数,一个指针加一个长度。 使用 const 修饰指针指向的值 • 改进: printarr 没有修改 a 数组里的元素,因此 是只读的访问,可以改成 const char* a 。 • 标记 const 的好处是,让调用者清楚哪些函数有 副作用(会修改数组),哪些是只读的。0 码力 | 128 页 | 2.95 MB | 1 年前3
Hello 算法 1.0.0b4 C++版元素作为基准数。然而,如果运气不佳,每次都选到不理想的基准数,效率仍然不尽如人意。 需要注意的是,编程语言通常生成的是“伪随机数”。如果我们针对伪随机数序列构建一个特定的测试样例, 那么快速排序的效率仍然可能劣化。 为了进一步改进,我们可以在数组中选取三个候选元素(通常为数组的首、尾、中点元素),并将这三个候选 元素的中位数作为基准数。这样一来,基准数“既不太小也不太大”的概率将大幅提升。当然,我们还可以 选取更多候选元0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版元素作为基准数。然而,如果运气不佳,每次都选到不理想的基准数,效率仍然不尽如人意。 需要注意的是,编程语言通常生成的是“伪随机数”。如果我们针对伪随机数序列构建一个特定的测试样例, 那么快速排序的效率仍然可能劣化。 为了进一步改进,我们可以在数组中选取三个候选元素(通常为数组的首、尾、中点元素),并将这三个候选 元素的中位数作为基准数。这样一来,基准数“既不太小也不太大”的概率将大幅提升。当然,我们还可以 选取更多候选元0 码力 | 379 页 | 18.47 MB | 1 年前3
共 14 条
- 1
- 2













