《深入浅出MFC》2/eBEGIN_MESSAGE_MAP 这是MFC 宏 public 这是C++ 语言保留字 当我解释程序操作步骤时,如果使用中括号,例如【File/New】,表示选按File 菜单中 的New 命令项。或者用来表示一个对话窗,例如我写:【New Project】对话窗。 磁盘内容与安装 本书光盘片内含书中所有的范例程序,包括源代码与EXE 档。中介文件(如.OBJ 和.RES 等)并未放入。所有程序都可以在Visual 程序的事件驱动特性的了解(包 括消息的产生、获得、分派、判断、处理),以及对C++ 多态(polymorphism)的精确 体会。本章所提出的,是我对第一项必要基础的探讨,你可以从中获得关于Windows 程 序的诞生与死亡,以及多任务环境下程序之间共存的观念。至于第二项基础,将由第二章 为你夯实。 4 让我再强调一遍,本章就是我认为Windows 程序设计者一定要知道的基础知识。一个 连这些基础都不 LONG OnCreate(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam) { ... } 与处理例程之对照表格 这是WM_COMMAND 命令项这是命令处理例程 于是窗口函数可以这么设计: 窗口函数 消息对照表 专门处理 WM_COMMAND 命令项目对照表 ↑ ↑ 22 //----------0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅就无法处理,造成“无响应”现象。 C 的请 求进来,则还得继续排队…… • 每个请求开启一个线程来处理,这样处理 A 用户的同时还可以继续监听 B 用户发 来的请求,及时响应,改善用户体验。 • 并行:某图形学爱好者购置了一台 4 核处理 器的电脑,他正在渲染 cornell box 的图像, 这个图像在单核上渲染需要 4 分钟。 • 他把图像切成 4 份,每个是原来的 1/4 大小 ,这样每个小块渲染只需要 4 个小块发给 4 个处理器核心, 1 分钟后 4 个处理器都渲染完毕得到结果。 • 最后只需将 4 个小块拼接起来即可得到完整 的 cornell box 图像。总共只花了 1 分钟。 图形学爱好者:我看中的是多核,目的是加速比,如果是单核,那多线程对我无用! 某互联网公司:我看中的是异步,目的是无阻塞,即使是单核,多线程对我也有用。 因特尔开源的并行编程库: TBB https://link 构建目标的 cmake 项目,有病啊! 你妨碍别人作为子模块用你的项目。没错说的就是你 OpenSim ,张心欣当时浪费好多时间伺候这个沙雕库。 还要指定一个环境变量 SIMBODY_HOME 指向他的依赖项 SimBody 的源码路径,这么 dedicated 让人咋 用? 第 4 章:任务域与嵌套 https://link.springer.com/chapter/10.1007%2F978-1-4842-4398-5_120 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起google/googletest - 谷歌单元测试框架 8. google/benchmark - 谷歌性能评估框架 9. glfw/glfw - OpenGL 窗口和上下文管理 10.libigl/libigl - 各种图形学算法大合集 fmt - 使用这个神奇的格式化库 • fmt::format 的用法和 Python 的 str.format 大致相似: CMake - 引用系统中预安装的第三方库 • 可以通过 find_package 编写的脚本(例如 /usr/lib/cmake/TBB/TBBConfig.cmake )能够自动查找所有依赖,并利用刚刚提 到的 PUBLIC PRIVATE 正确处理依赖项,比如如果你引用了 OpenVDB::openvdb 那么 TBB::tbb 也会被自动引用。 • 其他包的引用格式和文档参考: https://cmake.org/cmake/help/latest/module/FindBLAS0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程1, 1), dim3(n, 1, 1)>>> 的简写而已。 图片解释三维的板块和线程 • 之所以会把 blockDim 和 gridDim 分三维主要是因为 GPU 的业务常常涉及到三维图形学和二维图像,觉得 这样很方便,并不一定 GPU 硬件上是三维这样排列 的。 • 三维情况下同样可以获取总的线程编号(扁平化)。 • 如需总的线程数量: blockDim * gridDim __device__ 或 __global__ 函数,就会出错 。 分离 __device__ 函数的声明和定义:解决 • 开启 CMAKE_CUDA_SEPARABLE_COMPILATION 选 项(设为 ON ),即可启用分离声明和定义的支持。 • 不过我还是建议把要相互调用的 __device__ 函数放在 同一个文件,这样方便编译器自动内联优化(第四课讲 过)。 两种开启方式:全局有效0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 CFD 仿真、深度学习编程人 员 第 0 章:稀疏矩阵 稠密数组存储矩阵 用 foreach 包装一下枚举的过程 改用 map 来存储 分离 read/write/create 三种访问模式 double :每个占据 8 字节 • 很多 CFD 玩家喜欢用 double 表示浮点 数。 • 然而 double 是双精度浮点数,会占据 8 字节!虽然精度更高,但是在不需要精度 的图形学应用中,就非常浪费内存带宽。 使用 float :每个占据 4 字节 • 可以用单精度的 float ,只占据 4 字节。 • 因为这里的循环体是内存瓶颈( membound ), 就直接加快了 )。这就是浮点数的 量化,存储时转换成低精度的定点数,读取时再转换 回高精度的浮点数,从而节省 4 倍内存带宽,提升 GPU 性能。 有没有更小的浮点类型? • 浮点数在接近 0 的时候精度更高,在一些图形学应用中还是很必要的(比如表示粒子的速 度),定点数就做不到。 • x86 CPU 上最小的浮点类型就是 32 位的 float ,不能更小了。 • 那么有没有不用定点数就能减小浮点数占用空间的存储方式,比如0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战表面对象保障了高效的访存,并且自动判断越界,体 现了 GPU 作为图形学专业硬件的能力。 CUDA 纹理对象:封装 • 表面对象访问数组是可读可写的。纹理对象也可以访问 数组,不过是只读的。好处是他可以通过浮点坐标来访 问,且提供了线性滤波的能力。 • 在核函数中可以通过 tex3D 来读取纹理中的值。 • 之所以纹理是因为 GPU 一开始是渲染图形的专用硬件 ,会用到一些贴图等,这就是二维的纹理。0 码力 | 58 页 | 14.90 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南cmake -B build -Dmyvar=world 命令行 -D 参数太硬核了,有没有图形化的缓存编辑器? • 在 Linux 中,可以运行 ccmake -B build 来启 动基于终端的可视化缓存编辑菜单。 • 在 Windows 则可以 cmake-gui -B build 来启动 图形界面编辑各个缓存选项。 • 当然,直接用编辑器打开 build/CMakeCache.txt0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理{} 初始化,否则有可能会变成内 存里的随机值。 • 顺便一提, C++20 中还可以通过指定名称来跳顺序: 编译器默认生成的构造函数:初始化列表(妙用,解决函数多返回值) • 典型的例子包括,图形学某知名应用中, 可以简化函数具有多个返回值的处理。 • 和 std::tuple 相比,最大的好处是每个属性都有名字 ,不容易搞错。举个例子: • auto [hit, pos, ...]0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化。而指令缓存的大小刚好和数据缓存一样也是 192 KB 。 • 二级缓存有 256 KB , 6 个物理核心每个都有一个, 总共 1.5 MB 。 • 三级缓存由各个物理核心共享,总共 12 MB 。 通过图形界面查看拓扑结构: lstopo 根据我们缓存的大小分析刚刚的图表 • 也可以看到刚刚两个出现转折的点,也是在 二级缓存和三级缓存的大小附近。 • 因此,数据小到装的进二级缓存,则最大带 宽就取决于二级缓存的带宽。稍微大一点则0 码力 | 147 页 | 18.88 MB | 1 年前3
Hello 算法 1.0.0b4 C++版强的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在挫折中步步退缩。通 读教材书籍也是一种常见做法,但对于面向求职的同学来说,毕业季、投递简历、准备笔试面试已经占据了 大部分精力,厚重的书籍往往变成了一项艰巨的挑战。 如果你也面临类似的困扰,那么很幸运这本书找到了你。本书是我对此问题的给出的答案,虽然不一定正确, 但至少是一次积极的尝试。这本书虽然不足以让你直接拿到 Offer ,但会引导你探索数据结构与算法的“知 0; j < n + 1; j++) { cout << 0 << endl; } } } 第二步:判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用, 其他项的影响都可以被忽略。 以下表格展示了一些例子,其中一些夸张的值是为了强调“系数无法撼动阶数”这一结论。当 ? 趋于无穷大 时,这些常数变得无足轻重。 2. 复杂度 3.2. 推算方法 空间复杂度的推算方法与时间复杂度大致相同,只是将统计对象从“计算操作数量”转为“使用空间大小”。 与时间复杂度不同的是,我们通常只关注「最差空间复杂度」,这是因为内存空间是一项硬性要求,我们必须 确保在所有输入数据下都有足够的内存空间预留。 最差空间复杂度中的“最差”有两层含义,分别是输入数据的最差分布和算法运行过程中的最差时间点。 ‧ 以最差输入数据为准。当 ? <0 码力 | 343 页 | 27.39 MB | 1 年前3
共 19 条
- 1
- 2













