C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南// 调用本地的构建系统执行 install 这个目标,即安 装 -D 选项:指定配置变量(又称缓存变量) • 可见 CMake 项目的构建分为两步: • 第一步是 cmake -B build ,称为配置阶段( configure ),这时只检测环境并生成构建规则 • 会在 build 目录下生成本地构建系统能识别的项目文件( Makefile 则是专为性能优化的构建系统,他和 CMake 结合都是行业标准了。 Ninja 和 Makefile 简单的对比 性能上: Ninja > Makefile > MSBuild Makefile 启动时会把每个文件都检测一遍, 浪费很多时间。特别是有很多文件,但是实 际需要构建的只有一小部分,从而是 I/O Bound 的时候, Ninja 的速度提升就很明 显。 然而某些专利公司的 CUDA toolkit 在 MSBuild 构建,不能 用 Ninja (怕不是和 Bill Gates 有什么交 易) 第 1 章:添加源文件 一个 .cpp 源文件用于测试 CMake 中添加一个可执行文件作为构建目标 另一种方式:先创建目标,稍后再添加源文件 如果有多个源文件呢? 逐个添加即可 使用变量来存储 建议把头文件也加上,这样在 VS 里可以出现在“ Header Files” 一栏 使用 GLOB 自动0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起则不然。 • 只需要写一份 CMakeLists.txt ,他就能够在调用时生成当前系统所支持的构建系统。 • 需要准确地指明每个项目之间的依赖关系,有头文件时特别头疼。 • CMake 可以自动检测源文件和头文件之间的依赖关系,导出到 Makefile 里。 • make 的语法非常简单,不像 shell 或 python 可以做很多判断等。 • CMake 具有相对高级的语法,内置的函数能够处理 具有相对高级的语法,内置的函数能够处理 configure , install 等常见需求。 • 不同的编译器有不同的 flag 规则,为 g++ 准备的参数可能对 MSVC 不适用。 • CMake 可以自动检测当前的编译器,需要添加哪些 flag 。比如 OpenMP ,只需要在 CMakeLists.txt 中指明 target_link_libraries(a.out OpenMP::OpenMP_CXX) 即可。 录。 • 此外,如果不希望让引用 hellolib 的可执行文件自动添加这个路径,把 PUBLIC 改成 PRIVATE 即可。这就是他们的用途:决定一个属性要不要在被 link 的时候传播。 目标的一些其他选项 • 除了头文件搜索目录以外,还有这些选项, PUBLIC 和 PRIVATE 对他们同理: • target_include_directories(myapp PUBLIC /usr/include/eigen3)0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector为了防止不小心越界,可以用 a.at(i) 替代 a[i] , at 函数会检测索引 i 是否越界,如果他 发现索引 i >= a.size() 则会抛出异常 std::out_of_range 让程序提前终止(或者被 try-catch 捕获),配合任意一款调试器,就可 以很快速地定位到出错点。 • 不过 at 需要额外检测下标是否越界,虽然更安 全方便调试,但和 [] 相比有一定性能损失。 失效 • 当 resize 的目标长度大于原有的容量时, 就需要重新分配一段更大的连续内存,并 把原数组长度的部分移动过去,多出来的 部分则用 0 来填充。这就导致元素的地址 会有所改变,从而过去 data 返回的指针 以及所有的迭代器对象,都会失效。 vector 容器: resize 到更小尺寸不会导致 data 失效 • 当 resize 的目标长度小于原有的容量时, 不需要重新分配一段连续的内存也不会造0 码力 | 90 页 | 4.93 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programmingset 系列指令有 setle , setge , setl 等等。 • 冷知识: 32 位时代 cmov 系列曾经是 x86 的一个拓展特性(像 sse 一样),使用前需 要先用 cpuid 指令检测是否支持,如果在不支持 cmov 的 CPU 上使用会产生 SIGILL 错误。不过现在 64 位的 x86 CPU 都保证自带了 cmov 和 sse 拓展,所以不需要手动 开启什么开关编译器就会自动生成利用 还有一种“摆烂”的做法: • (cond ? a : b) // 方法 3 • 三目运算符通常会变成和 if-else 一样的分 支,同样会生成条件跳转指令,理应一样 低效。但是有时候编译器会检测到,可以 帮你自动优化成无分支版本的。 “ 妙用加减乘”进行无分支优化的通用公式 • 我比较喜欢方法 2 ,因为他可以很直观地同样适用于多个分支的情况,例如: • if (x < 0) return if-else ,编译器往往会自动检测到可以优化,帮你 应用“妙用加减乘”了,无法体现手动优化的意义。 不同写法的性能测试 • 我们照常编写了测试用例,禁止内联优化,同样生成 10^7 个随机数( -512 到 512 区间)。 • 至于为什么采用需要三个分支的 clamp 做测试? • 优化级别在 -O1 以上时,对于只有两个分支的 if- else ,编译器往往会自动检测到可以优化,帮你应用0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串没什么好神秘的,他就是一个普通的字符。 • 仅仅只是 printf 和 scanf 这些特定的函数会对 % 特殊处理而已。 • 而 \ 比较厉害,他是编译器内部专门为他“开了个后门”。 • 编译器检测到字符串中出现 \ 就会把下一个字符特殊处理。 • 而 % ,编译器并不会特殊处理 % ,是 printf 函数内部在运行时处理了 % 的下一个字符。 • % 就像你和同学随手“拉钩”定下的约定,这是即可。 字符串常用操作 第 6 章 at 获取指定位置的字符 • s.at(i) 和 s[i] 都可以获取字符串中的第 i 个字符。 • 区别在于 at 如果遇到 i 越界的情况,也就是检测到 i ≥ s.size() 时,会抛出 std::out_of_range 异常终止程序。使用 gdb 等调试 器就可以在出这个异常的时候暂停,帮你调试错误 ( BV1kP4y1K7Eo )。也可以从外部函数 ,那程序的行为是未定义的,因为这个地方可能 有其他的对象,程序可能会奔溃,也可能行为异常。如果是富连网 程序,还可能会被黑客利用,窃取或篡改服务器上的数据。 • 那为什么还要 [] ?性能! at 做越界检测需要额外的开销, [] 不需 要。 • 所以 [] 更高效, at 更安全。遇到诡异 bug 时,试试把 [] 都改 成 at 。 at 获取指定位置的字符 获取字符串长度有两种写法…… 0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程ret.value() : 3 optional : value() 会检测是否为空,空则抛出异常 • 当 ret 没有值时(即 nullopt ), ret.value() 会抛出一个异 常,类型为 std::bad_optional_access 。 optional : operator*() 不检测是否为空,不会抛出异常 • 除了 ret.value() 之外还可以用 *ret *ret 获 取 optional 容器中的值,不过他不会 去检测是否 has_value() ,也不会抛出 异常,更加高效,但是要注意安全。 • 请确保在 has_value() 的分支内使用 *ret ,否则就是不安全的。 • 如果 optional 里的类型是结构体,则 也可以用 ret->xxx 来访问该结构体的 属性。 optional : operator bool()0 码力 | 82 页 | 12.15 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人Graph Technology Landscape 2020 • 图数据库 • 图数据建模 • 图计算引擎 • 图数据集成 • 可视化分析 • 知识图谱解决方案 • 图查询语言 • 欺诈检测 • 网络安全分析 • 社交网络分析 • BI 工具 • 图分析工具集 • 图咨询服务 Source : Graph Aware 图数据库发展趋势 AtlasGraph 研发背景 • 基于多版本乐观并发控制技术的分布式事 务实现,在保障一致性的前提下,提供优 秀的分析性能 分布式事务技术方案 MVOCC 处理流程 全面的算法支持 覆盖全部常用算法 • 路径计算、社区检测、相似度计算 等 丰富的自研图算法 • 环路识别、链路识别、节点间全路径、 发散子图识别、汇聚子图识别、金字塔 子图识别 与图数据库的深度结合 使用 cypher 语句直接调用 支持在用户筛选出的子图上计算0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型% b 做循环边界 ,从而避免负方向上出错。然而这还是避免不了 a < -b 时的出错。 • 正确的写法是: (a % b + b) % b • 如果 b 是常数且为 2 的幂次方,编译器会检测到, 并替换为更高效的位运算,反而减少了计算量。 • 此外如果 b 一定是 2 的幂次方,那么 (unsigned)a % b 也可以(先转换成无符号的取模)。 高效的解决:位运算 & • 避免多个线程同时访问。 然而这样会严重影响性能,锁和原子多了,就根本并行不起来。 教科书式的解决:二次判断法 这样如果 block 已经非空,则可以不用上锁,减少上锁次数。 如果 block 为空,则上锁;再次检测是否为空,空则分配内存, 非空说明其他线程已经帮我分配好了,直接退出。 结果反而还变慢了……所以有时候教科书(如 Concurrency in Action )不一定就是完美解决方案,要根据实际情况判断。0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化因为他不敢保证运行这个程序的电脑支持 AVX 指令集…… 两个 int32 可以合并为一个 int64 四个 int32 可以合并为一个 __m128 八个 int32 可以合并为一个 __m256 让编译器自动检测当前硬件支持的指令集 -march=native 让编译器自动判断当前硬件支 持的指令。老师的电脑支持 AVX 指令集,所 以他用了。不过注意这样编译出的程序,可能 放到别人不支持 AVX 的电脑上没法运行。 指向的数组是否有重合。 考虑 func(a, a + 1) 的情况,那样会产生数据依赖链,没法 SIMD 化 。 为了优化而不失正确性,他索性生成两份代码: 一份是 SIMD 的,一份是传统标量的 他在运行时检测 a, b 指针的差是否超过 1024 来判断是否有重叠现 象。 1. 如果没有重叠,则跳转到 SIMD 版本高效运行。 2. 如果重叠,则跳转到标量版本低效运行,但至少不会错。 SIMD 版 标量版0 码力 | 108 页 | 9.47 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台倍 验证有效性提升 100% 解放测试,全面自动化 提升效率,建设质量体系 安全 安全建设被动: • 安全建设缺乏时机和抓手 • 出现问题,影响业务进度 前置安全服务:全流程嵌入安全检测,避免流入业务环节。 全流程安全门禁:关键环节设置安全门禁,快速反馈研发改进 故障拦截率提升 1-3 倍 业务响应效率提升 3-5 倍 全流程安全建设 更多价值体现 组织 靠流程和个人,效率越来越低 能力完成车端和云端服务的迭代更新 过程: 主机方式接入资源设备 • 支持系统主机管理的同时支持了项目级别的主机管理,项目成员可 以自己上下线资源设备 • 主机管理支持强大的探活机制 (TCP/HTTP 协议 ) ,精准检测资源设 备是否在线。 • 服务可以查看到关联的主机资源,支持登录主机,方便开发登录资 源设备诊断问题 • 完备的权限控制,极大降低了管理成本,实现安全风险可控。 IoT 端云混合场景:异构环境下,为开发者提供更好体验0 码力 | 59 页 | 81.43 MB | 1 年前3
共 23 条
- 1
- 2
- 3













