C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程
前线程休眠直到某个时间点。 第 1 章:线程 进程与线程 • 进程是一个应用程序被操作系统拉起来加载到内存之后从开始执行到执行结束的这样一个 过程。简单来说,进程是程序(应用程序,可执行文件)的一次执行。比如双击打开一个 桌面应用软件就是开启了一个进程。 • 线程是进程中的一个实体,是被系统独立分配和调度的基本单位。也有说,线程是 CPU 可 执行调度的最小单位。也就是说,进程本身并不能获取 CPU 时间,只有它的线程才可以。 时间,只有它的线程才可以。 • 从属关系:进程 > 线程。一个进程可以拥有多个线程。 • 每个线程共享同样的内存空间,开销比较小。 • 每个进程拥有独立的内存空间,因此开销更大。 • 对于高性能并行计算,更好的是多线程。 为什么需要多线程:无阻塞多任务 • 我们的程序常常需要同时处理多个任务。 • 例如:后台在执行一个很耗时的任务,比 如下载一个文件,同时还要和用户交互。 • 这在 GUI 出了。 主线程等待子线程结束: t1.join() • 因此,我们想要让主线程不要急着退出, 等子线程也结束了再退出。 • 可以用 std::thread 类的成员函数 join() 来等待该进程结束。 std::thread 的解构函数会销毁线程 • 作为一个 C++ 类, std::thread 同样遵循 RAII 思想和三五法则:因为管理着资源, 他自定义了解构函数,删除了拷贝构造0 码力 | 79 页 | 14.11 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
他的第二参数是一个 __m128 类型,可以 配合其他手写的 SIMD 指令使用。 • 不过, _mm_stream_ps 写入的地址必须 对齐到 16 字节,否则会产生段错误等异 常。 stream 的限制:最好是连续的写入 • 需要注意, stream 系列指令写入的地址 ,必须是连续的,中间不能有跨步,否则 无法合并写入,会产生有中间数据读的带 宽。 写入 1 比写入 0 更慢? • 很简单,因为写入 时,操作系统并不会实际分配那一块内存,而是将这一段内存标记 为“不可用”。当用户试图访问(写入)这一片内存时,硬件就会触发所谓的缺页中断 ( page fault ),进入操作系统内核,内核会查找当前进程的 malloc 历史记录。如果发 现用户写入的地址是他曾经 malloc 过的地址区间,则执行实际的内存分配,并标记该段 内存为“可用”,下次访问就不会再产生缺页中断了;而如果用户写入的地址根本不是他 • 这样假如当前元素正好在二维网格的边界上,那再往外索引 w 个单位就会超出数组的界限,导致出错。对此有多种解决办法 : 1. 使用 std::max(n, std::min(0, i)) 限制索引不要超出二维网格的 大小,但会导致难以 SIMD 矢量化。 2. 使用 (i + n) % n 让索引在边界产生回绕,但是更加低效也难 以 SIMD 矢量化。 3. 修改循环体的遍历区间,使他变成0 码力 | 147 页 | 18.88 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南
的包,找不到不报错,也不打印任何信息。 • find_package(OpenCV REQUIRED) # 最常见用法 • 查找名为 OpenCV 的包,找不到就报错(并终止 cmake 进程,不再继续往下执行)。 • find_package(OpenCV REQUIRED COMPONENTS core videoio) • 查找名为 OpenCV 的包,找不到就报错,且必须具有 bin 和 lib 的组织格式,又要伺候 Windows 的沙雕同目录规则,我们通 常把 dll 动态库文件视为“可执行文件”和 exe 一起放到 bin 目录,而静态库则没有运行时必须 同目录的限制,所以可以照常放到 lib 目录。 (他真的我哭死) 科普:类似 Qt 这种亲 Unix 软件,在 Linux 下的目录组织格式 • Linux 用户从源码安装 Qt 这种库时,会有一个 --prefix0 码力 | 56 页 | 6.87 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程
语法,保证是编译期确定的分支: • (下一讲会深入分析编译器的工作原理) 模板的难题:编译期常量的限制 • 编译期常量的限制就在于他不能通过运行时变量组成的表达式来指定。比如: • 这里在 if constexpr 的表达式里用到了运行时变量,从而无法作为编译期分支的条件。 模板的难题:编译期常量的限制(续) • 除了 if constexpr 的表达式不能用运行时变量,模板尖括号内的参数也不能: 自动类型推导:定义变量 因此 C++11 引入了 auto ,使用 auto 定义的变量,其类型会自动根据等号右边的值来确定 : 自动类型推导:一些局限性 • 不过 auto 也并非万能,他也有很多限制。 • 因为需要等号右边的类型信息,所以没有 = 单独声明一个 auto 变量是不行的: • 而且,类成员也不可以定义为 auto : 自动类型推导:函数返回值 • 除了可以用于定义变量,还可以用作函数的返回类型:0 码力 | 82 页 | 12.15 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型
时,操作系统并不会实际分配那一块内存,而是将这一段内存标记为“不可 用”。当用户试图访问(写入)这一片内存时,硬件就会触发所谓的缺页中断( page fault ),进入操作系统内核,内核会查找当前进程的 malloc 历史记录。如果发现用户写 入的地址是他曾经 malloc 过的地址区间,则执行实际的内存分配,并标记该段内存为“可 用”,下次访问就不会再产生缺页中断了;而如果用户写入的地址根本不是他0 码力 | 102 页 | 9.50 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
std::string ,“ hello”s 是 std::string_view 。 • 我也可以定义一个 “ hello”ms 是 mylib::String ,而且还是受 namespace 限制的,用户可以 自己 using namespace ,不会存在强迫别人接受你的那一套后缀名规范。 • 甚至可以自定义一个 class int32 具有成员函数,然后就可以快乐地 233_i32 为什么我看官方文档上没写?标准库头文件里也没看到? • 其实是有的,只不过官方为了让头文件不依赖于 头 文件,把他们写成了模板,并利用类似 SFINAE 的机制给模板参数类型的设 了一些限制(相当于把 string_view 定义为一个 concept ),所以虽然 中看不到 string_view 的出现,却能把 string_view 作为参数 ( StringViewLike 0 码力 | 162 页 | 40.20 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南
需要先创建 build 目录 • 切换到 build 目录 • 在 build 目录运行 cmake < 源码目录 > 生成 Makefile • 执行本地的构建系统 make 真正开始构建( 4 进程并 行) • 让本地的构建系统执行安装步骤 • 回到源码目录 现代 CMake 提供了更方便的 -B 和 --build 指令,不同平台,统一命 令! • cmake -B build •0 码力 | 166 页 | 6.54 MB | 1 年前3GPU Resource Management On JDOS
支持官方镜像,不需要 JDOS 提前协助制作镜像 – 提供 tensorboard 作为训练监控实时查看训练状态 – 用户训练完成后释放 GPU 资源,提高 GPU 利用率 – Job 调度 (部门 quota 限制 + 优先级) • 创建训练 – 用户选择集群提供代码地址和执行命令即可 – 选择所用框架(镜像):支持官方,亦可自制 (提供 dockerfile 生成镜像服务) – 选择存储来源:对接了内部的存储0 码力 | 11 页 | 13.40 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化
64 位 x86 新增的寄存器,给了汇编程序员更大的空间,降低了编译 器处理寄存器翻车( register spill )的压力。 • 因此 64 位比 32 位机器相比,除了内存突破 4GB 限制外,也有一定性能优势。 8 位, 16 位, 32 位, 64 位版本 al, ax, eax, rax r15b, r15w, r15d, r15 AT&T 汇编语言 GCC 编译器所生成的汇编语言就属于这种0 码力 | 108 页 | 9.47 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针
计算机一次能处理多大的整数。 • 例如 32 位计算机的寄存器都是 32 位,因此只能做 32 位整数的加减乘除,超过 32 位 整数的加减乘除就要用特殊的指令来模拟了。 整数的表示范围受位数限制 • 8 位长的整数能表示的范围是 0 到 2^8-1 ,也就是 0 到 255 。 • 16 位长的整数能表示的范围是 0 到 2^16-1 ,也就是 0 到 65535 。 • 32 位长的整数能表示的范围是0 码力 | 128 页 | 2.95 MB | 1 年前3
共 11 条
- 1
- 2