C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针从计算机组成原理看 C 语言指针 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 请问下面这三段代码有什么错误? • float x = -3.14; • printf(“%f\n”, abs(x)); 00000111 表示 7 • ...... • 11111100 表示 252 11111101 表示 253 11111110 表示 254 11111111 表示 255 • 字节实际上就是 C 语言中的 unsigned char 类型。 表示更大范围的整数:字( word ) • 但是单单一个字节表示的范围还是太有限了,只能表示 0 到 255 的值。 • 如何扩大表示范围?简单,用两个字节合在一起即可,例如: 259 • ... • 11111111-11111110 表示 65534 11111111-11111111 表示 65535 • 这就是两个字节合成了一个字( word ),实际上就是 C 语言里的 unsigned short 类型 。 不同位数的计算机,字( word )的大小也不一样 • 刚刚说把 2 个字节( byte )拼成一个字( word ),实际上是 16 位计算机的做法。0 码力 | 128 页 | 2.95 MB | 1 年前3
陈东 - 利用Rust重塑移动应用开发-230618重塑移动应用开发 跨平台开发的优势和局限性 Pros: - Fast - Single Codebase - Third-party support (Javascript better than Dart) 利用 Rust 重塑移动应用开发 跨平台开发的优势和局 限性 Cons: - Performance - Native feature utilize - Existing Codebase0 码力 | 22 页 | 2.10 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串Ctrl+C 输入之 后一次性显示出来的,并不是真的说 Ctrl 就是 ‘ ^’ 这 个字符。 C 语言字符串 第 2 章 C 语言中的字符类型 char • char c = ‘a’; • assert(c == 97); • c = c + 1; • assert(c == ‘b’); • C 语言中规定字符类型为 char 类型,是个 8 位整数。 • 这是因为 ASCII 码只有 0~127 实际上会被编译器翻译成他对应的 ASCII 码: 97 。写 ‘ a’ 和写 (char)97 是完全一样的,方便阅读的语法糖而已。 “char 即整数”思想应用举例 “char 即整数”思想应用举例 C 语言帮手函数 帮手函数大全 • isupper(c) 判断是否为大写字母(‘ A’ <= c && c <= ‘Z’ )。 • islower(c) 判断是否为小写字母(‘ a’ <= c && c tolower(c) 把大写字母转换为小写字母,如果不是则原封不动返回。 帮手函数大全 http://c.biancheng.net/ref/ctype_h/ 关于 char 类型的一个冷知识 • C 语言其实只规定了 unsigned char 是无符号 8 位整数, signed char 是有 符号 8 位整数,而 char 类型只需是 8 位整数即可,可以是有符号也可以 是无符号,任凭编译器决定(0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器复习 C 语言指针( 1 ) • 上节课说了,迭代器就是在模仿 C 语言指针。 • 回想一下 C 语言咋遍历数组的: • int arr[n]; • for (int i = 0; i < n; i++) { • int value = arr[i]; • } • 循环的范围是 [0, n) 。 • 因为这里 arr[i] 等价于 *(arr + i) ,所以…… 复习 C 语言指针( 2 上节课说了,迭代器就是在模仿 C 语言指针。 • 回想一下 C 语言咋遍历数组的: • int arr[n]; • for (int *p = arr; p < arr + n; p++) { • int value = *p; • } • 索性用 arr + i 作为迭代的变量,避免一次加法的开销。 • 循环的范围变成 [arr, arr + n) 。 复习 C 语言指针( 3 ) • 上节课说了,迭代器就是在模仿 上节课说了,迭代器就是在模仿 C 语言指针。 • 回想一下 C 语言咋遍历数组的: • int arr[n]; • for (int *p = arr; p != arr + n; p++) { • int value = *p; • } • n 总是大于 0 的。 p 的初值 arr 总是小于末值 arr + n ,所以把 p < arr + n 改成 p != arr + n 是一样的,还高0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南的初始化: LANGUAGES 字段 • project( 项目名 LANGUAGES 使用的语言列表 ...) 指定了该项目使用了哪些编程语言。 • 目前支持的语言包括: • C : C 语言 • CXX : C++ 语言 • ASM :汇编语言 • Fortran :老年人的编程语言 • CUDA :英伟达的 CUDA ( 3.8 版本新增) • OBJC :苹果的 Objective-C 版本新增) • ISPC :一种因特尔的自动 SIMD 编程语言( 3.18 版本新增) • 如果不指定 LANGUAGES ,默认为 C 和 CXX 。 https://cmake.org/cmake/help/latest/command/project.html 常见问题: LANGUAGES 中没有启用 C 语言,但是却用到了 C 语言 解决:改成 project( 项目名 LANGUAGES 也可以先设置 LANGUAGES NONE ,之后再调用 enable_language(CXX) 这样可以把 enable_language 放到 if 语句里,从而只有某些选项开启才启用某语言之类的 设置 C++ 标准: CMAKE_CXX_STANDARD 变量 • CMAKE_CXX_STANDARD 是一个整数,表示要用的 C++ 标准。 • 比如需要 C++17 那就设为 170 码力 | 166 页 | 6.54 MB | 1 年前3
Go读书会第二期Go 读书会第二期 白明 《 Go 语言精进之路》作者 tonybai.com 博主 目 录 写书的历程 0 1 Go 语言精进之路导读 0 2 我是怎么读书的 0 3 写书的历程 第一部分 程序员的“小目标”与写书三要素 写书三要素 写书 <- 能力 +意愿 + 机会 过程 写书不易,写高质量的书更难 2018 年下 旬开始动笔 2020 年 11 月下旬 初稿交付 《 Go 语言精进之路》导读 第二部分 整体写作思路 异曲同工 精进之路,思维先行 – part1 践行哲学,遵循惯例,认清本质,理解原理 - (part2- part10) 精进之路,思维先行 异曲同工 “ 语言决定思维方式” - 萨丕尔假说 “ 我的语言之局限,即我的世界之局限” - 路德维 希 · 维特根斯坦(语言哲学奠基人) “ 不能改变你思维方式的语言,不值得学习” 不能改变你思维方式的语言,不值得学习” - Alan Perlis ( 首届图灵奖得主 ) Part1 - 进入 Go 语言编程思维导引 站在语言设计者的高度理解 Go 的与众不同 Go 诞生 与演进 Go 设计哲 学 Go 编程思 维举例 怎么学习 Go 思维? 学习本质是一种模仿。要学习 Go 思维,就要 去模仿 go 团队、 go 社区的优秀项目和代 码,看看他们怎么做的 践行哲学,遵循惯例,认清本质,理解原理0 码力 | 26 页 | 4.55 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人查询 / 操作 生活中无处不在的图 图分析技术分类 图查询 • 使用图数据库的查询语言进行点边搜索 图算法 • 中心性算法 • 社区算法 • 路径算法 • … 图深度学习 • 图嵌入 • 图卷积 • 图注意力网络 • 图自编码器 图查询及其应用场景 图查询 • 使用图数据库的查询语言进行点边的关联查询,可以快速完成传统数据库难以完成的 多度点边关 联 当前图的典型应用场景 图技术全景图—— Graph Technology Landscape 2020 • 图数据库 • 图数据建模 • 图计算引擎 • 图数据集成 • 可视化分析 • 知识图谱解决方案 • 图查询语言 • 欺诈检测 • 网络安全分析 • 社交网络分析 • BI 工具 • 图分析工具集 • 图咨询服务 Source : Graph Aware 图数据库发展趋势 AtlasGraph 开发的分布式存储引 擎及图计算引擎,精细的内存 管理设计,内置索引系统,支 持毫秒级的并发查询响应速度 易用 AQL(Atlas Graph Query Language) ,类 SQL 的图查询 语言,内置上百种分析函数, 面向分析师友好,拥抱标准, 基于 openCypher 向 ISO GQL 迈进 实时大图 支持万亿节点存储及流式计算 引擎的结合,最新数据实时入 库构图,为在线业务决策分析0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector获取首地址指针 • data() 返回的首地址指针,通常配合 size() 返回的数组长度一起使用(见上一课《 C 语言指针》中提到,连续的动态数组只需要 知道首地址和数组长度即可完全确定)。 • 用他来获取一个 C 语言原始指针 int * , 很方便用于调用 C 语言的函数和 API 等 ,同时还能享受到 vector 容器 RAII 的安 全性。 • ~vector() noexcept; 迭代器模式:首迭代器+尾迭代器 • 如果让小彭老师来写 list 容器和他的迭代器,他的 内部具体实现可能是这样的。 • 迭代器的这些运算符,都是约定俗成的,其根本目 的在于模仿指针的行为,方便来自 C 语言的程序 员快速上手掌握 C++ 标准库。 • 虽然你也可以用直观的函数名 advance() 代替 + + ,用 deref() 代替 * , equal_to() 代替 == 。但 是模仿指针行为的这些运算符,已然成为了 对方容器还可以是个 C 语言风格的数组,因为 C 语言类型没有办法加成员函数 begin 和 end ,可以用 std::begin 和 std::end 这两个全 局函数代替,当然如果用了 using namespace std 时也可以不写 std:: 前缀。 • 这两个函数会对于具有 begin 和 end 成员函数 的容器会直接调用,对于 C 语言数组则被特化 为返回 b0 码力 | 90 页 | 4.93 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化及以上( Linux 用户) CMake 3.12 及以上(跨平台作业) Git 2.x (作业上传到 GitHub ) CUDA Toolkit 10.0 以上( GPU 专题) 第 0 章:汇编语言 x64 架构下的寄存器模型 通用寄存器: 32 位时代 • 32 位 x86 架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp • 4GB 限制外,也有一定性能优势。 8 位, 16 位, 32 位, 64 位版本 al, ax, eax, rax r15b, r15w, r15d, r15 AT&T 汇编语言 GCC 编译器所生成的汇编语言就属于这种 返回值:通过 eax 传出 movl $42, %eax 相当于: eax = 42; 前 6 个参数:分别通过 edi , esi , edx , ecx , r8d 标准关键字,但不是 C++ 标准的关键字。 • __restrict 其实是编译器的“私货”,好在大多数主流编译器都支持。 • 所以无耻的 C 艹标准委员会什么时候肯把他加入标准呢?看看人家 C 语言。 编译器优化:合并写入 将两个 int32 的写入合 并为一个 int64 的写入 。 合并写入:不能跳跃 但如果访问的两个元素地 址间有跳跃,就不能合并 了。 第 4 章:矢量化 更宽的合并写入:矢量化指令(0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理org/cmake/help/latest/) - [Git 官方文档 ](https://git-scm.com/doc) - [GitHub 官方文档 ](https://docs.github.com/en) 古代: C 语言 近代: C++98 引入 STL 容器库 近现代: C++11 引入了 {} 初始化表达式 近现代: C++11 引入了 range-based for-loop 如果想使用 for_each 除了用于初始化的构造函数( constructor ) 还包括了用于销毁的解构函数( destructor ) 离开 {} 作用域自动释放 手动释放 RAII :避免犯错误 与 Java , Python 等垃圾回收语言不同, C++ 的 解构函数是显式的,离开作用域自动销毁,毫不含 糊(有好处也有坏处,对高性能计算而言利大于 弊) 如果没有解构函数,则每个带有返回的分 支都要手动释放所有之前的资源 : RAII 注: return *this 是为了支持连等号 a = b = c; 编译器自动生成的函数:全家桶 • 其实,除了拷贝构造和拷贝赋值,编译器会自动生成的特殊函数还有这些: • 这在其他面向对象语言中是看不到的。他们分别是什么作用?稍后揭晓。 全家桶:这些函数默认情况下是怎么样的? 编译器自动生成的这些函数等价于这样: std::move 是什么意思?稍后揭晓。 顺便一提,如果其中一个成员(比如0 码力 | 96 页 | 16.28 MB | 1 年前3
共 24 条
- 1
- 2
- 3













