C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型
从稀疏数据结构到量化数据类型 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 要把浮点数转换成定点数,只需乘以 100 ,然后转换成 int 即可。 • 要从定点数中获取原来的浮点数,只需把定点数除以 100 即可。 • 注意:定点数的表示范围比较小,比如 0 到 99999 ,但精度均匀。 • 而浮点数表示范围很大,如 1e-9 到 1e9 ,但精度在数字大时变低。 图片解释定点数与浮点数的精度差别 浮点 定点 0 0.1 1 int8_t 表示 • 发现结果不对了……说明 int8_t 太小了(可以容纳 - 128 到 127 ),容纳不下 97*100 这么大的数,发生 了溢出导致结果错误。 试图解决:用 uint8_t 表示,定点数系数调小到 2 • 注意到我们的值始终是正数,因此可以用无符号的 uint8_t (可以容纳 0 到 255 ),然后把刚刚的系数 100 改小到 2 ,成功算对结果了,代价是精度损失了0 码力 | 102 页 | 9.50 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
这个 需求。 • 不过必须指定 --expt-relaxed-constexpr 这个选项才能 用这个特性,我们可以用 CMake 的生成器表达式来实 现只对 .cu 文件开启此选项(不然给到 gcc 就出错 了)。 • 当然, constexpr 里没办法调用 printf ,也不能用 __syncthreads 之类的 GPU 特有的函数,因此也不能 完全替代 __host__ <<>> 的简写而已。 图片解释三维的板块和线程 • 之所以会把 blockDim 和 gridDim 分三维主要是因为 GPU 的业务常常涉及到三维图形学和二维图像,觉得 这样很方便,并不一定 GPU 硬件上是三维这样排列 的。 • 三维情况下同样可以获取总的线程编号(扁平化)。 • 如需总的线程数量: blockDim * gridDim 里的板块数和线程数可以动态指定,无需 先传回到 CPU 再进行调用,这是 CUDA 特有的能力。 常用于这种情况:需要从 GPU 端动态计算出 blockDim 和 gridDim ,而又不希望导回数据到 CPU 导致强制同步影响性能。 这种模式被称为动态并行( dynamic parallelism ), OpenGL 有一 个 glDispatchComputeIndirect 的 API 和这个很像,但毕竟没有 0 码力 | 142 页 | 13.52 MB | 1 年前3《深入浅出MFC》2/e
点,但我觉得很值得,因为我可以感受出您真的非常用心在撰写,初阅读您的作品时,有时 不知其然,但只要用心品尝,总是入味七分。有些书教人一边看书一边上机实作,会是一个 比较好的学习曲线,但我是一个从基隆到台北通车的上班族,花很多时间在车上,在车上拜 读您的大作真是让人愉快的事情(我回到家已晚,也只有在车上能有时间充实自己)。这段 时间内,我无法上机,却能从中受益。而且一次再一次阅读,常会有新的收获,真如古人所 要啦)。这些「事情的因」在您的书中有大量详细的介绍。 新庄. 辅大skyman@tpts4.seed.net.tw 拜读您的大作深入浅出MFC 令我感到无比兴奋,对于您对计算机技术的专研如此深入,感 到真是中国人之光。系上同学对于您的书籍爱恨交加,爱是如此清晰明了,恨是恨自己不成 材呀!许多学长、同学、学弟都很喜爱您的作品,有些同学还拜您为偶像。因此想请您来演 说,让我们更深入认识程序语言的奥秘 一个品质上的保证,必定二话不说,抱回家啰!虽然眼前用不到,但是翻翻看,大致了解一 下,待有空时或是工作上需要时再好好细读。 网络书局的盛行,让我也开始上网买些书。但是我只敢买像您的书!有品质嘛!其它的可就 不敢直接买啰,总是必須到书局翻翻看,确定一下內容,才可能考虑。 vii 台北市Jedi Your books is already 100 times better than any translation on the0 码力 | 1009 页 | 11.08 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战
GPU 的三 维数组和 CPU 的三维数组之间拷贝数据。 CUDA 表面对象:封装 • 要访问一个多维数组,必须先创建一个表面对象 ( cudaSurfaceObject_t )。 • 考虑到多维数组始终是需要通过表面对象来访问的,这 里我们让表面对象继承自多维数组。 • 在核函数中可以用 surf3Dread 和 surf3Dwrite 来读写 表面对象中的元素, x,y,z 参数指定要访问元素的坐标 cudaBoundaryModeTrap :一旦越界就奔溃。 • cudaBoundaryModeClamp :越界则把 xyz 坐标钳 制( clamp )到原本的数组大小范围内,比如把 - 100 钳制到 0 , n+100 钳制到 n-1 。 • cudaBoundaryModeZero :对于读来说越界会读取到 0 ;对于写来说越界会放弃写入,不修改数组中的任 何值。 • 表面 然后,在 SmokeSim::advection 中调用 advect_kernel 和 resample_kernel 。 • 首先通过 advect_kernel 算出对流后要采样的位置,写入到 loc 。然后再对 clr 和 vel 分别从 loc 算出的位置重 新采样。核函数的 gridDim 通过上整除技巧保证每个元素都能访问到, blockDim 为 8x8x8=512 。 • 如果在0 码力 | 58 页 | 14.90 MB | 1 年前3Hello 算法 1.0.0b4 C++版
。请务必记住这些名词,包括英文翻译,以 便后续阅读文献时使用。 ‧ 加粗的文字 表示重点内容或总结性语句,这类文字值得特别关注。 ‧ 专有名词和有特指含义的词句会使用“双引号” 标注,以避免歧义。 ‧ 涉及到编程语言之间不一致的名词,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 终得到了可行的找零方 案。从数据结构与算法的角度看,这种方法本质上是「贪心算法」。 1. 初识算法 hello‑algo.com 9 Figure 1‑3. 货币找零过程 小到烹饪一道菜,大到星际航行,几乎所有问题的解决都离不开算法。计算机的出现使我们能够通过编程将 数据结构存储在内存中,同时编写代码调用 CPU 和 GPU 执行算法。这样一来,我们就能把生活中的问题转 移到计算机上,以更高效的方式解决各种复杂问题。 等学完必读章节后再单独攻克。 3.3.1. 原码、反码和补码 从上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个。例如,byte 的取值范围是 [−128, 127] 。这个现象比较反直觉,它的内在原因涉及到原码、反码、补码的相关知识。在展开分析之前, 我们首先给出三者的定义: ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 0 表示正数,1 表示负数,其余位表示数字 的值。 ‧ 反码:0 码力 | 343 页 | 27.39 MB | 1 年前3Hello 算法 1.1.0 C++ 版
代的计数方法和工具制作步骤等。随着文明的进步,算法逐渐变得更加精细和复杂。从巧夺天工的匠人技艺、 到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 案。从数据结构与算法的角度看,这种方法本质上是“贪心”算法。 小到烹饪一道菜,大到星际航行,几乎所有问题的解决都离不开算法。计算机的出现使得我们能够通过编程 将数据结构存储在内存中,同时编写代码调用 CPU 和 GPU 执行算法。这样一来,我们就能把生活中的问题 转移到计算机上,以更高效的方式解决各种复杂问题。 接下来将子问题继续分解为更小的子问题,直到基本情况时停止(基本情况的解是已知的)。 以上述求和函数为例,设问题 ?(?) = 1 + 2 + ⋯ + ? 。 ‧ 迭代:在循环中模拟求和过程,从 1 遍历到 ? ,每轮执行求和操作,即可求得 ?(?) 。 ‧ 递归:将问题分解为子问题 ?(?) = ?+?(?−1) ,不断(递归地)分解下去,直至基本情况 ?(1) = 1 时终止。 1. 调用栈0 码力 | 379 页 | 18.47 MB | 1 年前3Hello 算法 1.0.0b5 C++版
标注,以避免歧义。 ‧ 重要专有名词及其英文翻译会用「」 括号标注,例如「数组 array」 。建议记住它们,以便阅读文献。 ‧ 加粗的文字 表示重点内容或总结性语句,这类文字值得特别关注。 ‧ 当涉及到编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 为你解答,一般情况下可在两天内回复。 第 0 章 前言 hello‑algo.com 7 如图 0‑6 所示,每篇文章的底部都配有评论区。希望你能多关注评论区的内容。一方面,你可以了解大家遇 到的问题,从而查漏补缺,激发更深入的思考。另一方面,期待你能慷慨地回答其他小伙伴的问题,分享您 的见解,帮助他人进步。 图 0‑6 评论区示例 0.2.5 算法学习路线 从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 案。从数据结构与算法的角度看,这种方法本质上是“贪心”算法。 小到烹饪一道菜,大到星际航行,几乎所有问题的解决都离不开算法。计算机的出现使我们能够通过编程将 数据结构存储在内存中,同时编写代码调用 CPU 和 GPU 执行算法。这样一来,我们就能把生活中的问题转 移到计算机上,以更高效的方式解决各种复杂问题。0 码力 | 377 页 | 30.69 MB | 1 年前3Hello 算法 1.0.0 C++版
货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 案。从数据结构与算法的角度看,这种方法本质上是“贪心”算法。 小到烹饪一道菜,大到星际航行,几乎所有问题的解决都离不开算法。计算机的出现使得我们能够通过编程 将数据结构存储在内存中,同时编写代码调用 CPU 和 GPU 执行算法。这样一来,我们就能把生活中的问题 转移到计算机上,以更高效的方式解决各种复杂问题。 接下来将子问题继续分解为更小的子问题,直到基本情况时停止(基本情况的解是已知的)。 以上述求和函数为例,设问题 ?(?) = 1 + 2 + ⋯ + ? 。 ‧ 迭代:在循环中模拟求和过程,从 1 遍历到 ? ,每轮执行求和操作,即可求得 ?(?) 。 ‧ 递归:将问题分解为子问题 ?(?) = ?+?(?−1) ,不断(递归地)分解下去,直至基本情况 ?(1) = 1 时终止。 1. 调用栈 ,与正零的补码相同。这意味着在补码表示中只存在一个零,正负零歧义 从而得到解决。 还剩最后一个疑惑:byte 类型的取值范围是 [−128, 127] ,多出来的一个负数 −128 是如何得到的呢?我 们注意到,区间 [−127, +127] 内的所有整数都有对应的原码、反码和补码,并且原码和补码之间可以互相 转换。 然而,补码 1000 0000 是一个例外,它并没有对应的原码。根据转换方法,我们得到该补码的原码为0 码力 | 378 页 | 17.59 MB | 1 年前3Hello 算法 1.2.0 简体中文 C++ 版
代的计数方法和工具制作步骤等。随着文明的进步,算法逐渐变得更加精细和复杂。从巧夺天工的匠人技艺、 到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 案。从数据结构与算法的角度看,这种方法本质上是“贪心”算法。 小到烹饪一道菜,大到星际航行,几乎所有问题的解决都离不开算法。计算机的出现使得我们能够通过编程 将数据结构存储在内存中,同时编写代码调用 CPU 和 GPU 执行算法。这样一来,我们就能把生活中的问题 转移到计算机上,以更高效的方式解决各种复杂问题。 接下来将子问题继续分解为更小的子问题,直到基本情况时停止(基本情况的解是已知的)。 以上述求和函数为例,设问题 ?(?) = 1 + 2 + ⋯ + ? 。 ‧ 迭代:在循环中模拟求和过程,从 1 遍历到 ? ,每轮执行求和操作,即可求得 ?(?) 。 ‧ 递归:将问题分解为子问题 ?(?) = ?+?(?−1) ,不断(递归地)分解下去,直至基本情况 ?(1) = 1 时终止。 1. 调用栈0 码力 | 379 页 | 18.48 MB | 9 月前3Hello 算法 1.2.0 繁体中文 C++ 版
程式碼審閱:宮蘭景(@Gonglja) Release 1.2.0 2024‑12‑06 序 兩年前,我在力扣上分享了“劍指 Offer”系列題解,受到了許多讀者的鼓勵與支持。在與讀者交流期間,我 最常被問到的一個問題是“如何入門演算法”。漸漸地,我對這個問題產生了濃厚的興趣。 兩眼一抹黑地刷題似乎是最受歡迎的方法,簡單、直接且有效。然而刷題就如同玩“踩地雷”遊戲,自學能 力強的人能夠順利將地雷逐個排 古代的計數方法與工具製作步驟等。隨著文明的進步,演算法逐漸變得更加精細和複雜。從巧奪天工的匠人 技藝、到解放生產力的工業產品、再到宇宙運行的科學規律,幾乎每一件平凡或令人驚嘆的事物背後,都隱 藏著精妙的演算法思想。 同樣,資料結構無處不在:大到社會網絡,小到地鐵路線,許多系統都可以建模為“圖”;大到一個國家,小 到一個家庭,社會的主要組織形式呈現出“樹”的特徵;冬天的衣服就像“堆疊”,最先穿上的最後才能脫下; 一位少女翩翩起舞,與資料交織在一起,裙襬上飄揚著演算法的旋律。 她邀請你共舞,請緊跟她的步伐,踏入充滿邏輯與美感的演算法世界。 第 1 章 初識演算法 www.hello‑algo.com 11 1.1 演算法無處不在 當我們聽到“演算法”這個詞時,很自然地會想到數學。然而實際上,許多演算法並不涉及複雜數學,而是 更多地依賴基本邏輯,這些邏輯在我們的日常生活中處處可見。 在正式探討演算法之前,有一個有趣的事實值得分享:你已0 码力 | 379 页 | 18.79 MB | 9 月前3
共 118 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12