C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器(一次 性) back_insert_iterator output_iterator 前向迭代器 * , != , == , ++ forward_list forward_iterator 双向迭代器 * , != , == , ++ , -- set , map , list bidirectional_iterator 随机访问迭代器 * , != , == , ++ , -- , + com/w/cpp/iterator/random_access_iterator https://www.cplusplus.com/reference/iterator/istream_iterator 包含关系:前向迭代器>双向迭代器>随机访问迭代器 这意味着如果一个 STL 模板函数(比如 std::find )要求迭代器是前向迭代器即可,那么也可 以给他随机访问迭代器,因为前向迭代器是随机访问迭代器的子集。 例如, vector advance 相当于 += , next 相当于 + 。 next 和 advance 同样支持负数 • next 的第二个参数 n 通常是正 数,表示向前走的距离。 • 如果迭代器类型是双向迭代器。 next 的第二个参数 n 还可以是 负数,这时他会让迭代器往前走 一段距离,例如: • std::next(it, -3) 相当于 it - 3 。 • 还可以用另一个专门的函数0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理。 回家作业! • 已经发布到: https://github.com/parallel101/hw02 • 仓库的 README.md 里有详细的作业要求和说明。请按要求修改其中的代码,使得双向 链表类 List 的拷贝构造函数能正常工作,且内存能够安全释放。 • 通过 pull request 提交你的作业,这样我可以通过 diff 页面清楚地看到你的改动。 • 什么事 pull request0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程?稍后会说明。 • 运行以后,就会在 GPU 上执行 printf 了。 • 这里的 kernel 函数在 GPU 上执行,称为核 函数,用 __global__ 修饰的就是核函数。 没有反应?同步一下! • 然而如果直接编译运行刚刚那段代码,是不会打印出 Hello, world! 的。 • 这是因为 GPU 和 CPU 之间的通信,为了高效,是异 步的。也就是 CPU 调用 kernel<<<1 里的板块数和线程数可以动态指定,无需 先传回到 CPU 再进行调用,这是 CUDA 特有的能力。 常用于这种情况:需要从 GPU 端动态计算出 blockDim 和 gridDim ,而又不希望导回数据到 CPU 导致强制同步影响性能。 这种模式被称为动态并行( dynamic parallelism ), OpenGL 有一 个 glDispatchComputeIndirect 的 API 和这个很像,但毕竟没有 CUDA cudaMemcpyDeviceToHost 。 • 同理,还有 cudaMemcpyHostToDevice 和 cudaMemcpyDeviceToDevice 。 cudaMemcpy 会自动同步! • 注意: cudaMemcpy 会自动进行同步操作 ,即和 cudaDeviceSynchronize() 等价! 因此前面的 cudaDeviceSynchronize() 实 际上可以删掉了。 统一内存地址技术(0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程void , 这时 future 对象 的类型为 std::future。 • 同理有 std::promise ,他的 set_value() 不接受参数,仅仅作为同步用, 不传递任何实际的值。 第 3 章:互斥量 多线程打架案例 • 两个线程试图往同一个数组里推数据。 • 奔溃了!为什么? • vector 不是多线程安全( MT-safe )的容 动态多态的接口抽象, concept 使实现和接口更加解 耦合且没有性能损失。 第 4 章:死锁 同时锁住多个 mutex :死锁难题 • 由于同时执行的两个线程,他们中发生的指令不 一定是同步的,因此有可能出现这种情况: • t1 执行 mtx1.lock() 。 • t2 执行 mtx2.lock() 。 • t1 执行 mtx2.lock() :失败,陷入等待 • t2 执行 • 因此可以用更轻量级的 atomic ,对他的 += 等 操作,会被编译器转换成专门的指令。 • CPU 识别到该指令时,会锁住内存总线,放弃 乱序执行等优化策略(将该指令视为一个同步点 ,强制同步掉之前所有的内存操作),从而向你 保证该操作是原子 (atomic) 的(取其不可分割 之意),不会加法加到一半另一个线程插一脚进 来。 • 对于程序员,只需把 int 改成 atomic 0 码力 | 79 页 | 14.11 MB | 1 年前3
Rust 异步并发框架在移动端的应用 - 陈明煜类似支持异步 IO ,目前已经半废弃 async-std 更轻量化的调度框架,功能被拆分 到其他多个库中, IO 密集场景性 能不如 Tokio smol Rayon 并非异步运行时。它通过同步 多线程模型提供了并行迭代器功能, 适用于处理 CPU 密集型计算任务 rayon 现有框架无法完美适配移动端(一) Core Thread Thread Worker Worker task 异步并发框架 Ylong Runtime 并发框架 华为 Rust 异步并发框架,近期计划在 OpenHarmony 上开源。与 Tokio 类似,同样为事 件驱动型调度框架,提供异步 IO 、定时器、同步原 语等功能。但额外提供: 任务优先级调度 异步并行迭代器 结构化并发 Ylong Runtime 对外 接口 APP/SA 调度器 提 交 任 务 Async function 阻塞等待所有 Scope 内的子线程任务完成 子线程执行的闭包中可以捕获 Scope 外的变 量 AsyncScope 将 std 库中 thread scope 的思想异步化 在同步环境阻塞等待子异步任务完成,在异步 环境异步等待子异步任务完成 优先级继承:子任务默认继承父任务优先级, 也可使用 detached 模式指定其他优先级 任务取消:取消父任务,也将取消所有子任务0 码力 | 25 页 | 1.64 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅运用多线程的方式和动机,一般分为两种。 • 并发:单核处理器,操作系统通过时间片调 度算法,轮换着执行着不同的线程,看起来 就好像是同时运行一样,其实每一时刻只有 一个线程在运行。目的:异步地处理多个不 同的任务,避免同步造成的阻塞。 • 并行:多核处理器,每个处理器执行一个线 程,真正的同时运行。目的:将一个任务分 派到多个核上,从而更快完成任务。 举个例子 • 并发:某互联网公司购置了一台单核处理 器的服务器,他正同时处理 :每个线程一个任务队列,做完本职工作后可以认领其他线程的任务 工作窃取法( work-stealing ) 原始的单一任务队列 解决 4 :随机分配法(通过哈希函数或线性函数) • 然而队列的实现较复杂且需要同步机制,还是有一 定的 overhead ,因此另一种神奇的解法是: • 我们仍是分配 4 个线程,但还是把图像切分为 16 份。然后规定每一份按照 xy 轴坐标位置编号,比 如 (1,3) 等。 会重新失效一遍。且每个核心都在读写不同地方的数据 ,不能很好的利用三级缓存,导致内存成为瓶颈。 拆分为三个 for 加速比: 3.47 倍 解决了指令缓存失效问题,但是三次独立的 for 循环每次 结束都需要同步,一定程度上妨碍了 CPU 发挥性能;而 且每个 step 后依然写回了数组,数据缓存没法充分利用 。 另辟蹊径:流水线并行 加速比: 6.73 倍 反直觉的并行方式,但是加速效果却很理想,为什么?0 码力 | 116 页 | 15.85 MB | 1 年前3
Go读书会第二期接口设计 • 接口与组合 接口:一切皆组合 Part6 – 语法核心:并发编程 践行哲学,遵循惯例,认清本质,理解原理 • 并发设计 vs. 并行设计 • 并发原语的原理与应用模式 • 低级同步原语 (sync 和 atomic) 并发:优先考虑并发设计 Part7 – 错误处理 践行哲学,遵循惯例,认清本质,理解原理 • 错误处理的几种策略 • 优化 if err != nil0 码力 | 26 页 | 4.55 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台大规模微服务环境治理 支持多分支、多业务间协作,消除环境不稳 定和不够用的阻力,高效率自动化验证质量 典型客户: TT 语音、飞书、钛动、闪电出 行 传统行业研发数字化转型 同步实现研发的数字化转型和 DevOps 落地 典型客户:极氪汽车、老百姓大药 房、 iMile 、思创(广州公交) 1. 维护大量复杂的脚本 2. 在 Rancher 上手动替换版本 30 码力 | 59 页 | 81.43 MB | 1 年前3
共 8 条
- 1













