C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化x64 架构下的寄存器模型 通用寄存器: 32 位时代 • 32 位 x86 架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp • 其中 esp 是堆栈指针寄存器,和函数的调用与返回相关。 • 其中 eax 是用于保存返回值的寄存器。 通用寄存器: 64 位时代 • 64 位 x86 架构中的通用寄存器有: • rax, rcx 4 = 0 ,从而不会生成边界特判的分支 。 假定指针是 16 字节对齐的: assume_aligned 如果能保证指针 a 总是对齐到 16 字节,在 GCC 编译器中这样 写: 但这样不通用,因此 C++20 引入了标准化的 std::assume_aligned : movups 变成了 movaps 对齐的读写可能 带来微乎其微的 性能提升…… 数组求和: reduction 的优化0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起-j )。 3. 用通配符批量生成构建规则,避免针对每个 .cpp 和 .o 重复写 g++ 命令( %.o: %.cpp )。 • 但坏处也很明显: 1. make 在 Unix 类系统上是通用的,但在 Windows 则不然。 2. 需要准确地指明每个项目之间的依赖关系,有头文件时特别头疼。 3. make 的语法非常简单,不像 shell 或 python 可以做很多判断等。 4 g++ 准备的参数可能对 MSVC 不适用。 构建系统的构建系统( CMake ) • 为了解决 make 的以上问题,跨平台的 CMake 应运而生! • make 在 Unix 类系统上是通用的,但在 Windows 则不然。 • 只需要写一份 CMakeLists.txt ,他就能够在调用时生成当前系统所支持的构建系统。 • 需要准确地指明每个项目之间的依赖关系,有头文件时特别头疼。0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming10 = 32 + 10 = 32 。 • 这样一来就和原来带 if-else 的版本的效果完全一样,但是取缔了分支,更高效。 • 我称之为“妙用加减乘”优化法。 “ 妙用加减乘”进行无分支优化的通用公式 • 因此我们总结规律得出: • if (cond) return a; • else return b; • 可以被优化成: • a + (cond) * (b - a) • 三目运算符通常会变成和 if-else 一样的分 支,同样会生成条件跳转指令,理应一样 低效。但是有时候编译器会检测到,可以 帮你自动优化成无分支版本的。 “ 妙用加减乘”进行无分支优化的通用公式 • 我比较喜欢方法 2 ,因为他可以很直观地同样适用于多个分支的情况,例如: • if (x < 0) return 0; • else if (x > 255) return 1; •0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南5/Qt5Config.cmake • 伺候这种非常规安装,就需要设置变量 -DQt5_DIR=/opt/myqtroot/lib/cmake/Qt5 了。 科普:亲 Unix 软件从源码安装的通用套路 • Makefile 构建系统: • ./configure --prefix=/usr --with-some-options # 生成 Makefile (这个 configure 也有的软件不拘一格(例如我们的 zeno ),索性用发布的日期作为版本号的三个数字, 例如 2022.11.2 。不论采用哪种编号方案,都是几个用点分开的数字,并且数字越大越新 ,且优先比较靠前面的数字。因此为了通用, CMake 支持最多四个点分开的版本号:. . . 。并且如果你写 0.6.8 他会自动帮你把多余的 tweak 默认为 0 ,也就是说 0 0 码力 | 56 页 | 6.87 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 的指针里就会编译出错,例如右图的 vector(这是游戏引擎中很常见的用法)。 正确解法:额外定义一个 clone 作为纯虚函数,然后让猫和狗分别实现他 clone 的调用 • 这样一来,我们通用的 eatTwice 函数里 只需调用 obj->clone() ,就等价于调用了 相应的猫或是狗的 make_shared (*obj) ,这就实现了拷 贝的多态。 如何批量定义 0 码力 | 54 页 | 3.94 MB | 1 年前3
Zadig 产品使用手册和最佳实践,基于平台工程打造,可以轻松连 接一切工具链 企业自建 DevOps 流程平台 围绕 Jenkins 或 CI/CD 工具 搭建流程串接胶水平台 局限性大扩展性差 内部推广难度极高 做完后价值难被证明 通用性、可扩展性、技术先进性强,可以灵活 广泛接入各种技术和业务场景 基于代码管理的 DevOps 方案 Gitee 平台 GitLab 平台 局限性大、全流程安全性低 维护成本高 支持多个服务并行构建部署、产品级发布,可0 码力 | 52 页 | 22.95 MB | 1 年前3
谈谈MYSQL那点事互联网常用数据库市场占有率 互联网通用架构体制 谈谈 MySQL 数据库那些事 MySQL MySQL 基本介绍 基本介绍 MySQL MySQL 优化方式 优化方式 MySQL MySQL 技巧分享 技巧分享 Q Q & & AA MyISAM MyISAM 特点 特点 MyISAM vs MyISAM vs InnoDB InnoDB • 数据存储方式简单,使用0 码力 | 38 页 | 2.04 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台升级,工程师一线体验优化 推出效能看板,实时客观度量工程数据指标 效 率 优 化 、 开 发 者 体 验 增 强 2023 年 面向生态伙伴开放场景 面向开发者提供 IDE 插件 / 自测环境 通用工作流广泛链接生态赋能开发者 企业解决方案和最佳实践内置 发布 AI 增强解决方案 企 业 开 放 性 、 A I 能 力 增 强 产品发展历程 高频极速迭代: Zadig 开源0 码力 | 59 页 | 81.43 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器C++ 之父觉得排序很好玩所以才排的? 1 4 5 8 7 排序增好玩 排序增好玩 小 大 2 set 查找为什么高效 • 可以证明,只要保证这个树是排序的,那么快速查找到任意一个数的通用规则是: • 设要找的数为 X ,则 set.find(X) 首先从根节点开始寻找。 • 若 X == 当前节点,则这个节点就是我要找的,返回指向该节点的迭代器; • 若 X < 当前节点,则移动左子节点,继续重复以上步骤;0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南\(x86\)\\Microsoft\ Visual\ Studio\\2019\\ 怎么路径里动不动夹杂几个转移符、空格、特殊符号?这谁顶得住啊 。 高情商: Windows 是最适合练习你 C 语言转移符使用水平的地方 。 更通用的方式: find_package 更好的做法是用 CMake 的 find_package 命令。 find_package(TBB REQUIRED) 会查找 /usr/lib/cmake/TBB/TBBConfig0 码力 | 166 页 | 6.54 MB | 1 年前3
共 12 条
- 1
- 2













