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));0 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化区别是浮点的乘法和加法基本是一样速度。 • L1/2/3 read 和 Main RAM read 的时间指的是 读一个缓存行( 64 字节)所花费的时间。 • 根据计算: 125/64*4≈8 • 即从主内存读取一次 float 花费 8 个 cycle , 符合小彭老师的经验公式。 • “right” 和“ wrong” 指的是分支预测是否成功。 多少计算量才算多? • 看右边的 func ,够复杂了吧?也只是勉勉强强超过一 二级缓存和三级缓存的大小附近。 • 因此,数据小到装的进二级缓存,则最大带 宽就取决于二级缓存的带宽。稍微大一点则 只能装到三级缓存,就取决于三级缓存的带 宽。三级缓存也装不下,那就取决于主内存 的带宽了。 • 结论:要避免 mem-bound ,数据量尽量足 够小,如果能装的进缓存就高效了。 L2: 256 KB L3: 12 MB 缓存的工作机制:读 • 缓存中存储的数据结构: • }; • CacheEntry cache[512]; • 当 CPU 读取一个地址时: • 缓存会查找和该地址匹配的条目。如果找到,则给 CPU 返 回缓存中的数据。如果找不到,则向主内存发送请求,等读 取到该地址的数据,就创建一个新条目。 • 在 x86 架构中每个条目的存储 64 字节的数据,这个条目 又称之为缓存行( cacheline )。 • 当访问 0x0048~0x00500 码力 | 147 页 | 18.88 MB | 1 年前3
《深入浅出MFC》2/eCWinApp::InitApplication / 372 CMyWinApp::InitInstance / 374 CFrameWnd::Create 產生主視窗(並註冊視窗類別) / 376 * 奇怪的視窗類別名稱 Afx:b:14ae:6:3e8f / 387 視窗顯示與更新 / 389 類別? / 423 Document Template 的意義 / 430 Scribble 的 Document/View 設計 / 436 主視窗的誕生 / 438 工具列和狀態列的誕生(Toolbar & Status bar) / 440 滑鼠拖放(Drag and Drop) / 442 要一套Visual C++ 32 位版。目前的最新版本是Visual C++ 5.0,也是我使用的版本。 深入淺出 MFC 30 硬件方面,只要能跑上述两种操作系统就算过关。内存(RAM)是影响运作速度的主 因,多多益善。厂商宣称16MB RAM 是一个能够使你工作舒适的数字,但我因此怀疑 「舒适」这个字眼的定义。写作本书时我的软硬件环境是: ■ Pentium 133 ■ 96M RAM0 码力 | 1009 页 | 11.08 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 C++ 版感謝校銓在智慧財產權方面提供的專業幫助,這對本開源書的完善起到了重要作用; ‧ 感謝蘇潼為本書設計了精美的封面和 logo ,並在我的強迫症的驅使下多次耐心修改; ‧ 感謝 @squidfunk 提供的排版建議,以及他開發的開源文件主題 Material‑for‑MkDocs 。 在寫作過程中,我閱讀了許多關於資料結構與演算法的教材和文章。這些作品為本書提供了優秀的範本,確 保了本書內容的準確性與品質。在此感謝所有老師和前輩的傑出貢獻! */ 0.2.2 在動畫圖解中高效學習 相較於文字,影片和圖片具有更高的資訊密度和結構化程度,更易於理解。在本書中,重點和難點知識將主 要透過動畫以圖解形式展示,而文字則作為解釋與補充。 如果你在閱讀本書時,發現某段內容提供瞭如圖 0‑2 所示的動畫圖解,請以圖為主、以文字為輔,綜合兩者 來理解內容。 圖 0‑2 動畫圖解示例 0.2.3 在程式碼實踐中加深理解 本書的配套程式碼託管在 GitHub 本書的主要受眾是演算法初學者。如果你已有一定基礎,本書能幫助你系統回顧演算法知識,書中源程 式碼也可作為“刷題工具庫”使用。 ‧ 書中內容主要包括複雜度分析、資料結構和演算法三部分,涵蓋了該領域的大部分主題。 ‧ 對於演算法新手,在初學階段閱讀一本入門書至關重要,可以少走許多彎路。 ‧ 書中的動畫圖解通常用於介紹重點和難點知識。閱讀本書時,應給予這些內容更多關注。 ‧ 實踐乃學習程式設計之最佳途0 码力 | 379 页 | 18.79 MB | 10 月前3
Hello 算法 1.0.0b5 C++版// 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画和图解形式展示,而文字则作为动画和图片的解释与补充。 如果你在阅读本书时,发现某段内容提供了图 0‑2 所示的动画或图解,请以图为主、以文字为辅,综合两者 来理解内容。 图 0‑2 树”或“红黑树”,从而 将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.2 开放寻址 「开放寻址 open addressing」不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主 要包括线性探测、平方探测、多次哈希等。 1. 线性探测 线性探测采用固定步长的线性搜索来进行探测,其操作方法与普通哈希表有所不同。 ‧ 插入元素:通过哈希函数计算数组索引,若发现桶内已有元素,则从冲突位置向后线性遍历(步长通常 表示两顶点之间无边。 第 9 章 图 hello‑algo.com 190 图 9‑5 图的邻接矩阵表示 邻接矩阵具有以下特性。 ‧ 顶点不能与自身相连,因此邻接矩阵主对角线元素没有意义。 ‧ 对于无向图,两个方向的边等价,此时邻接矩阵关于主对角线对称。 ‧ 将邻接矩阵的元素从 1 和 0 替换为权重,则可表示有权图。 使用邻接矩阵表示图时,我们可以直接访问矩阵元素以获取边,因此增删查操作的效率很高,时间复杂度均0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0b4 C++版表示两顶点之间无边。 9. 图 hello‑algo.com 166 Figure 9‑5. 图的邻接矩阵表示 邻接矩阵具有以下特性: ‧ 顶点不能与自身相连,因此邻接矩阵主对角线元素没有意义。 ‧ 对于无向图,两个方向的边等价,此时邻接矩阵关于主对角线对称。 ‧ 将邻接矩阵的元素从 1 , 0 替换为权重,则可表示有权图。 使用邻接矩阵表示图时,我们可以直接访问矩阵元素以获取边,因此增删查操作的效率很高,时间复杂度均 j >= size() || i == j) { 9. 图 hello‑algo.com 170 throw out_of_range(" 顶点不存在"); } // 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) adjMat[i][j] = 1; adjMat[j][i] = 1; } /* 删除边 */ // 参数 i, j 对应 vertices 这个结论与线性查找和二分查找的适用情况的结论类似。快速排序这类 ?(? log ?) 的算法属于基于分治的 排序算法,往往包含更多单元计算操作。而在数据量较小时,?2 和 ? log ? 的数值比较接近,复杂度不占主 导作用;每轮中的单元计算操作数量起到决定性因素。 实际上,许多编程语言(例如 Java)的内置排序函数都采用了插入排序,大致思路为:对于长数组,采用基 于分治的排序算法,例如快速排序;对于短数组,直接使用插入排序。0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版// 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画以图解形式展示,而文字则作为解释与补充。 如果你在阅读本书时,发现某段内容提供了如图 0‑2 所示的动画图解,请以图为主、以文字为辅,综合两者 来理解内容。 图 0‑2 动画图解示例 树”或“红黑树”,从而 将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.2 开放寻址 开放寻址(open addressing)不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主 要包括线性探测、平方探测和多次哈希等。 第 6 章 哈希表 hello‑algo.com 125 下面以线性探测为例,介绍开放寻址哈希表的工作机制。 1. 线性探测 线性探测采用固定步长的 之间存在边,反之 ?[?, ?] = 0 表示两顶点之间无边。 图 9‑5 图的邻接矩阵表示 邻接矩阵具有以下特性。 ‧ 顶点不能与自身相连,因此邻接矩阵主对角线元素没有意义。 ‧ 对于无向图,两个方向的边等价,此时邻接矩阵关于主对角线对称。 ‧ 将邻接矩阵的元素从 1 和 0 替换为权重,则可表示有权图。 第 9 章 图 hello‑algo.com 192 使用邻接矩阵表示图时,0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版0 章 前言 hello‑algo.com 5 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画以图解形式展示,而文字则作为解释与补充。 如果你在阅读本书时,发现某段内容提供了如图 0‑2 所示的动画图解,请以图为主、以文字为辅,综合两者 来理解内容。 图 0‑2 动画图解示例 树”或“红黑树”,从而 将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.2 开放寻址 「开放寻址 open addressing」不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主 要包括线性探测、平方探测和多次哈希等。 第 6 章 哈希表 hello‑algo.com 125 下面以线性探测为例,介绍开放寻址哈希表的工作机制。 1. 线性探测 线性探测采用固定步长的 表示两顶点之间无边。 第 9 章 图 hello‑algo.com 192 图 9‑5 图的邻接矩阵表示 邻接矩阵具有以下特性。 ‧ 顶点不能与自身相连,因此邻接矩阵主对角线元素没有意义。 ‧ 对于无向图,两个方向的边等价,此时邻接矩阵关于主对角线对称。 ‧ 将邻接矩阵的元素从 1 和 0 替换为权重,则可表示有权图。 使用邻接矩阵表示图时,我们可以直接访问矩阵元素以获取边,因此增删查改操作的效率很高,时间复杂度0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版// 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画以图解形式展示,而文字则作为解释与补充。 如果你在阅读本书时,发现某段内容提供了如图 0‑2 所示的动画图解,请以图为主、以文字为辅,综合两者 来理解内容。 图 0‑2 动画图解示例 树”或“红黑树”,从而 将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.2 开放寻址 开放寻址(open addressing)不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主 要包括线性探测、平方探测和多次哈希等。 第 6 章 哈希表 www.hello‑algo.com 125 下面以线性探测为例,介绍开放寻址哈希表的工作机制。 1. 线性探测 线性探测采用固 之间存在边,反之 ?[?, ?] = 0 表示两顶点之间无边。 图 9‑5 图的邻接矩阵表示 邻接矩阵具有以下特性。 ‧ 在简单图中,顶点不能与自身相连,此时邻接矩阵主对角线元素没有意义。 ‧ 对于无向图,两个方向的边等价,此时邻接矩阵关于主对角线对称。 ‧ 将邻接矩阵的元素从 1 和 0 替换为权重,则可表示有权图。 第 9 章 图 www.hello‑algo.com 192 使用邻接矩阵表0 码力 | 379 页 | 18.48 MB | 10 月前3
C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战各维度上的大小通过 cudaExtent 指定,方 便起见我们的 C++ 封装类用了 uint3 表示 大小。 • GPU 的多维数组有特殊的数据排布来保障 访存的高效,和我们 CPU 那样简单地行主 序或列主序(如 a[x + nx * y] )的多维数组 不一样。 • 随后可用 cudaMemcpy3D 在 GPU 的三 维数组和 CPU 的三维数组之间拷贝数据。 CUDA 表面对象:封装 是不是无散度(不可压缩流)了。 多重网格法 投影部分:多重网格实现 投影部分:红黑高斯 投影部分:计算残差 投影部分:缩小一倍 投影部分:清零数组 投影部分:扩大一倍 创建与导出 主函数:创建场景 导出 VDB :调用接口 导出 VDB :分离实现 CMake :使用 CUDA 编译器,链接 OpenVDB 在 Blender 中查看导出的结果 边界条件 边界条件:初始化0 码力 | 58 页 | 14.90 MB | 1 年前3
共 17 条
- 1
- 2













