C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战
动其指针的方式来实现双缓 冲( std::swap )。 对流部分 对流部分:计算对流后位置( RK3 ) • 这里我参考了 Taichi 官方案例中的 stable_fluid.py 代码(二维定常流仿真),主要由 k-ye 编写 ,我学习 GAMES201 后贡献了支持 RK2 和 RK3 的版本。这里我们用高效的 CUDA 纹理对象 在 C++ 中重新实现了一遍,利用了硬件的三线性插值实现半拉格朗日( ;带入 dv/dt = -p 得 div grad p = 0 。 • 因此为了模拟不可压缩流我们要求保证 p 满足 div grad p = 0 ? • 不妨假设现在 div v ≠ 0 ,然后想办法如何通过修正压强来消除他,即让 div grad p = -div v 。 • 因此为了模拟不可压缩流我们要求解压强的泊松方程!泊松方程的右边就是负的速度散度 。 投影部分:求速度的散度 当然, jacobi 迭代因为需要写入 pre 的同时读取 pre ,所以也要用双缓冲。 投影部分:计算未消除的散度 为了评估效果的好坏,额外加一个计算散度方差的核函数,看看是不是无散度(不可压缩流)了。 多重网格法 投影部分:多重网格实现 投影部分:红黑高斯 投影部分:计算残差 投影部分:缩小一倍 投影部分:清零数组 投影部分:扩大一倍 创建与导出 主函数:创建场景 导出 VDB0 码力 | 58 页 | 14.90 MB | 1 年前3现代C++ 教程:高速上手C++11/14/17/20
decltype(auto) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.4 控制流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 return lookup1(); } decltype(auto) look_up_a_string_2() { return lookup2(); } 22 2.4 控制流 第 2 章语言可用性的强化 2.4 控制流 if constexpr 正如本章开头出,我们知道了 C++11 引入了 constexpr 关键字,它将表达式或函数编译为常量结 果。一个很自然的想法是,如果我们把这0 码力 | 83 页 | 2.42 MB | 1 年前3《深入浅出MFC》2/e
Scribble Step4 做準備 / 543 第9章 訊息映射與命令繞行 / 547 到底要解決什麼 / 547 訊息分類 / 549 萬流歸宗 Command Target(CCmdTarget) / 550 ㆔個奇怪的巨集,㆒張巨大的網 / 551 DECLARE_MESSAGE_MAP 巨集 訊息映射網的形成:BEGIN_/ON_/END_ 巨集 / 544 米諾托斯(Minotauros)與西修斯(Theseus) / 560 兩萬五千里長征 - 訊息的流竄 / 566 直線㆖溯(㆒般 Windows 訊息) / 567 拐彎㆖溯(WM_COMMAND 命令訊息) / 572 深入淺出 MFC ument/view,没 有关系);因此,消息应该有横向流动的机会。MFC 对于消息绕行的规定是: 如果是一般的Windows 消息(WM_xxx),一定是由衍生类别流向基础类别, 没有旁流的可能。 如果是命令消息WM_COMMAND,就有奇特的路线了: 命令消息接收物的类型 处理次序 窗口 2. Frame 窗口本身 3. CWinApp 对象 目前我们还不知道什么是0 码力 | 1009 页 | 11.08 MB | 1 年前3Hello 算法 1.0.0b4 C++版
组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程。这种循 环的操作就可以通过循环链表来实现。 ‧ 数据缓冲区:在某些数据缓冲区的实现中,也可能会使用到循环链表。比如在音频、视频播放器中,数 据流可能会被分成多个缓冲块并放入一个循环链表,以便实现无缝播放。 4.3. 列表 数组长度不可变导致实用性降低。在许多情况下,我们事先无法确定需要存储多少数据,这使数组长度的选 择变得困难。若长度过 Figure 7‑23. 二叉搜索树的平衡与退化 7.4.3. 二叉搜索树常见应用 ‧ 用作系统中的多级索引,实现高效的查找、插入、删除操作。 ‧ 作为某些搜索算法的底层数据结构。 ‧ 用于存储数据流,以保持其有序状态。 7.5. AVL 树 * 在二叉搜索树章节中,我们提到了在多次插入和删除操作后,二叉搜索树可能退化为链表。这种情况下,所 有操作的时间复杂度将从 ?(log ?) 恶化为 ,因此时间复杂度为 ?(? log ?) 。该方法的效率很高,当 ? 较小时,时间复杂度趋向 ?(?) ;当 ? 较大时,时间复杂度不会超过 ?(? log ?) 。 另外,该方法适用于动态数据流的使用场景。在不断加入数据时,我们可以持续维护堆内的元素,从而实现 最大 ? 个元素的动态更新。 8. 堆 hello‑algo.com 162 // === File: top_k.cpp ===0 码力 | 343 页 | 27.39 MB | 1 年前3Hello 算法 1.1.0 C++ 版
组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程。这种循 环操作可以通过环形链表来实现。 ‧ 数据缓冲区:在某些数据缓冲区的实现中,也可能会使用环形链表。比如在音频、视频播放器中,数据 流可能会被分成多个缓冲块并放入一个环形链表,以便实现无缝播放。 4.3 列表 列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历 等操作,无须使用 (?) 。 图 7‑23 二叉搜索树退化 7.4.3 二叉搜索树常见应用 ‧ 用作系统中的多级索引,实现高效的查找、插入、删除操作。 ‧ 作为某些搜索算法的底层数据结构。 ‧ 用于存储数据流,以保持其有序状态。 7.5 AVL 树 * 在“二叉搜索树”章节中我们提到,在多次插入和删除操作后,二叉搜索树可能退化为链表。在这种情况下, 所有操作的时间复杂度将从 ?(log ?) 劣化为 ,因此时间复杂度为 ?(? log ?) 。该方法的效率很高,当 ? 较小时,时间复杂度趋向 ?(?) ;当 ? 较大时,时间复杂度不会超过 ?(? log ?) 。 另外,该方法适用于动态数据流的使用场景。在不断加入数据时,我们可以持续维护堆内的元素,从而实现 最大的 ? 个元素的动态更新。 8.4 小结 1. 重点回顾 ‧ 堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。0 码力 | 379 页 | 18.47 MB | 1 年前3Hello 算法 1.0.0b5 C++版
组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程。这种循 环的操作就可以通过循环链表来实现。 ‧ 数据缓冲区:在某些数据缓冲区的实现中,也可能会使用到循环链表。比如在音频、视频播放器中,数 据流可能会被分成多个缓冲块并放入一个循环链表,以便实现无缝播放。 第 4 章 数组与链表 hello‑algo.com 76 4.3 列表 数组长度不可变导致实用性降低。在实际中,我们可能事先无法确定需要存储多少数据,这使数组长度的选 (?) 。 图 7‑23 二叉搜索树的退化 7.4.3 二叉搜索树常见应用 ‧ 用作系统中的多级索引,实现高效的查找、插入、删除操作。 ‧ 作为某些搜索算法的底层数据结构。 ‧ 用于存储数据流,以保持其有序状态。 7.5 AVL 树 * 在二叉搜索树章节中,我们提到了在多次插入和删除操作后,二叉搜索树可能退化为链表。这种情况下,所 有操作的时间复杂度将从 ?(log ?) 恶化为 ?( ,因此时间复杂度为 ?(? log ?) 。该方法的效率很高,当 ? 较小时,时间复杂度趋向 ?(?) ;当 ? 较大时,时间复杂度不会超过 ?(? log ?) 。 另外,该方法适用于动态数据流的使用场景。在不断加入数据时,我们可以持续维护堆内的元素,从而实现 最大 ? 个元素的动态更新。 // === File: top_k.cpp === /* 基于堆查找数组中最大的 k 个元素 */0 码力 | 377 页 | 30.69 MB | 1 年前3Hello 算法 1.0.0 C++版
组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程。这种循 环操作可以通过环形链表来实现。 ‧ 数据缓冲区:在某些数据缓冲区的实现中,也可能会使用环形链表。比如在音频、视频播放器中,数据 流可能会被分成多个缓冲块并放入一个环形链表,以便实现无缝播放。 4.3 列表 「列表 list」是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历 等操作,无须使 (?) 。 图 7‑23 二叉搜索树退化 7.4.3 二叉搜索树常见应用 ‧ 用作系统中的多级索引,实现高效的查找、插入、删除操作。 ‧ 作为某些搜索算法的底层数据结构。 ‧ 用于存储数据流,以保持其有序状态。 7.5 AVL 树 * 在“二叉搜索树”章节中我们提到,在多次插入和删除操作后,二叉搜索树可能退化为链表。在这种情况下, 所有操作的时间复杂度将从 ?(log ?) 劣化为 ,因此时间复杂度为 ?(? log ?) 。该方法的效率很高,当 ? 较小时,时间复杂度趋向 ?(?) ;当 ? 较大时,时间复杂度不会超过 ?(? log ?) 。 另外,该方法适用于动态数据流的使用场景。在不断加入数据时,我们可以持续维护堆内的元素,从而实现 最大的 ? 个元素的动态更新。 8.4 小结 1. 重点回顾 ‧ 堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。0 码力 | 378 页 | 17.59 MB | 1 年前3Hello 算法 1.2.0 简体中文 C++ 版
组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU 将切换到下一个进程。这种循 环操作可以通过环形链表来实现。 ‧ 数据缓冲区:在某些数据缓冲区的实现中,也可能会使用环形链表。比如在音频、视频播放器中,数据 流可能会被分成多个缓冲块并放入一个环形链表,以便实现无缝播放。 4.3 列表 列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历 等操作,无须使用 (?) 。 图 7‑23 二叉搜索树退化 7.4.3 二叉搜索树常见应用 ‧ 用作系统中的多级索引,实现高效的查找、插入、删除操作。 ‧ 作为某些搜索算法的底层数据结构。 ‧ 用于存储数据流,以保持其有序状态。 7.5 AVL 树 * 在“二叉搜索树”章节中我们提到,在多次插入和删除操作后,二叉搜索树可能退化为链表。在这种情况下, 所有操作的时间复杂度将从 ?(log ?) 劣化为 ,因此时间复杂度为 ?(? log ?) 。该方法的效率很高,当 ? 较小时,时间复杂度趋向 ?(?) ;当 ? 较大时,时间复杂度不会超过 ?(? log ?) 。 另外,该方法适用于动态数据流的使用场景。在不断加入数据时,我们可以持续维护堆内的元素,从而实现 最大的 ? 个元素的动态更新。 8.4 小结 1. 重点回顾 ‧ 堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。0 码力 | 379 页 | 18.48 MB | 10 月前3C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化
类型。 • addss :一个 float 加法。 • addsd :一个 double 加法。 • addps :四个 float 加法。 • addpd :两个 double 加法。 省流助手: 如果你看到编译器生成的汇编里,有大量 ss 结尾 的指令则说明矢量化失败;如果看到大多数都是 ps 结尾则说明矢量化成功。 xmm0 xmm1 xmm0 addss %xmm1, %xmm00 码力 | 108 页 | 9.47 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器
char * 的爱恨纠葛 4. 万能的 map 容器全家桶及其妙用举例 5. 函子 functor 与 lambda 表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 set 和 vector 的区别 • 都是能存储一连串数据的容器 。 •0 码力 | 83 页 | 10.23 MB | 1 年前3
共 15 条
- 1
- 2