C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake 结论:狭义的摩尔定律没有失效。但晶体管数 量的增加,不再用于继续提升单核频率,转而 用于增加核心数量。单核性能不再指数增长! 你醒啦?免费午餐结束了! 指望靠单核性能的增长带来程序性 能提升的时代一去不复返了,现在 要我们动动手为多核优化一下老的 程序,才能搭上摩尔定律的顺风车 。 神话与现实: 2 * 3GHz < 6GHz • 一个由双核组成的 3GHz 的 CPU 实际上提供了 6GHz ,尹伟达的 wrap 大小 32 高性能计算既然要高性能,必须针对不同硬 件优化,而优化策略都不一样,何谈统一? 黄仁勋回应称:单机上 CPU 的并行,多机上的 CPU 并行,单机单卡 GPU ,单机 多卡 GPU ,每一种要采用的策略都完全不同,表示不看好 oneapi 能统一异构计算 …… 现在流行改名运动? Facebook 改名 Meta ? TBB 改名 OneTBB ? 方便割投资人韭菜?0 码力 | 116 页 | 15.85 MB | 1 年前3
《深入浅出MFC》2/e{ _hWnd = CreateWindow(...); ... } 两个函数(InitApplication 和InitInstance)的名称别具意义: 在Windows 3.x 时代,窗口类别只需注册一次,即可供同一程序的后续每一个 执行实例(instance)使用(之所以能够如此,是因为所有进程共在一个地址空 间中),所以我们把RegisterClass 这个动作安排在「只有第一个执行个体才会 ■ ■ ■ ■ 第4章 Visual C++ 整合開發環境 237 关于project 开发一个程序需要许多文件,这些文件以一个DSW 档和DSP 档(而不再是VC++ 4.x 时代的.MDP 档和.MAK 档)规范管理。一整组相关的文件就是一个project。只要你 告诉Visual C++ 在哪一个磁盘目录下开始一个新的project,它就会为你制作出一个 DSW 档和一个DSP 首先我们看看侯捷在其无责任书评中是怎么说的: 演化(revol uti on)永远在进行,但这个世界却不是每天都有革命性(revol uti on)的事物 发生。动不动宣称自己(或自己的产品)是划时代的革命性的,带来的影响就像时下满 街跑的大师一样使我们渐渐无动于衷( 大师不可能满街跑) ! 但是Application Framework 的的确确在我们软件界称得上具有革命精神。 什么是Application0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake 章:汇编语言 x64 架构下的寄存器模型 通用寄存器: 32 位时代 • 32 位 x86 架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp • 其中 esp 是堆栈指针寄存器,和函数的调用与返回相关。 • 其中 eax 是用于保存返回值的寄存器。 通用寄存器: 64 位时代 • 64 位 x86 架构中的通用寄存器有: • rax0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake 会有马虎犯错的问题。 • 这里 make_unique(...) 可以理解为和 之前的 new C(...) 等价,括号里也可以有 其他构造函数的参数。 unique_ptr :封装的智慧 • 在旧时代 C++ 里,常常听到这样的说法: • “ 释放一个指针后,必须把这个指针设为 NULL , 防止空悬指针!” • delete p; • p = nullptr; • unique_ptr 0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming效, CPU 执行效率更高 。 • j 系列指令有 jle , jge , jl , je 等等。 set 系列指令有 setle , setge , setl 等等。 • 冷知识: 32 位时代 cmov 系列曾经是 x86 的一个拓展特性(像 sse 一样),使用前需 要先用 cpuid 指令检测是否支持,如果在不支持 cmov 的 CPU 上使用会产生 SIGILL 错误。不过现在0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake0 码力 | 79 页 | 14.11 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针类似于人类的科学计数法,不过是二进制。 著名的“快速浮点平方根算法” • 这个算法是 99 年被人从一个游戏源码中扒 出来的,作者号称是游戏界的大神卡马克 ,但是追根溯源,貌似这个算法存在的还 要更久远,原始作者已不可考,暂且称为 卡马克算法。 • 实际上就是把指数位除以了 2 ,作为牛顿 迭代的初始猜测值而已。看他的 i >> 1 这 里,就是把指数和底数都移动了 1 (因为0 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程不过由于原子操作要保证同一时刻只能有一个 线程在修改某个地址,如果多个线程同时修改 同一个就需要像“排队”那样,一个线程修改完 了另一个线程才能进去,非常低效。 • 但是为什么这里用了 2^24 个元素,按理说应 该卡的不行了,却还是非常快的样子? • 那是因为 CUDA 编译器比较聪明,自动优化 了……稍后会解释他优化的原理。 解决:线程局部变量 • 解决方法之一就是:先累加到局部变量 local_sum0 码力 | 142 页 | 13.52 MB | 1 年前3
共 17 条
- 1
- 2













