C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理:异常安全( exception-safe ) C++ 标准保证当异常发生时,会调用已创建对象的解构函数 。 因此 C++ 中没有(也不需要) finally 语句。 如果此处不关闭,则可等 待稍后垃圾回收时关闭。 虽然最后还是关了,但如 果对时序有要求或对性能 有要求就不能依靠 GC 。 比如 mutex 忘记 unlock 造成死锁等等…… RAII :离不开构造函数 • 如题,那么如何定义构造函数呢?0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南标准: CMAKE_CXX_STANDARD 变量 • CMAKE_CXX_EXTENSIONS 也是 BOOL 类型,默认为 ON 。设为 ON 表示启用 GCC 特有的一些扩展功能; OFF 则关闭 GCC 的扩展功能,只使用标准的 C++ 。 • 要兼容其他编译器(如 MSVC )的项目,都会设为 OFF 防止不小心用了 GCC 才有的 特性。 • 此外,最好是在 project 指令前设置 “...”) 表示是警告信息 message(AUTHOR_WARNING “...”) 表示是仅仅给项目作者看的警 告信息 AUTHOR_WARNING 的不同之处:可以通过 -Wno-dev 关闭 message(FATAL_ERROR “...”) 表示是错误信息,会终止 CMake 的 运行 message(SEND_ERROR “...”) 表示是错误信息,但之后的语句仍继续 执行0 码力 | 166 页 | 6.54 MB | 1 年前3
Rust 异步并发框架在移动端的应用 - 陈明煜Asynchronous Rust 异步并发框架是许多大型应用、系统具备的底层能力。 区别于多线程编程模型,它带来以下优势: 任务调度颗粒度更小,充分利用线程资源 更可控的线程数 单个任务资源占用:几十 KB -> 几百 Byte 任务切换时间 : 10 微秒 -> 100 纳秒 Rust 语言并没有提供异步并发框架, 只提供异步所需的基本特性: Future 适用于处理 CPU 密集型计算任务 rayon 现有框架无法完美适配移动端(一) Core Thread Thread Worker Worker task task Local queue Local queue Tokio 采用了如右图这种 GMP 模式: • 一核可以绑定多线程,每个线程拥有一个 Worker ,每个 Worker 拥有一个任务队列 • 但线程拥有相同优先级 移动端诉求:优先级 • 任务区分优先级: UI 显示 vs 后台下载 • 大小核调度 Incompatibility of the third party Runtime with Mobile 现有框架无法完美适配移动端(二) 移动端诉求:易用性 • IO 密集性任务与 CPU 密集型任务融合 异步并发框架如 tokio 大多用于处理大量 异步 IO 场景,而 CPU 密集型任务一般 使用 rayon0 码力 | 25 页 | 1.64 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅度算法,轮换着执行着不同的线程,看起来 就好像是同时运行一样,其实每一时刻只有 一个线程在运行。目的:异步地处理多个不 同的任务,避免同步造成的阻塞。 • 并行:多核处理器,每个处理器执行一个线 程,真正的同时运行。目的:将一个任务分 派到多个核上,从而更快完成任务。 举个例子 • 并发:某互联网公司购置了一台单核处理 器的服务器,他正同时处理 4 个 HTTP 请求,如果是单线程的 上一课的案例代码:基于标准库 基于 TBB 的版本:任务组 • 用一个任务组 tbb::task_group 启动多个 任务,一个负责下载,一个负责和用户交 互。并在主线程中等待该任务组里的任务 全部执行完毕。 • 区别在于,一个任务不一定对应一个线程 ,如果任务数量超过 CPU 最大的线程数, 会由 TBB 在用户层负责调度任务运行在 多个预先分配好的线程,而不是由操作系 统负责调度线程运行在多个物理核心。 dedicated 让人咋 用? 第 4 章:任务域与嵌套 https://link.springer.com/chapter/10.1007%2F978-1-4842-4398-5_12 任务域: tbb::task_arena 任务域:指定使用 4 个线程 嵌套 for 循环 嵌套 for 循环:死锁问题 死锁问题的原因 • 因为 TBB 用了工作窃取法来分配任务: 当一个线程 t1 做完自己队列里全部的工0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming(pipeline) 。流水线的目的是能把原本 串行的一系列指令并行化。为了理解为什 么需要流水线,我们先反过来,假设没有 流水线,会有什么坏处。 • 例如,右边你今天早上的任务清单。 • 请问你这些任务总共需要多少时间? 任务 时间 占用资源 洗脸 5 分钟 眼睛,嘴巴,手 烧开水 10 分钟 煤气灶 刷牙 5 分钟 嘴巴,手 看比站 15 分钟 眼睛 吃饭 30 分钟 嘴巴,手 拉粑粑 存器来指令解码单元才开始继续工作,很 低效。 任务 时间 占用资源 洗脸 5 分钟 眼睛,嘴巴,手 烧开水 10 分钟 煤气灶 刷牙 5 分钟 嘴巴,手 看比站 15 分钟 眼睛 吃饭 30 分钟 嘴巴,手 拉粑粑 20 分钟 屁股 洗脸 烧开水 刷牙 看比站 吃饭 拉粑粑 5 10 5 15 30 20 为什么需要流水线 • 更高效的办法是,观察每个任务都占用哪些 资源,所占用资源不冲突的可以同时进行, + 20 = 40 分钟,比你快一倍多。 任务 时间 占用资源 洗脸 5 分钟 眼睛,嘴巴,手 烧开水 10 分钟 煤气灶 刷牙 5 分钟 嘴巴,手 看比站 15 分钟 眼睛 吃饭 30 分钟 嘴巴,手 拉粑粑 20 分钟 屁股 洗脸 刷牙 烧开水 吃饭 看比站 拉粑粑 5 5 10 20 条件跳转指令 • 让不占用相同资源的任务同时进行,这也是 CPU 流水线的初衷。但理想是美好的,现实0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串程序收到 ^C 以后,就直接终止退 出了。 关于控制字符的一个冷知识 • 除此之外,因为 ^D 是“传输终止符”,还可以在控制 台输入 Ctrl+D 来关闭标准输入流,终止正在读取他 的程序。 • 小彭老师常用 Ctrl+D 来快速关闭一个 shell (和输入 exit 命令的效果一样)。 • 以及按 Ctrl+I 的效果其实和 Tab 键一样,按 Ctrl+J 的效果和 Enter0 码力 | 162 页 | 40.20 MB | 1 年前3
基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺spawn_blocking 提交耗时任务 • C FFI 调用时,要关注上下文的线程安全性。 • 多个运行时之间使用 Channel 通信,降低锁使用范围。 Tokio - Graceful Stop • futures::future::Abortable 可用于短路一个 stream • tokio_util::sync::CancellationToken 可用于向一个或多个任务发出取 消信号, Task 信号,可用于最终程序退出时的取 消操作。 • 谨慎处理任务中 channel 的结束信号。 • cancel vs. abort : Cancel 处理按预期退出, Abort 要保证安全退 出。 • 处理非正常退出(断电、 kill -9 等),保证系统安全性。 Thank you ! Tokio - Graceful Stop • 将任务恢复作为优雅退出的目标之一。0 码力 | 29 页 | 2.26 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程1>>>() 后,并不 会立即在 GPU 上执行完毕,再返回。实际上只是把 kernel 这个任务推送到 GPU 的执行队列上,然后立即 返回,并不会等待执行完毕。 • 因此可以调用 cudaDeviceSynchronize() ,让 CPU 陷 入等待,等 GPU 完成队列的所有任务后再返回。从而 能够在 main 退出前等到 kernel 在 GPU 上执行完。 定义在 GPU 当前板块的编号: blockIdx • 总的板块数量: gridDim • 线程 (thread) :并行的最小单位 • 板块 (block) :包含若干个线程 • 网格 (grid) :指整个任务,包含若干个板块 • 从属关系:线程<板块<网格 • 调用语法: <<>> 区分板块和线程有点麻烦?“扁平化”他们! • 你可能觉得纳闷,既然已经有线程可以并行了 稍微快一些,但不完全精确的 __sinf • 两个下划线的 __sinf 是 GPU intrinstics ,精度相当于 GLSL 里的那种。 适合对精度要求不高,但有性能要求的图 形学任务。 • 类似的这样的低精度內建函数还有 __expf 、 __logf 、 __cosf 、 __powf 等。 • 还有 __fdividef(x, y) 提供更快的浮点除法 ,和一般的除法有相同的精确度,但是在 0 码力 | 142 页 | 13.52 MB | 1 年前3
GPU Resource Management On JDOSdockerfile 生成镜像服务) – 选择存储来源:对接了内部的存储 – 填写代码地址,执行的命令等 – 可以选择是否监控训练,提供 tensorboard 任务列表 可以指定 git 的 commit-id 发起任务 任务详情 可以查看具体的容器列表,以及查看容器的日志和事件 Serving 服务 提供统一便捷的 Serving 服务,只需用户指定模型,即可提供 grpc 和 rest0 码力 | 11 页 | 13.40 MB | 1 年前3
Zadig 产品使用手册• 单元测试、代码扫描 更新日常开发环境及 dev 业务配 置 project-dev-workflow • 构建、配置变更( Apollo/Nacos )、数 据变更、部署、冒烟测试、项目管理任务 变更 测试工程师 更新测试验证环境 project-sit-workflow • 构建、配置变更( Apollo/Nacos )、数 据变更、部署、接口测试 更新集成测试环境 project-auto-sit-workflow 更新业务配置(以 Nacos 为例) 执行对应环境的工作流,选择配置并按需修改,更新 Nacos 配置 Sprint 发布 测试验证 变更发布 产品规划 需求开发 更新项目管理任务状态 执行对应环境的工作流,选择对应任务 Sprint 发布 测试验证 变更发布 产品规划 需求开发 更新数据库 执行对应环境的工作流,输入 SQL 语句执行数据更新 Sprint 发布 测试验证 变更发布0 码力 | 52 页 | 22.95 MB | 1 年前3
共 18 条
- 1
- 2













