C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake 3.12 及以上(跨平台作业) Git 2.x (作业上传到 GitHub ) CUDA Toolkit 10.0 以上( GPU 专题) 第 0 章:从并发到并行 摩尔定律:停止增长了吗? • 晶体管的密度的确仍在指数增长,但处理器主 • 并行:某图形学爱好者购置了一台 4 核处理 器的电脑,他正在渲染 cornell box 的图像, 这个图像在单核上渲染需要 4 分钟。 • 他把图像切成 4 份,每个是原来的 1/4 大小 ,这样每个小块渲染只需要 1 分钟。 • 然后他把 4 个小块发给 4 个处理器核心, 1 分钟后 4 个处理器都渲染完毕得到结果。 • 最后只需将 4 个小块拼接起来即可得到完整 的 份,作为一个“任务”推送到 全局队列里去。每个线程空闲时会不断地从那个 队列里取出数据,即“认领任务”。然后执行,执行 完毕后才去认领下一个任务,从而即使每个任务 工作量不一也能自动适应。 • 这种技术又称为线程池( thread pool ),避免了 线程需要保存上下文的开销。但是需要我们管理 一个任务队列,而且要是线程安全的队列。 struct Task { int x0, y0;0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针512GB 内存,如果插了超过这个大小的内存条他也不会认出来。 • 此外, 16 位计算机实际上能通过额外的段寄存器访问到 20 位的内存地址( 1MB )。 • 32 位计算机还能通过 PAE 技术(物理地址扩展)访问到 36 位的内存地址( 64GB ) 。 • 64 位计算机反而是因为 16777216 TB 太大,内存地址被阉割到了 39 位( 512GB )。 • 64 位计算机:小丑竟是我自己 64 位。 Windows 认为 long 不论 32 位系统还是 64 位系统都一样应该为 32 位,认为这样安全。 因此我们在编写 C 语言程序时,应该避免使用 long 类型,他会导致你的程序难以跨平台。 除了 long 之外的其他类型则没有区别,可以放心使用。 无符号整数: unsigned 修饰 有符号版本 无符号版本 char unsigned char short unsigned • typedef int int32_t; • typedef long long int64_t; • 这样不论操作系统对类型的定义如何混乱,这些标准化的类型都是确定的大小。 • 这就避免了跨平台的麻烦,而且直接他们在类型名字中直接写明了类型的大小,更直观。 标准化的类型: stdint.h • 除了有符号的 int32_t 系列外,也提供了无符号 uint32_t 系列: • typedef0 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程完成队列的所有任务后再返回。从而 能够在 main 退出前等到 kernel 在 GPU 上执行完。 定义在 GPU 上的设备函数 • __global__ 用于定义核函数,他在 GPU 上执行,从 CPU 端通过三重尖括号语法调 用,可以有参数,不可以有返回值。 • 而 __device__ 则用于定义设备函数,他在 GPU 上执行,但是从 GPU 上调用的,而 且不需要三重尖括号,和普通函数用起来一 ,也就是说核函数 可以调用另一个核函数,且其三重尖括号 里的板块数和线程数可以动态指定,无需 先传回到 CPU 再进行调用,这是 CUDA 特有的能力。 常用于这种情况:需要从 GPU 端动态计算出 blockDim 和 gridDim ,而又不希望导回数据到 CPU 导致强制同步影响性能。 这种模式被称为动态并行( dynamic parallelism ), OpenGL 有一 个 你可能已经迫不及待想通过 *pret 访问其 返回值了。但是不行,因为 GPU 访问不 了 CPU 的内存地址,同理, CPU 也访 问不了 GPU 的内存地址。一访问 CPU 就奔溃了。 跨 GPU/CPU 地址空间拷贝数据 • 因此可以用 cudaMemcpy ,他能够在 GPU 和 CPU 内存之间拷贝数据。 • 这里我们希望把 GPU 上的内存数据拷贝到 CPU 内存上,也就是从设备内存0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake 3.12 及以上(跨平台作业) Git 2.x (作业上传到 GitHub ) CUDA Toolkit 10.0 以上( GPU 专题) 为什么需要模板函数( template ) • 避免重复写代码。 • 比如,利用重载实现“将一个数乘以 Float 的乘法应该是 multiply(float) ,你也去 定义好几个重载吗?定义为 multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template• 其中 T 可以变成任意类型。 要是编译器哪怕细看了一眼:字符串怎么可能被写入呢?肯定是会出错的。 • 但是却没有出错,这是因为模板没有被调用,所以不会被实际编译! • 而只有当 main 调用了这个函数,才会被编译,才会报错! • 用一个假模板实现延迟编译的技术,可以加快编译的速度,用于代理模式等。 模板函数:一个例子 • 比如,要打印任意一个 vector : 模板函数:配合运算符重载 • 实现用 std::cout << a 打印任意 vector 0 码力 | 82 页 | 12.15 MB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20中的编程范式。 现代 C++ 还为自身的标准库增加了非常多的工具和方法,诸如在语言自身标准的层面上制定了 std::thread,从而支持了并发编程,在不同平台上不再依赖于系统底层的 API,实现了语言层面的跨 平台支持;std::regex 提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功 的『范型』,而现代 C++ 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的 特性并不需要全部掌握,只需针对自己的使用需求和特定的应用场景,学习、查阅最适合自己的新特性 7 相关代码 第 1 章迈向现代 C++ 即可。 同时,本书在介绍这些特性的过程中,尽可能简单明了的介绍了这些特性产生的历史背景和技术需 求,这为理解这些特性、运用这些特性提供了很大的帮助。 此外,笔者希望读者在阅读本书后,能够努力在新项目中直接使用 C++17,并努力将旧项目逐步迁 移到 C++17。也算是笔者为推进现代 C++ std::bind 和 std::function)、export 等特性也均 被弃用。前面提到的这些特性如果你从未使用或者听说过,也请不要尝试去了解他们,应该向新标准靠 拢,直接学习新特性。毕竟,技术是向前发展的。 1.2 与 C 的兼容性 出于一些不可抗力、历史原因,我们不得不在 C++ 中使用一些 C 语言代码(甚至古老的 C 语言代 码),例如 Linux 系统调用。在现代 C++ 出现之前,大部分人当谈及『C0 码力 | 83 页 | 2.42 MB | 1 年前3
《深入浅出MFC》2/e由于排版问题,有些繁体说法在换行时候没有被替换,所以遇到问题大家可以对照原文比较一下。 3. 附录、无责任书评那个文件没有转(估计看到那个地方的时候,你手里也该有一本纸板的了)。 2 因此,此书虽已出版两年,鉴于仍具阅读与技术上的价值,鉴于繁简转译制作 上的费时费工,鉴于我对同胞的感情,我决定开放此书内容,供各位免费阅读。 我已为《深入浅出MFC 》2/e 制作了PDF 格式之电子文件, 放在 http://www 真是一个好东西。我在书店驻足察看这本书五分钟之后,我便知 道这本书是一定要买下的。适巧我工作上的项目进度也到了一个即将完成的阶度,所以我便 一口气将这本书给读完了,而且是彻彻底底读了两遍。 我个人特别喜欢第3章:MFC 六大关键技术之仿真。这章内容的设计的确在MFC 丛林中, 大刀阔斧地披露出最重要的筋络,我相信这正是所有学习MFC 的人所需要的一种表明方 式。对我而言,以往遗留的许多疑惑,在此都一一得到了解答。最重要的是,您曾经说过, 系统程序设计大奥秘与深入浅出MFC,更是对您五体投地,立刻将这两 本书买下来,准备好好享受一下。对于深入浅出MFC,我给予极高的评价,因为它完全 满足我的需要。我去年才从台大电机博士班计算器科学组毕业,目前在资策会信息技术处服 国防役。先前作的纯是理论研究,现在才开始接触Windows Programming。您的深入浅出 MFC 对我而言是圣经。 真的很感谢您为知识传授所作的努力! 台中Fox Wang 自从阅读深入浅出MFC0 码力 | 1009 页 | 11.08 MB | 1 年前3
Hello 算法 1.1.0 C++ 版同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 羽毛球筒则如同“队列”,一端放入、另一端取出;字典就像一个“哈希表”,能够快速查找目标词条。 本书旨在通过清晰易懂的动画图解和可运行的代码示例,使读者理解算法和数据结构的核心概念,并能够通 过编程来实现它们。在此基础上,本书致力于 字符集 随着计算机技术的蓬勃发展,字符集与编码标准百花齐放,而这带来了许多问题。一方面,这些字符集一般 只定义了特定语言的字符,无法在多语言环境下正常工作。另一方面,同一种语言存在多种字符集标准,如 果两台计算机使用的是不同的编码标准,则在信息传递时就会出现乱码。 那个时代的研究人员就在想:如果推出一个足够完整的字符集,将世界范围内的所有语言和符号都收录其 中,不就可以解决跨语言环境和乱码问 还处于发展早期,那时候使用 16 位的编码就足以表示所有的 Unicode 字符了。 ‧ C# 使用 UTF‑16 编码,主要是因为.NET 平台是由 Microsoft 设计的,而 Microsoft 的很多技术(包 括 Windows 操作系统)都广泛使用 UTF‑16 编码。 由于以上编程语言对字符数量的低估,它们不得不采取“代理对”的方式来表示超过 16 位长度的 Unicode 字符。这是一个0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版字符集 随着计算机技术的蓬勃发展,字符集与编码标准百花齐放,而这带来了许多问题。一方面,这些字符集一般 只定义了特定语言的字符,无法在多语言环境下正常工作。另一方面,同一种语言存在多种字符集标准,如 果两台计算机使用的是不同的编码标准,则在信息传递时就会出现乱码。 那个时代的研究人员就在想:如果推出一个足够完整的字符集,将世界范围内的所有语言和符号都收录其 中,不就可以解决跨语言环境和乱码问 还处于发展早期,那时候使用 16 位的编码就足以表示所有的 Unicode 字符了。 ‧ C# 使用 UTF‑16 编码,主要是因为.NET 平台是由 Microsoft 设计的,而 Microsoft 的很多技术(包 括 Windows 操作系统)都广泛使用 UTF‑16 编码。 由于以上编程语言对字符数量的低估,它们不得不采取“代理对”的方式来表示超过 16 位长度的 Unicode 字符。这是一个 hello‑algo.com 78 4.2.4 链表典型应用 单向链表通常用于实现栈、队列、哈希表和图等数据结构。 ‧ 栈与队列:当插入和删除操作都在链表的一端进行时,它表现出先进后出的特性,对应栈;当插入操作 在链表的一端进行,删除操作在链表的另一端进行,它表现出先进先出的特性,对应队列。 ‧ 哈希表:链式地址是解决哈希冲突的主流方案之一,在该方案中,所有冲突的元素都会被放到一个链表 中。 ‧0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 羽毛球筒则如同“队列”,一端放入、另一端取出;字典就像一个“哈希表”,能够快速查找目标词条。 本书旨在通过清晰易懂的动画图解和可运行的代码示例,使读者理解算法和数据结构的核心概念,并能够通 过编程来实现它们。在此基础上,本书致力于 字符集 随着计算机技术的蓬勃发展,字符集与编码标准百花齐放,而这带来了许多问题。一方面,这些字符集一般 只定义了特定语言的字符,无法在多语言环境下正常工作。另一方面,同一种语言存在多种字符集标准,如 果两台计算机使用的是不同的编码标准,则在信息传递时就会出现乱码。 那个时代的研究人员就在想:如果推出一个足够完整的字符集,将世界范围内的所有语言和符号都收录其 中,不就可以解决跨语言环境和乱码问 还处于发展早期,那时候使用 16 位的编码就足以表示所有的 Unicode 字符了。 ‧ C# 使用 UTF‑16 编码,主要是因为.NET 平台是由 Microsoft 设计的,而 Microsoft 的很多技术(包 括 Windows 操作系统)都广泛使用 UTF‑16 编码。 由于以上编程语言对字符数量的低估,它们不得不采取“代理对”的方式来表示超过 16 位长度的 Unicode 字符。这是一个0 码力 | 379 页 | 18.48 MB | 10 月前3
面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭面向亿行C/C++代码的 静态分析系统设计及实践 肖枭 自我介绍 2016年香港科技大学取得博士学位 过去10年一直以极高的热情从事静态 分析技术的学术用研究 合作创办源伞科技,致力于推动静态 分析技术在企业中的应用 目录 代码质量管理是个大问题 静态分析+代码评审的实践 学习和强调,红线和惩罚,100%的测试 覆盖率,和事后复盘并不够 有经验的程序员也会犯错 对代码提要求很难监督落实 Thx! DevOps: 代码质量责任应该左移 设计 代码 开发 代码 评审 入库 测试 发布 1. 非研发人员主导,沟通成本高,推动修复周期长 2. 很难形成标准推动研发实施 3. 形成技术债,偿债成本高 1. 代码签入前,研发人员有义务修复问题 2. 测试人员早期加入,更懂项目研发的情况,沟通成本低,加快上线 3. 能逐步形成好的编码规范和最佳实践 检查代码风格问题挺准,但是 我warning都不看,还看这个? 大规模C/C++静态代码评审系统搭建 数千个活跃开发 的代码仓库 每天上千次代码 评审请求 平均每次代码评 审小于50分钟 • 需要编译C/C++代码 • 使用了定理证明器求解可 行路径(精确,耗时) • 能跨函数分析 • 能处理指针 使用有深度的代码分析器 做到快速和准确 用尽量少机器完成一天几千次分析 每次分析10分钟要能结束 控制误报并建立反馈和改进机制 挑战:超大规模代码仓库 项目平均40分钟单机编译时间0 码力 | 39 页 | 6.88 MB | 1 年前3
共 28 条
- 1
- 2
- 3













