C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起
CMakeLists.txt ,他就能够在调用时生成当前系统所支持的构建系统。 • 需要准确地指明每个项目之间的依赖关系,有头文件时特别头疼。 • CMake 可以自动检测源文件和头文件之间的依赖关系,导出到 Makefile 里。 • make 的语法非常简单,不像 shell 或 python 可以做很多判断等。 • CMake 具有相对高级的语法,内置的函数能够处理 configure , install hello.h 一次了嘛 ~ • 后来,这个编译前替换的步骤逐渐变成编译器的了一部分,称为预处理阶段, #define 定 义的宏也是这个阶段处理的。 • 此外,在实现的文件 hello.cpp 中导入声明的文件 hello.h 是个好习惯,可以保证当 hello.cpp 被修改时,比如改成 hello(int) ,编译器能够发现 hello.h 声明的 hello() 和定 义的 hello(int) 这种形式表示不要在当前目录下搜索,只在系统目 录里搜索,” hello.h” 这种形式则优先搜索当前目录下有没有这个文件,找不到再搜索系统 目录。 • 此外,在实现的文件 hello.cpp 中也导入声明的文件 hello.h 是个好习惯: 1. 可以保证当 hello.cpp 被修改时,比如改成 hello(int) ,编译器能够发现 hello.h 声明的 hello() 和定义的 hello(int)0 码力 | 32 页 | 11.40 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战
投影部分:扩大一倍 创建与导出 主函数:创建场景 导出 VDB :调用接口 导出 VDB :分离实现 CMake :使用 CUDA 编译器,链接 OpenVDB 在 Blender 中查看导出的结果 边界条件 边界条件:初始化 边界条件:添加判断边界的版本 边界条件:仅在第一层额外判断边界条件 进一步改进 VDB 导出:支持导出多个网格,并指定名称 进一步改进 VDB 导出: P-IMPL P-IMPL 模式 进一步改进 VDB 导出: F-IMPL 模式 Blender 渲染结果 改进 改进边界条件:外部边界流出而不是反弹,内部边界可以流出速度 Blender 中调整一下材质 Blender 中调整一下材质 改进对流:让烟雾随时间逐渐褪色 改进对流:让烟雾随时间逐渐褪色 改进褪色:不是褪色 density ,而是褪色 temperature 改进褪色:不是褪色 density0 码力 | 58 页 | 14.90 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南
时,同时添加同名的源文件和头文 件。 • 头文件中的声明和源文件中的实现一一对应。 九、一个模块依赖其他模块,则应导入他的头文件 • 如果新模块( Carer )中用到了其他模块( Animal )的类或函数,则需要 在新模块( Carer )的头文件和源文件中都导入其他模块( Animal )的头 文件。 • 注意不论是项目自己的头文件还是外部的系统的头文件,请全部统一采用 < 项目名 十、依赖其他模块但不解引用,则可以只前向声明不导入头文件 • 如果模块 Carer 的头文件 Carer.h 虽然引用了其他模块中的 Animal 类,但 是他里面并没有解引用 Animal ,只有源文件 Carer.cpp 解引用了 Animal 。 • 那么这个头文件是不需要导入 Animal.h 的,只需要一个前置声明 struct Animal ,只有实际调用了 Animal 成员函数的源文件需要导入 Animal (或抄别人开源项目里的)个 Find 文件,用起来很不方便。但是 vcpkg 会为所有第三方 库,即使是懒惰的 Jemalloc ,都配备一个 Config 文件方便你 find_package 导入。所以 用 vcpkg 时,尽量用 find_package(XXX CONFIG REQUIRED) 避免被 CMake 自带的 Find 文件误导找到别的地方(而非 vcpkg 安装的那个)的库。0 码力 | 56 页 | 6.87 MB | 1 年前3Hello 算法 1.0.0b4 C++版
将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整的。 对于密码学的相关应用,哈希算法需要满足更高的安全标准,以防止从哈希值推导出原始密码等逆向工程, 包括: ‧ 抗碰撞性:应当极其困难找到两个不同的输入,使得它们的哈希值相同。 ‧ 雪崩效应:输入的微小变化应当导致输出的显著且不可预测的变化。 请注意,“均匀分布”与“ 先分析一个简单案例。给定一个完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每 个节点都对应唯一的数组索引。 7. 树 hello‑algo.com 124 根据层序遍历的特性,我们可以推导出父节点索引与子节点索引之间的“映射公式”:若节点的索引为 ? ,则 该节点的左子节点索引为 2? + 1 ,右子节点索引为 2? + 2 。 Figure 7‑12. 完美二叉树的数组表示 映 Figure 7‑29. 有 grandChild 的左旋操作 可以观察到,右旋和左旋操作在逻辑上是镜像对称的,它们分别解决的两种失衡情况也是对称的。基于对称 性,我们可以轻松地从右旋的代码推导出左旋的代码。具体地,只需将「右旋」代码中的把所有的 left 替换 为 right ,将所有的 right 替换为 left ,即可得到「左旋」代码。 // === File: avl_tree0 码力 | 343 页 | 27.39 MB | 1 年前3Hello 算法 1.1.0 C++ 版
数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 单向性:无法通过哈希值反推出关于输入数据的任何信息。 ‧ 抗碰撞性:应当极难找到两个不同的输入,使得它们的哈希值相同。 ‧ 雪 的。 7.3.1 表示完美二叉树 先分析一个简单案例。给定一棵完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每 个节点都对应唯一的数组索引。 根据层序遍历的特性,我们可以推导出父节点索引与子节点索引之间的“映射公式”:若某节点的索引为 ? , 则该节点的左子节点索引为 2? + 1 ,右子节点索引为 2? + 2 。图 7‑12 展示了各个节点索引之间的映射关 系。 式,它将一个问题分解为一系列更小的子问题,并 通过存储子问题的解来避免重复计算,从而大幅提升时间效率。 在本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出 更高效的动态规划解法。 爬楼梯 给定一个共有 ? 阶的楼梯,你每步可以上 1 阶或者 2 阶,请问有多少种方案可以爬到楼顶? 如图 14‑1 所示,对于一个 3 阶楼梯,共有 3 种方案可以爬到楼顶。0 码力 | 379 页 | 18.47 MB | 1 年前3Hello 算法 1.0.0 C++版
数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 单向性:无法通过哈希值反推出关于输入数据的任何信息。 ‧ 抗碰撞性:应当极难找到两个不同的输入,使得它们的哈希值相同。 ‧ 雪 的。 7.3.1 表示完美二叉树 先分析一个简单案例。给定一棵完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每 个节点都对应唯一的数组索引。 根据层序遍历的特性,我们可以推导出父节点索引与子节点索引之间的“映射公式”:若某节点的索引为 ? , 则该节点的左子节点索引为 2? + 1 ,右子节点索引为 2? + 2 。图 7‑12 展示了各个节点索引之间的映射关 系。 式,它将一个问题分解为一系列更小的子问题,并 通过存储子问题的解来避免重复计算,从而大幅提升时间效率。 在本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出 更高效的动态规划解法。 � 爬楼梯 给定一个共有 ? 阶的楼梯,你每步可以上 1 阶或者 2 阶,请问有多少种方案可以爬到楼顶? 如图 14‑1 所示,对于一个 3 阶楼梯,共有 3 种方案可以爬到楼顶。0 码力 | 378 页 | 17.59 MB | 1 年前3Hello 算法 1.2.0 简体中文 C++ 版
数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 单向性:无法通过哈希值反推出关于输入数据的任何信息。 ‧ 抗碰撞性:应当极难找到两个不同的输入,使得它们的哈希值相同。 ‧ 雪 的。 7.3.1 表示完美二叉树 先分析一个简单案例。给定一棵完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每 个节点都对应唯一的数组索引。 根据层序遍历的特性,我们可以推导出父节点索引与子节点索引之间的“映射公式”:若某节点的索引为 ? , 则该节点的左子节点索引为 2? + 1 ,右子节点索引为 2? + 2 。图 7‑12 展示了各个节点索引之间的映射关 系。 式,它将一个问题分解为一系列更小的子问题,并 通过存储子问题的解来避免重复计算,从而大幅提升时间效率。 在本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出 更高效的动态规划解法。 爬楼梯 给定一个共有 ? 阶的楼梯,你每步可以上 1 阶或者 2 阶,请问有多少种方案可以爬到楼顶? 如图 14‑1 所示,对于一个 3 阶楼梯,共有 3 种方案可以爬到楼顶。0 码力 | 379 页 | 18.48 MB | 9 月前3Hello 算法 1.0.0b5 C++版
数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整的。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 抗碰撞性:应当极其困难找到两个不同的输入,使得它们的哈希值相同。 ‧ 雪崩效应:输入的微小变化应当导致输出的显著且不可预测的变化。 144 7.3.1 表示完美二叉树 先分析一个简单案例。给定一个完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每 个节点都对应唯一的数组索引。 根据层序遍历的特性,我们可以推导出父节点索引与子节点索引之间的“映射公式”:若节点的索引为 ? ,则 该节点的左子节点索引为 2? + 1 ,右子节点索引为 2? + 2 。图 7‑12 展示了各个节点索引之间的映射关系。 图 7‑12 式,它将一个问题分解为一系列更小的子问题,并 通过存储子问题的解来避免重复计算,从而大幅提升时间效率。 在本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出 更高效的动态规划解法。 � 爬楼梯 给定一个共有 ? 阶的楼梯,你每步可以上 1 阶或者 2 阶,请问有多少种方案可以爬到楼顶。 如图 14‑1 所示,对于一个 3 阶楼梯,共有 3 种方案可以爬到楼顶。0 码力 | 377 页 | 30.69 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型
载了 operator= 和 operator bool 的 std::_Bit_reference 对象,而且效率很低。 • 如果配合用 decltype 和 auto 的话,他们不会正确推导出 bool ,影响我们正常使用模板元编 程。 • 一般认为 vector是 C++ 标准库设计上的一个败笔,是为了向前兼容才保持这样不变的 。 • 他们就不应该直接特化 vector 0 码力 | 102 页 | 9.50 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程
tuple :结构化绑定为引用 • 结构化绑定也支持绑定为引用: • auto &[x, y, ...] = tup; • 这样相当于解包出来的 x, y, ... 都是 auto & 推 导出来的引用类型。对引用的修改可以影响到原 tuple 内的值。 • 同理,通过 auto const & 绑定为常引用: • auto const &[x, y, ...] = tup; •0 码力 | 82 页 | 12.15 MB | 1 年前3
共 14 条
- 1
- 2