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)); C++ 封 装好的容器而不是 C 语言指针,就可以基本 保证没有内存泄露。但是封装的太好了也有效 率问题,因此追求极致性能时还是会直接操作 原始的 C 语言指针。此外如果不理解容器的 底层原理也很容易犯错,因此我们还是要好好 学习 C 语言思想的。 C 语言特性:函数声明为 T [] 类型的参数,实际上是 T * 类型 • 如果函数参数类型形如 • func(int arr[])0 码力 | 128 页 | 2.95 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版本项目旨在创建一本开源、免费、对新手友好的数据结构与算法入门教程。 ‧ 全书采用动画图解,内容清晰易懂、学习曲线平滑,引导初学者探索数据结构与算法的知识地图。 ‧ 源代码可一键运行,帮助读者在练习中提升编程技能,了解算法工作原理和数据结构底层实现。 ‧ 提倡读者互助学习,欢迎大家在评论区提出问题与分享见解,在交流讨论中共同进步。 0.1.1 读者对象 若你是算法初学者,从未接触过算法,或者已经有一些刷题经验,对数据结构与算法有模糊的认识,在会与 图 0‑7 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 阶段一:算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效 率等方面的内容。 2. 阶段二:刷算法题。建议从热门题目开刷,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题 时,“知识遗忘”可能是一个挑战,但请放心,这是很正常的。我们可以按照“艾宾浩斯遗忘曲线”来 目,实际上同时考查数据结构和算法两方面的知识。 1.3 小结 ‧ 算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学会了许多 算法,用以解决生活中的大小问题。 ‧ 查字典的原理与二分查找算法相一致。二分查找算法体现了分而治之的重要算法思想。 ‧ 整理扑克的过程与插入排序算法非常类似。插入排序算法适合排序小型数据集。 第 1 章 初识算法 www.hello‑algo.com0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.1.0 C++ 版图 0‑7 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 阶段一:算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效 率等方面的内容。 2. 阶段二:刷算法题。建议从热门题目开刷,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题 时,“知识遗忘”可能是一个挑战,但请放心,这是很正常的。我们可以按照“艾宾浩斯遗忘曲线”来 目,实际上同时考查数据结构和算法两方面的知识。 1.3 小结 ‧ 算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学会了许多 算法,用以解决生活中的大小问题。 ‧ 查字典的原理与二分查找算法相一致。二分查找算法体现了分而治之的重要算法思想。 ‧ 整理扑克的过程与插入排序算法非常类似。插入排序算法适合排序小型数据集。 第 1 章 初识算法 hello‑algo.com 16 许多编程语言内置了列表,例如 Java、C++、Python 等。它们的实现比较复杂,各个参数的设定也非常考 究,例如初始容量、扩容倍数等。感兴趣的读者可以查阅源码进行学习。 为了加深对列表工作原理的理解,我们尝试实现一个简易版列表,包括以下三个重点设计。 ‧ 初始容量:选取一个合理的数组初始容量。在本示例中,我们选择 10 作为初始容量。 ‧ 数量记录:声明一个变量 size ,用于记录0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版图 0‑7 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 阶段一:算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效 率等方面的内容。 2. 阶段二:刷算法题。建议从热门题目开刷,如“剑指 Offer”和“LeetCode Hot 100”,先积累至少 100 道题目,熟悉主流的算法问题。初 算法题目,实际上同时考查数据结构和算法两方面的知识。 1.3 小结 ‧ 算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学会了许多 算法,用以解决生活中的大小问题。 ‧ 查字典的原理与二分查找算法相一致。二分查找算法体现了分而治之的重要算法思想。 第 1 章 初识算法 hello‑algo.com 16 ‧ 整理扑克的过程与插入排序算法非常类似。插入排序算法适合排序小型数据集。 许多编程语言内置了列表,例如 Java、C++、Python 等。它们的实现比较复杂,各个参数的设定也非常考 究,例如初始容量、扩容倍数等。感兴趣的读者可以查阅源码进行学习。 为了加深对列表工作原理的理解,我们尝试实现一个简易版列表,包括以下三个重点设计。 ‧ 初始容量:选取一个合理的数组初始容量。在本示例中,我们选择 10 作为初始容量。 ‧ 数量记录:声明一个变量 size ,用于记录0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.0.0b5 C++版的见解,帮助他人进步。 图 0‑6 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 1. 算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效率等方面 内容。 2. 刷算法题。建议从热门题目开刷,如剑指 Offer和LeetCode Hot 100,先积累至少 100 道题目,熟悉 主流的算法问题。初次刷题时,“知识 算法题目,实际上同时考察了数据结构和算法两方面的知识。 1.3 小结 ‧ 算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学会了许多 算法,用以解决生活中的大小问题。 ‧ 查阅字典的原理与二分查找算法相一致。二分查找算法体现了分而治之的重要算法思想。 第 1 章 初识算法 hello‑algo.com 15 ‧ 整理扑克的过程与插入排序算法非常类似。插入排序算法适合排序小型数据集。 许多编程语言都提供内置的列表,例如 Java、C++、Python 等。它们的实现比较复杂,各个参数的设定也 非常有考究,例如初始容量、扩容倍数等。感兴趣的读者可以查阅源码进行学习。 为了加深对列表工作原理的理解,我们尝试实现一个简易版列表,包括以下三个重点设计。 ‧ 初始容量:选取一个合理的数组初始容量。在本示例中,我们选择 10 作为初始容量。 ‧ 数量记录:声明一个变量 size,用于记录列0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 C++ 版資料結構與演算法入門教程。 ‧ 全書採用動畫圖解,內容清晰易懂、學習曲線平滑,引導初學者探索資料結構與演算法的知識地圖。 ‧ 源程式碼可一鍵執行,幫助讀者在練習中提升程式設計技能,瞭解演算法工作原理和資料結構底層實 現。 ‧ 提倡讀者互助學習,歡迎大家在評論區提出問題與分享見解,在交流討論中共同進步。 0.1.1 讀者物件 若你是演算法初學者,從未接觸過演算法,或者已經有一些刷題經驗,對資料結構與演算法有模糊的認識, 0‑7 評論區示例 0.2.5 演算法學習路線 從總體上看,我們可以將學習資料結構與演算法的過程劃分為三個階段。 1. 階段一:演算法入門。我們需要熟悉各種資料結構的特點和用法,學習不同演算法的原理、流程、用途 和效率等方面的內容。 2. 階段二:刷演算法題。建議從熱門題目開刷,先積累至少 100 道題目,熟悉主流的演算法問題。初次刷 題時,“知識遺忘”可能是一個挑戰,但請放心,這是很正 算法題目,實際上同時考查資料結構和演算法兩方面的知識。 1.3 小結 ‧ 演算法在日常生活中無處不在,並不是遙不可及的高深知識。實際上,我們已經在不知不覺中學會了許 多演算法,用以解決生活中的大小問題。 ‧ 查字典的原理與二分搜尋演算法相一致。二分搜尋演算法體現了分而治之的重要演算法思想。 第 1 章 初識演算法 www.hello‑algo.com 16 ‧ 整理撲克的過程與插入排序演算法非常類似。插入排序演算法適合排序小型資料集。0 码力 | 379 页 | 18.79 MB | 10 月前3
《深入浅出MFC》2/e您来,都非常高兴,相当期待 您的到来。 vi Rusty(枫桥驿站CompBook 版) 深入浅出MFC 我读好几遍了,讲一句实在话,这本书给我的帮助真的很多!毕竟这样深 入挖MFC 运作原理的书难找!要学MFC 又没有Windows SDK 经验者,建议跟 Programming Windows 95 with MFC 一起看,学起MFC 会比较扎实。 若单纯就「买了会不会后悔」来 的书都将重点放在如何使用 Microsoft Developer Studio,很少有对MFC 进行深入而有系统的讲解。而将C++ 与VC++ 相联系,从C++ 的角度来剖析MFC 的运作,深入其设计原理与内部机制的书,更是凤毛 麟角。本人在市面上找了将近四个月,才发现这样的一本,这就是由蜚声海峡两岸的著名电 脑专家侯俊杰先生所着之《深入浅出WINDOWS MFC 程序设计》(按:深入浅出MFC 初学者适合的好书? wayne.bbs@bbs.ee.ncu:侯俊杰的深入Visual C++(Inside visual C++ 中译本)不错, 适合初学者对MFC 做初步的认识与应用。深入浅出MFC 这一本原理讲的较多。 Sagitta.bbs@firebird.cs.ccu.edu.tw:Inside Visual C++ 4.0 不是初学者用的书,因为它未从 最基本观念讲起。深入浅出MFC 前半本都在描述(或说仿真)0 码力 | 1009 页 | 11.08 MB | 1 年前3
Hello 算法 1.0.0b4 C++版Figure 0‑6. 评论区示例 0.2.5. 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段: 1. 算法入门。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效率等方面 内容。 2. 刷算法题。建议从热门题目开刷,如剑指 Offer和LeetCode Hot 100,先积累至少 100 道题目,熟悉 主流的算法问题。初次刷题时,“知识 算法题目,实际上同时考察了数据结构和算法两方面的知识。 1.3. 小结 ‧ 算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学会了许多 算法,用以解决生活中的大小问题。 ‧ 查阅字典的原理与二分查找算法相一致。二分查找体现了分而治之的重要算法思想。 ‧ 整理扑克的过程与插入排序算法非常类似。插入排序适合排序小型数据集。 ‧ 货币找零的步骤本质上是贪心算法,每一步都采取当前看来的最好选择。 capacity = 100 、哈希算法 hash(key) = key ,易得哈希函数为 key % 100 。下图以 key 学号和 value 姓名为例,展示了哈希函数的工作原理。 Figure 6‑2. 哈希函数工作原理 以下代码实现了一个简单哈希表。其中,我们将 key 和 value 封装成一个类 Pair ,以表示键值对。 // === File: array_hash_map.cpp0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.0.0b2 C++版如何使用本书 建议通读本节内容,以获取最佳阅读体验。 0.2.1. 算法学习路线 总体上看,我认为可将学习数据结构与算法的过程分为三个阶段。 1. 算法入门。熟悉各种数据结构的特点、用法,学习各种算法的原理、流程、用途、效率等。 2. 刷算法题。可以先从热门题单开刷,推荐剑指 Offer、LeetCode Hot 100,先积累至少 100 道题量,熟 悉大多数的算法问题。刚开始刷题时,“遗忘”是 算法题目,实际上同时考察了数据结构和算法两部分知识。 1.3. 小结 ‧ 算法在生活中随处可见,并不高深莫测。我们已经不知不觉地学习到许多“算法”,用于解决生活中大大 小小的问题。 ‧“查字典”的原理和二分查找算法一致。二分体现分而治之的重要算法思想。 ‧ 算法是在有限时间内解决特定问题的一组指令或操作步骤,数据结构是在计算机中组织与存储数据的方 式。 ‧ 数据结构与算法两者紧密联系。数据 entry 中获取到 value 即可; 以上述学生数据 key 学号 -> value 姓名 为例,我们可以将「哈希函数」设计为 ?(?) = ?%100 Figure 6‑2. 哈希函数工作原理 // === File: array_hash_map.cpp === /* 键值对 int->String */ struct Entry { 6. 散列表 hello‑algo.com0 码力 | 197 页 | 15.72 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程章的结尾。 第 6 章: thrust 库 替换成 CUDA 官方提供的 thrust::universal_vector • 虽然自己实现 CudaAllocator 很有趣,也 帮助我们理解了底层原理。但是既然 CUDA 官方已经提供了 thrust 库,那就 用他们的好啦。 • universal_vector 会在统一内存上分配, 因此不论 GPU 还是 CPU 都可以直接访 问到。 了另一个线程才能进去,非常低效。 • 但是为什么这里用了 2^24 个元素,按理说应 该卡的不行了,却还是非常快的样子? • 那是因为 CUDA 编译器比较聪明,自动优化 了……稍后会解释他优化的原理。 解决:线程局部变量 • 解决方法之一就是:先累加到局部变量 local_sum ,最后一次性累加到全局的 sum 。 • 这样每个线程就只有一次原子操作,而不 是网格跨步循环的那么多次原子操作了。 效的,然而却没有低效,这是因为编译器自动优 化成刚刚用 BLS 的数组求和了!可以看到他优 化后的效率和我们的 BLS 相仿,甚至还要快一 些! • 结论:刚刚我们深入研究了如何 BLS 做数组求 和,只是出于学习原理的目的。实际做求和时, 直接写 atomicAdd 即可。反正编译器会自动帮 我们优化成 BLS ,而且他优化得比我们手写的 更好…… • 然后 atomicMax 求数组最大值,也同理。0 码力 | 142 页 | 13.52 MB | 1 年前3
共 19 条
- 1
- 2













