 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型从稀疏数据结构到量化数据类型 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 :每个占据 8 字节 • 如果用更大的数据类型,用时会直接提升两倍! • 这是因为 i % 2 的计算时间,完全隐藏在内存 的超高延迟里了。 • 可见,当数据量足够大,计算量却不多时,读写 数据量的大小唯一决定着你的性能。 • 特别是并行以后,计算量可以被并行加速,而访 存却不行。 使用 int8_t :每个占据 1 字节 • 因此我们可以把数据类型变小,这样所需的内存 量就变小,从而内存带宽也可以减小! 对于右边这种内存瓶颈的循环体,从 4 字节的 int 改成 int8_t ,理论上可以增加 4 倍速度! • 这就是量化数据类型的思想,把占空间大的数据 类型转换成较小的(损失一定精度,换来性能) 。 • 因此如果你的程序不需要那么高精度,可以考虑 用小点的数据类型。 8 个 bit 合并进一个 int8_t :每个占据 1/8 字节 • 考虑到我们的 i % 2 只可能是 0 和 10 码力 | 102 页 | 9.50 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型从稀疏数据结构到量化数据类型 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 :每个占据 8 字节 • 如果用更大的数据类型,用时会直接提升两倍! • 这是因为 i % 2 的计算时间,完全隐藏在内存 的超高延迟里了。 • 可见,当数据量足够大,计算量却不多时,读写 数据量的大小唯一决定着你的性能。 • 特别是并行以后,计算量可以被并行加速,而访 存却不行。 使用 int8_t :每个占据 1 字节 • 因此我们可以把数据类型变小,这样所需的内存 量就变小,从而内存带宽也可以减小! 对于右边这种内存瓶颈的循环体,从 4 字节的 int 改成 int8_t ,理论上可以增加 4 倍速度! • 这就是量化数据类型的思想,把占空间大的数据 类型转换成较小的(损失一定精度,换来性能) 。 • 因此如果你的程序不需要那么高精度,可以考虑 用小点的数据类型。 8 个 bit 合并进一个 int8_t :每个占据 1/8 字节 • 考虑到我们的 i % 2 只可能是 0 和 10 码力 | 102 页 | 9.50 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 04 从汇编角度看编译器优化倍。但是如果你的算法不 适合 SIMD ,则可能加速达不到 4 倍;也有因为 SIMD 让访问内存更有规律,节约了指 令解码和指令缓存的压力等原因,出现加速超过 4 倍的情况。 第 1 章:化简 编译器优化:代数化简 编译器优化:常量折叠 编译器优化:举个例子 编译器优化:我毕竟不是万能的 结论:尽量避免代码复杂化,避免使用会造 成 new/delete 的容器。 简单的代码,比什么优化手段都强。0 码力 | 108 页 | 9.47 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 04 从汇编角度看编译器优化倍。但是如果你的算法不 适合 SIMD ,则可能加速达不到 4 倍;也有因为 SIMD 让访问内存更有规律,节约了指 令解码和指令缓存的压力等原因,出现加速超过 4 倍的情况。 第 1 章:化简 编译器优化:代数化简 编译器优化:常量折叠 编译器优化:举个例子 编译器优化:我毕竟不是万能的 结论:尽量避免代码复杂化,避免使用会造 成 new/delete 的容器。 简单的代码,比什么优化手段都强。0 码力 | 108 页 | 9.47 MB | 1 年前3
 Rust与算法 - 谢波Latex 完成 可参考点 为什么 为什么讲这个话题? 为什么要讲数据结构和算法两部分? 算法相关知识 算法相关知识 • 抽象数据类型 • 时空复杂度 • 复杂度计算 • 基本数据结构复杂度 抽象数据类型 什么是抽象数据类型? 为什么需要抽象数据类型? 时空复杂度 • 时间复杂度更被看重 • 时间和空间复杂度不是对立的,可以协同 时间和空间复杂度 复杂度计算 • 大O标记法(数量级近似)0 码力 | 28 页 | 3.52 MB | 1 年前3 Rust与算法 - 谢波Latex 完成 可参考点 为什么 为什么讲这个话题? 为什么要讲数据结构和算法两部分? 算法相关知识 算法相关知识 • 抽象数据类型 • 时空复杂度 • 复杂度计算 • 基本数据结构复杂度 抽象数据类型 什么是抽象数据类型? 为什么需要抽象数据类型? 时空复杂度 • 时间复杂度更被看重 • 时间和空间复杂度不是对立的,可以协同 时间和空间复杂度 复杂度计算 • 大O标记法(数量级近似)0 码力 | 28 页 | 3.52 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程这是一个实现将两个不同类型 vector 逐元素相加的函数。 • 用 decltype(T1{} * T2{}) 算出 T1 和 T2 类型相加以后的结果,并做 为返回的 vector 容器中的数据类型。 恭喜!你已经基本学废了自动类型推导! • 《基本鞋废》 • 怎么样,是不是非常方便呢? • 如果不理解,跳过即可! 函数也是对象:函数式编程 • 你知道吗?函数可以作为另一个函数的参数!0 码力 | 82 页 | 12.15 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程这是一个实现将两个不同类型 vector 逐元素相加的函数。 • 用 decltype(T1{} * T2{}) 算出 T1 和 T2 类型相加以后的结果,并做 为返回的 vector 容器中的数据类型。 恭喜!你已经基本学废了自动类型推导! • 《基本鞋废》 • 怎么样,是不是非常方便呢? • 如果不理解,跳过即可! 函数也是对象:函数式编程 • 你知道吗?函数可以作为另一个函数的参数!0 码力 | 82 页 | 12.15 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针会采用当前硬件架构的字节序,比如在 x86 上就会变成小端字节序。 Java 这种虚拟机语言会采用大端字节序,因此在小端字节序的硬件上会比较低效,需要额外的字节序转换工作。 为了统一,互联网标准规定,协议包头中传输的数据类型(但凡是多个字节组成的)必须是大端字节序。 假如 x=0x01234567 ,则: int 类型对应的指针类型: int* • 指针,顾名思义,就是“指向”一个内存中的变量。 • 语法规定:任何类型0 码力 | 128 页 | 2.95 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针会采用当前硬件架构的字节序,比如在 x86 上就会变成小端字节序。 Java 这种虚拟机语言会采用大端字节序,因此在小端字节序的硬件上会比较低效,需要额外的字节序转换工作。 为了统一,互联网标准规定,协议包头中传输的数据类型(但凡是多个字节组成的)必须是大端字节序。 假如 x=0x01234567 ,则: int 类型对应的指针类型: int* • 指针,顾名思义,就是“指向”一个内存中的变量。 • 语法规定:任何类型0 码力 | 128 页 | 2.95 MB | 1 年前3
共 5 条
- 1













