Zadig 产品使用手册复杂工具链 工程化:一个平台 一键发布 工作流、环境配置自动更新、高 效调试、消除手工操作、精准快 速迭代、研发生产力 / 幸福感提 升 自助运行、系统化管理、自动化 程度高、测试有效性提升、质量 有保障、横向赋能、技能提升 随时调用工程基线提供的能力、 产品视角开发交付、团队高效协 同、稳定迭代 产研数字化过程数据透明、关键 指标易抽取、有能力合理调动资 源、随时决策响应客户需求 碎片化 研 以此环境作为发布生产环境前的用户验收环节 发布 / 运维工程师 用于生产查看 prod 生产环境管理,变更过程需经过严格审批 管理员 ( 运维 ) 准备——环境 管理员 ( 运维 ) 准备——环境 产品规划 需求开发 Sprint 发布 本地自测—— IDE 热部署 1. 查看服务和环境 2. 本地代码热部署到远端 测试验证 变更发布 需求开发 提交代码及 CI 过程 1. 本地编写代码推送到远端分支 检查、代码扫描 。 Sprint 发布 测试验证 变更发布 产品规划 需求开发 单个工程师自测——手工 / 自动触发 dev 工作流执行 步骤包含: dev 环境构建 -> 部署 -> 冒烟测试 ->IM 通知 Sprint 发布 测试验证 变更发布 产品规划 需求开发 Sprint 发布 测试验证 变更发布 产品规划 多人做集成联调——更新不同服务 启动 dev 工作流,选择多个服务和对应的0 码力 | 52 页 | 22.95 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台通用工作流广泛链接生态赋能开发者 企业解决方案和最佳实践内置 发布 AI 增强解决方案 企 业 开 放 性 、 A I 能 力 增 强 产品发展历程 高频极速迭代: Zadig 开源 29 个月共迭代 21 个版本 “ ” 开发者常处于 今天发版、明早升级 嗷嗷待哺状态 Zadig 优势、使用场景、解决问题域 Zadig 解决问题域 Zadig 云原生开放性:极简、 DevOps 方案 ZadigX 云原生 DevOps 方案 降本提效 组织能力提升 业务负责人 研发不透明,规划凭感觉: • 发版时间靠运气 • 团队熬夜冲进度 研发透明化:不同项目清晰可见的效率、质量、进度 进度管理:根据团队客观数据,预测和确定项目规划 迭代进度一目了然 项目从无到有可核算 管理有数据科学依据 解放管理,更多时间花在 业务创新 平台运维 业务压力大,能力建设缓慢: 子环境免打扰,独立完成验证工作 自助验证更高效:自动化工作流 + 云上环境,高效验证调试 安全发布有信心: 一个平台完成日常 90% 工作,开发自助发布 需求研发总耗时降低 30% 需求迭代周期缩短 1-5 倍 解放开发,专注编码 更多的架构和技术提升 测试 效率和质量难以平衡: • 自动化测试难以开展 • 环境不稳定并行验证效率低 • 测试多苦劳,价值难以体现 测试效果提升:独立稳定环境用于测试验收、自动化建设0 码力 | 59 页 | 81.43 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器se 上期回顾: https://www.bilibili.com/video/BV1qF411T7sd 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2. 你所不知道的 set 容器 & 迭代器分类 ( 本期 ) 3. string , string_view , const char * 的爱恨纠葛 4. 万能的 map 容器全家桶及其妙用举例 5 5. 函子 functor 与 lambda 表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 set 和 vector 的区别 • 都是能存储一连串数据的容器 。 • 区别 1 : set 会自动给其中的 元素从小到大排序,而 vector 和 vector 迭代器的共同点 • 上节课讲了迭代器: vector 具 有 begin() 和 end() 两个成 员函数,他们分别返回指向数 组头部元素和尾部再之后一格 元素的迭代器对象。 • vector 作为连续数组,他的迭 代器基本等效于指针。 • set 也有 begin() 和 end() 函数,他返回的迭代器对象重 载了 * 来访问指向的地址。 迭代器的五大分类 提供的运算符重载0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vectorcom/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course C++ 标准库五大件:容器( container ) C++ 标准库五大件:迭代器( iterator ) C++ 标准库五大件:算法( algorithm ) C++ 标准库五大件:仿函数( functor ) C++ 标准库五大件:分配器( allocator ) 侯捷 的目标长度大于原有的容量时, 就需要重新分配一段更大的连续内存,并 把原数组长度的部分移动过去,多出来的 部分则用 0 来填充。这就导致元素的地址 会有所改变,从而过去 data 返回的指针 以及所有的迭代器对象,都会失效。 vector 容器: resize 到更小尺寸不会导致 data 失效 • 当 resize 的目标长度小于原有的容量时, 不需要重新分配一段连续的内存也不会造 成元素的移动(这个设计是为了性能考 会释放,而是继续保留。如担心内存告急可以用 shrink_to_fit 释放掉多余的容量,只保留刚好为 size() 大小的容量。 • shrink_to_fit 会重新分配一段更小内存,他同样是会把元素移 动到新内存中的,因此迭代器和指针也会失效。 • size_t shrink_to_fit(); 一个小工具: mallochook • 为了追踪所有的内存分配与释放,我 们试着重写一下 malloc 和 free 函0 码力 | 90 页 | 4.93 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器能不能在遍历的同时删除元素?安全吗? emplace , emplace_hint , try_emplace 的区别? 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2. 你所不知道的 set 容器 & 迭代器分类 (BV1m34y157wb) 3. string , string_view , const char * 的爱恨纠葛 (BV1ja411M7Di) ( 本期 ) 5. 函子 functor 与 lambda 表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 10. C++ 异常处理机制的前世今生 我们都要认真鞋习哦 我们都要认真鞋习哦 第一章:读取与写入 我负责监督你鞋习 ! 我负责监督你鞋习 insert_or_assign(key, val) 不覆盖写入,要用 m.insert({key, val}) 判断是否存在,用 m.count(key) 若存在则删除,用 m.erase(key) 第四章:迭代与遍历 物理格式 逻辑格式 面壁者罗辑监督你鞋习 ! 面壁者罗辑监督你鞋习 ! map 的元素类型是…… • set::value_type 是 V 。 • map ::value_type 0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅4*2=8 度电 结论:并行映射的时间复杂度为 O(n/c) ,工作复杂度为 O(n) ,其中 c 是线程数量 封装好了: parallel_for 面向初学者: parallel_for 基于迭代器区间: parallel_for_each 二维区间上的 for 循环: blocked_range2d 三维区间上的 for 循环: blocked_range3d 所有区间类型 第 2 这就导致前半段的元素的地址被改变,从而导致 之前保存的指针和迭代器失效。 reserve 预留足够的 capacity • 如果预先知道 size 最后会是 n ,则可以 调用 reserve(n) 预分配一段大小为 n 的 内存,从而 capacity 一开始就等于 n 。 这样 push_back 就不需要动态扩容,从 而避免了元素被移动造成指针和迭代器失 效。 不连续的 tbb::concurrent_vector 进去的元素,扩容时不需要移动 位置,从而指针和迭代器不会失效。 • 同时他的 push_back 会额外返回一个迭代 器( iterator ),指向刚刚插入的对象。 grow_by 一次性扩容一定大小 • push_back 一次只能推入一个元素。 • 而 grow_by(n) 则可以一次扩充 n 个元素。 他同样是返回一个迭代器( iterator ),之 后可以通过迭代器的 ++ 运算符依次访问0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程你调用 cudaMemcpy ,非常智能。 • 比如这里的 x_dev = x_host 会把 CPU 内存中的 x_host 拷贝到 GPU 的 x_dev 上。 TODO :解释什么是迭代器 模板函数: thrust::generate • thrust 提供了很多类似于标准库里的模板 函数,比如 thrust::generate(b, e, f) 对标 std::generate std::generate ,用于批量调用 f() 生成一 系列(通常是随机)数,写入到 [b, e) 区 间。 • 其前两个参数是 device_vector 或 host_vector 的迭代器,可以通过成员函数 begin() 和 end() 得到。第三个参数可以 是任意函数,这里用了 lambda 表达式。 模板函数: thrust::for_each • 同理,还有 thrust::for_each(b std::for_each 。他会把 [b, e) 区间的每个 元素 x 调用一遍 f(x) 。这里的 x 实际上 是一个引用。如果 b 和 e 是常值迭代器 则是个常引用,可以用 cbegin() , cend() 获取常值迭代器。 • 当然还有 thrust::reduce , thrust::sort , thrust::find _if , thrust::count_if0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化。 • 因此,对 fill 这种没有任何计算量,纯粹只有访存的循环体,并 行没有加速效果。称为内存瓶颈( memory-bound )。 • 而 sine 这种内部需要泰勒展开来计算,每次迭代计算量很大的 循环体,并行才有较好的加速效果。称为计算瓶颈( cpu- bound )。 • 并行能减轻计算瓶颈,但不减轻内存瓶颈,故后者是优化的重点 。 浮点加法的计算量 • 冷知识: 每个元素只需要访问两遍内存。对这种完全 mem-bound 的程 序而言就是加速了 2 倍。 测试结果 可见,能否很好的利用缓存,和程序访问内存的时间局域性有关。 案例:一维 jacobi 迭代 • 一些物理仿真中,常用到这种形式的迭代法: • for (i=0...n) b[i] = a[i + 1] + a[i - 1]; // 假装是 jacobi • swap(a, b); // 交换双缓冲 5 • 我们得到了求出两次迭代后状态的公式。这样 就可以在一个循环体内实现两次迭代的效果! 从而快了 2 倍。 动画演示 a a’ a’’ 局部数组,一步抵 16 步 • 一次性读取到局部数组 ta 里,在局部迭代 16 次。 • 注意到局部数组是 64 大小,这包含了中心的 32 个元 素,还包含因为 jacobi 特性需要周围两个元素,导致 迭代 16 次就需要往边缘扩张的0 码力 | 147 页 | 18.88 MB | 1 年前3
Rust 异步并发框架在移动端的应用 - 陈明煜,目前已经半废弃 async-std 更轻量化的调度框架,功能被拆分 到其他多个库中, IO 密集场景性 能不如 Tokio smol Rayon 并非异步运行时。它通过同步 多线程模型提供了并行迭代器功能, 适用于处理 CPU 密集型计算任务 rayon 现有框架无法完美适配移动端(一) Core Thread Thread Worker Worker task task Local 异步并发框架,近期计划在 OpenHarmony 上开源。与 Tokio 类似,同样为事 件驱动型调度框架,提供异步 IO 、定时器、同步原 语等功能。但额外提供: 任务优先级调度 异步并行迭代器 结构化并发 Ylong Runtime 对外 接口 APP/SA 调度器 提 交 任 务 Async function CPU Task CPU Task IO Task 北向接口融合:异步并行迭代器 将 Rayon 并行迭代器异步化 可以对 Rust 常规数据容器生成并行迭代器,对容 器内的数据进行异步并行的操作 Fusion of IO/CPU intensive IO & CPU 融合 Fusion of IO/CPU intensive IO & CPU 融合 Fusion of IO/CPU intensive 南向调度融合:异步并行迭代器 0 码力 | 25 页 | 1.64 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战的三维数组来表示。 • 定义求散度的核函数,首先读取速度场周围六个元素的值,然后上下做差得到散度。 投影部分: jacobi 迭代求解压强 投影部分:速度减去压强的梯度 投影部分:初步实现 • 现在调用这些内核,让 jacobi 迭代 400 次,看看效果。 • 当然, jacobi 迭代因为需要写入 pre 的同时读取 pre ,所以也要用双缓冲。 投影部分:计算未消除的散度 为了评估效果的好坏0 码力 | 58 页 | 14.90 MB | 1 年前3
共 16 条
- 1
- 2













