 Rust 异步并发框架在移动端的应用 - 陈明煜第三届中国 Rust 开发者大会 Rust 异步并发框架在移动端的应用 陈明煜 chenmingyu4@huawei.com 华为 公共开发部 嵌入式软件能力中心 本科就读加州大学圣地亚哥分校,毕业时长两年半, Rustacean 在 华为 目前正在使用 Rust 开发并行调度框架等模块。 Rust 异步并发框架在移动端的应用 陈明煜 chenmingyu4@huawei.com Rust #1 Rust 异步简介 Ylong async runtime #3 Ylong Runtime 并发框架 目录 Table of Contents #2 社区并发框架介绍以及与移动端的不适配性 Introduction to third party Runtime crates and their incompatibility with mobile environment 现有框架无法完美适配移动端(一) Core Thread Thread Worker Worker task task Local queue Local queue Tokio 采用了如右图这种 GMP 模式: • 一核可以绑定多线程,每个线程拥有一个 Worker ,每个 Worker 拥有一个任务队列 • 但线程拥有相同优先级 • Worker 只持有一个本地 FIFO 队列 移动端诉求:优先级0 码力 | 25 页 | 1.64 MB | 1 年前3 Rust 异步并发框架在移动端的应用 - 陈明煜第三届中国 Rust 开发者大会 Rust 异步并发框架在移动端的应用 陈明煜 chenmingyu4@huawei.com 华为 公共开发部 嵌入式软件能力中心 本科就读加州大学圣地亚哥分校,毕业时长两年半, Rustacean 在 华为 目前正在使用 Rust 开发并行调度框架等模块。 Rust 异步并发框架在移动端的应用 陈明煜 chenmingyu4@huawei.com Rust #1 Rust 异步简介 Ylong async runtime #3 Ylong Runtime 并发框架 目录 Table of Contents #2 社区并发框架介绍以及与移动端的不适配性 Introduction to third party Runtime crates and their incompatibility with mobile environment 现有框架无法完美适配移动端(一) Core Thread Thread Worker Worker task task Local queue Local queue Tokio 采用了如右图这种 GMP 模式: • 一核可以绑定多线程,每个线程拥有一个 Worker ,每个 Worker 拥有一个任务队列 • 但线程拥有相同优先级 • Worker 只持有一个本地 FIFO 队列 移动端诉求:优先级0 码力 | 25 页 | 1.64 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程Float 的乘法应该是 multiply(float) ,你也去 定义好几个重载吗?定义为 multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程Float 的乘法应该是 multiply(float) ,你也去 定义好几个重载吗?定义为 multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template- • 其中 T 可以变成任意类型。 • 但是却没有出错,这是因为模板没有被调用,所以不会被实际编译! • 而只有当 main 调用了这个函数,才会被编译,才会报错! • 用一个假模板实现延迟编译的技术,可以加快编译的速度,用于代理模式等。 模板函数:一个例子 • 比如,要打印任意一个 vector : 模板函数:配合运算符重载 • 实现用 std::cout << a 打印任意 vector : 模板函数:大家学废了吗! decltype(auto) p = func(); • 会自动推导为 func() 的返回类型。 • 和下面这种方式等价: • decltype(func()) p = func(); • 在代理模式中,用于完美转发函数返回值。比如: • decltype(auto) at(size_t i) const { • return m_internal_class.at(i); } using 0 码力 | 82 页 | 12.15 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针变量在内存中的存储方式(小端字节序) 地址 字节 刚刚说过一个 int 由四个字节组成,因此一个 int 类型要占据四栋房子。 而对于 int 类型的四个字节要按照什么顺序放入四栋房子,有两种方式。 其中小端字节序( little-endian )就是先从低地址开始存字节的方式。 比如假设 x=1 的话,那么小端字节序的存储方式是: 大小端之争 我们主流的硬件架构如 x86 , ARM 都采用的小端字节序。 非主流的硬件架构如 PowerPC , MIPS 才用大端字节序。 贴近底层的语言,比如 C/C++/Fortran 会采用当前硬件架构的字节序,比如在 x86 上就会变成小端字节序。 Java 这种虚拟机语言会采用大端字节序,因此在小端字节序的硬件上会比较低效,需要额外的字节序转换工作。 为了统一,互联网标准规定,协议包头中传输的数据类型(但凡是多个字节组成的)必须是大端字节序。 假如 x=0x01234567 会讲到。 实验:你的电脑是大端还是小端? • 如果说 p 是一个指向 x 变量的 int* 类型指针,然后 x 的值是 0x12345678 。 • 如果把这个指针强制转换成 char* 指针,就可以获得 int 四个房间中的第一个房间里的字节值了 。 • 在大端序的电脑上,第一个房间放的是 x 的最高位 0x12 : 实验:你的电脑是大端还是小端? • 如果说 p 是一个指向 x 变量的0 码力 | 128 页 | 2.95 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针变量在内存中的存储方式(小端字节序) 地址 字节 刚刚说过一个 int 由四个字节组成,因此一个 int 类型要占据四栋房子。 而对于 int 类型的四个字节要按照什么顺序放入四栋房子,有两种方式。 其中小端字节序( little-endian )就是先从低地址开始存字节的方式。 比如假设 x=1 的话,那么小端字节序的存储方式是: 大小端之争 我们主流的硬件架构如 x86 , ARM 都采用的小端字节序。 非主流的硬件架构如 PowerPC , MIPS 才用大端字节序。 贴近底层的语言,比如 C/C++/Fortran 会采用当前硬件架构的字节序,比如在 x86 上就会变成小端字节序。 Java 这种虚拟机语言会采用大端字节序,因此在小端字节序的硬件上会比较低效,需要额外的字节序转换工作。 为了统一,互联网标准规定,协议包头中传输的数据类型(但凡是多个字节组成的)必须是大端字节序。 假如 x=0x01234567 会讲到。 实验:你的电脑是大端还是小端? • 如果说 p 是一个指向 x 变量的 int* 类型指针,然后 x 的值是 0x12345678 。 • 如果把这个指针强制转换成 char* 指针,就可以获得 int 四个房间中的第一个房间里的字节值了 。 • 在大端序的电脑上,第一个房间放的是 x 的最高位 0x12 : 实验:你的电脑是大端还是小端? • 如果说 p 是一个指向 x 变量的0 码力 | 128 页 | 2.95 MB | 1 年前3
 Zadig 面向开发者的云原生 DevOps 平台个 Kubernetes 全球集群 • 300+ 个数字产品(资产沉淀) • 1600+ 条自动化工作流(全域) • 900+ 个服务化运行环境 通过整合业务、产品、研发、运维等角色端到端的协作过程,打造出提升研发效能的一站式研发协作平台。 价值亮点: • 人均需求交付数提升 50% 以上 ( 需求均衡 / 人员不变 ) • 每年节省研发损耗 4479 人天(约 500 2. 权限得到控制 3. 环境公开透明 4. 更新过程可追溯 Zadig — 托管项目方案 演示 -> 环境治理场景:数千开发者、 5 条业务线、多分支多环境协作 IoT 端云混合场景:打通云和端混合部署,实现一致性交付流程 v 上线资源设备只能人工确认,资源设备没有统 一的管理平台。 研发排查问题困难,对于服务进行诊断,每有 一个资源设备都需要给研发单独分配 SSH 权 Zadig 的主机项目和 K8s Helm Chart 项目两种场景做业务 接入,把交付端实现统一管理起来,来满足研发所有业务的日常迭代需 求。 理想使用 K8s CRD 来实现对设备状态的定义和管理,同时设备端使用 Agent 来和云端做交互,利用 Zadig 能力完成车端和云端服务的迭代更新 过程: 主机方式接入资源设备 • 支持系统主机管理的同时支持了项目级别的主机管理,项目成员可0 码力 | 59 页 | 81.43 MB | 1 年前3 Zadig 面向开发者的云原生 DevOps 平台个 Kubernetes 全球集群 • 300+ 个数字产品(资产沉淀) • 1600+ 条自动化工作流(全域) • 900+ 个服务化运行环境 通过整合业务、产品、研发、运维等角色端到端的协作过程,打造出提升研发效能的一站式研发协作平台。 价值亮点: • 人均需求交付数提升 50% 以上 ( 需求均衡 / 人员不变 ) • 每年节省研发损耗 4479 人天(约 500 2. 权限得到控制 3. 环境公开透明 4. 更新过程可追溯 Zadig — 托管项目方案 演示 -> 环境治理场景:数千开发者、 5 条业务线、多分支多环境协作 IoT 端云混合场景:打通云和端混合部署,实现一致性交付流程 v 上线资源设备只能人工确认,资源设备没有统 一的管理平台。 研发排查问题困难,对于服务进行诊断,每有 一个资源设备都需要给研发单独分配 SSH 权 Zadig 的主机项目和 K8s Helm Chart 项目两种场景做业务 接入,把交付端实现统一管理起来,来满足研发所有业务的日常迭代需 求。 理想使用 K8s CRD 来实现对设备状态的定义和管理,同时设备端使用 Agent 来和云端做交互,利用 Zadig 能力完成车端和云端服务的迭代更新 过程: 主机方式接入资源设备 • 支持系统主机管理的同时支持了项目级别的主机管理,项目成员可0 码力 | 59 页 | 81.43 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程完成队列的所有任务后再返回。从而 能够在 main 退出前等到 kernel 在 GPU 上执行完。 定义在 GPU 上的设备函数 • __global__ 用于定义核函数,他在 GPU 上执行,从 CPU 端通过三重尖括号语法调 用,可以有参数,不可以有返回值。 • 而 __device__ 则用于定义设备函数,他在 GPU 上执行,但是从 GPU 上调用的,而 且不需要三重尖括号,和普通函数用起来一 ,也就是说核函数 可以调用另一个核函数,且其三重尖括号 里的板块数和线程数可以动态指定,无需 先传回到 CPU 再进行调用,这是 CUDA 特有的能力。 常用于这种情况:需要从 GPU 端动态计算出 blockDim 和 gridDim ,而又不希望导回数据到 CPU 导致强制同步影响性能。 这种模式被称为动态并行( dynamic parallelism ), OpenGL 有一 个0 码力 | 142 页 | 13.52 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程完成队列的所有任务后再返回。从而 能够在 main 退出前等到 kernel 在 GPU 上执行完。 定义在 GPU 上的设备函数 • __global__ 用于定义核函数,他在 GPU 上执行,从 CPU 端通过三重尖括号语法调 用,可以有参数,不可以有返回值。 • 而 __device__ 则用于定义设备函数,他在 GPU 上执行,但是从 GPU 上调用的,而 且不需要三重尖括号,和普通函数用起来一 ,也就是说核函数 可以调用另一个核函数,且其三重尖括号 里的板块数和线程数可以动态指定,无需 先传回到 CPU 再进行调用,这是 CUDA 特有的能力。 常用于这种情况:需要从 GPU 端动态计算出 blockDim 和 gridDim ,而又不希望导回数据到 CPU 导致强制同步影响性能。 这种模式被称为动态并行( dynamic parallelism ), OpenGL 有一 个0 码力 | 142 页 | 13.52 MB | 1 年前3
 陈东 - 利用Rust重塑移动应用开发-230618Native feature utilize - Existing Codebase 跨平台开发到到底 应该跨什么? UI or Logic ? 利用 Rust 重塑移动应用开发 Rust 在移动端应 用的价值 Rust is the only advanced choice for cross platform development. 利用 Rust 重塑移动应用开发 Rust0 码力 | 22 页 | 2.10 MB | 1 年前3 陈东 - 利用Rust重塑移动应用开发-230618Native feature utilize - Existing Codebase 跨平台开发到到底 应该跨什么? UI or Logic ? 利用 Rust 重塑移动应用开发 Rust 在移动端应 用的价值 Rust is the only advanced choice for cross platform development. 利用 Rust 重塑移动应用开发 Rust0 码力 | 22 页 | 2.10 MB | 1 年前3
 Zadig 产品使用手册01 04 02 03 工程化协同:“人、技术、流 程、工具” 四维协同基线,沉 淀全流程数据,从感知到赋 能,服务于工程师 释放云基建能力:链接任何云 及自建资源(容器、主机、车 机、端等),释放云原生价值 和企业创新力 生态开放:广泛开放系统 模块和 OpenAPI ,链接 一切流程、服务、工具和 上下游伙伴 安全简单自主可控:私有化 部署,现有服务 0 迁移成本0 码力 | 52 页 | 22.95 MB | 1 年前3 Zadig 产品使用手册01 04 02 03 工程化协同:“人、技术、流 程、工具” 四维协同基线,沉 淀全流程数据,从感知到赋 能,服务于工程师 释放云基建能力:链接任何云 及自建资源(容器、主机、车 机、端等),释放云原生价值 和企业创新力 生态开放:广泛开放系统 模块和 OpenAPI ,链接 一切流程、服务、工具和 上下游伙伴 安全简单自主可控:私有化 部署,现有服务 0 迁移成本0 码力 | 52 页 | 22.95 MB | 1 年前3
 新一代分布式高性能图数据库的构建 - 沈游人完善的测试类型支持,包括单元 测试、集成测试、基准测试等 02 03 和文档系统以及 CI/CD 工具的良 好集成 完整的断言系统 异步协程 零成本抽象 强大的测试框架 REPL 命令行客户端 WebUI 面向分析师,提供图模型定义、数据管理、图查询分析、服务状态监控、用户管理能力 免代码,可视化定义实体、 边,设计图模型。 【亮点】 • 支持模型导入导出 • 拖拽式关系构建0 码力 | 38 页 | 24.68 MB | 1 年前3 新一代分布式高性能图数据库的构建 - 沈游人完善的测试类型支持,包括单元 测试、集成测试、基准测试等 02 03 和文档系统以及 CI/CD 工具的良 好集成 完整的断言系统 异步协程 零成本抽象 强大的测试框架 REPL 命令行客户端 WebUI 面向分析师,提供图模型定义、数据管理、图查询分析、服务状态监控、用户管理能力 免代码,可视化定义实体、 边,设计图模型。 【亮点】 • 支持模型导入导出 • 拖拽式关系构建0 码力 | 38 页 | 24.68 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programmingreturn 0; 优化成 return (x > 0); • if (x > 0) return 0; else return 1; 优化成 return !(x > 0); • 但是这里因为碰巧分支的两端都是简单的 1 和 0 ,对于其他值应该怎么办? 无分支优化套路:妙用加减乘 • if (x > 0) • return 42; • else • return 32; • 两边不是简单的0 码力 | 47 页 | 8.45 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programmingreturn 0; 优化成 return (x > 0); • if (x > 0) return 0; else return 1; 优化成 return !(x > 0); • 但是这里因为碰巧分支的两端都是简单的 1 和 0 ,对于其他值应该怎么办? 无分支优化套路:妙用加减乘 • if (x > 0) • return 42; • else • return 32; • 两边不是简单的0 码力 | 47 页 | 8.45 MB | 1 年前3
共 9 条
- 1













