JVM 内存模型
JVM 内存模型 Heap Method Area Runtime Constant Pool Thread Thread Thread PC Register JVM Stack Native Method Stack PC Register JVM Stack Native Method Stack PC Register JVM Stack Native Method0 码力 | 1 页 | 48.42 KB | 1 年前3RustBelt - Rust 的形式化语义模型
第三届中国 Rust 开发者大会 王俊吉 RustBelt - Rust 的形式化语义模型 Outline Background • RustBelt Project • Rust Types Overview Rust Semantics • Type System • The own Predict • Exclusive Ownership & Mutable Borrow0 码力 | 21 页 | 2.63 MB | 1 年前3新一代分布式高性能图数据库的构建 - 沈游人
领 先水平。” 以终为始,以行为知,这一项目从图计算所面临的挑战出发,解决了大规模图数据所产生 的建模能力不足、结构知识难用、巨量数据难算等技术挑战,实现了大规模复杂异质图数 据的表示学习模型、语义推荐和风险管理关键技术,构建了完整的兼具理论指导与应用检 验的大规模图数据智能分析系统与平台,满足了大数据时代从复杂异质图数据中进行知识 发现的重要需求。最终获得国内外授权发明专利 43 项, 链接预测 连接强度 一致行动人 同事关系 实际控制人 可能认识的人 上下游 同爱好的人 亲属关系 … 人与人、企业与企业、企业与人之间的 复杂、潜在关系推导和挖掘 为已有的分析模型增加“关系特征”维 度 客户贡献度 客户信用分 客户忠诚度 客户欺诈分 客户风险度 违约概率 客户资质 … 集团关系 社群关系 欺诈团伙 担保关系 资金圈 / 链 … 设别出带有某种共同特征 AtlasGraph 架构及实现 新一代图技术应用特征简介 Takeaway AtlasGraph 架构概览 存储层 副本管理 CRAQ 图原生存储 索引 LSM-Tree 容灾保障 ( BR ) 元数据层 事务管理 MVOCC 计算层 Cypher AST 优化器 图计算 内存加速引 擎 服务接口 HTTP/RPC Spark0 码力 | 38 页 | 24.68 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
• 不过看了一下生成的 PTX 汇编,好像也没有优化掉的样子 ?难道是 CUBIN 那一阶段做的?还是驱动做的?还在向王 鑫磊求教中…… 第 9 章:共享内存进阶 GPU 的内存模型 GPU 的内存模型 全局内存:在 main() 中通过 cudaMalloc 分配的内存 共享内存:每个板块都有一个,通过 __shared__ 声明 寄存器:存储着每个线程的局部变量 板块中线程数量过多:寄存器打翻( 为什么需要多维?直接手动求模运算获取 x , y 坐标不行吗?看右边这个例子。 • 回顾一下:我们第七课讲过, CPU 上的 并行 for ,通常会做循环分块提升缓存局 域性。但是如果我们是传统的两层的 for 循环就低效了,对于矩阵转置这种需要 y 方向非连续访问而言,循环分块会带来很 大提升。 • 所以该怎么做才能让 GPU 也循环分块呢 ? 第七课(访存优化)的录播可以看这里:0 码力 | 142 页 | 13.52 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化
CMake 3.12 及以上(跨平台作业) Git 2.x (作业上传到 GitHub ) CUDA Toolkit 10.0 以上( GPU 专题) 第 0 章:汇编语言 x64 架构下的寄存器模型 通用寄存器: 32 位时代 • 32 位 x86 架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp • 其中 esp 是堆栈指针寄存器,和函数的调用与返回相关。 个对象一组打包成 SOA ,再用一 个 n / 4 大小的数组存储为 AOS 。 优点: SOA 便于 SIMD 优化; AOS 便于存储在传统容器; AOSOA 两者得兼!是王鑫磊的最 爱。 缺点:需要两层 for 循环,不利于随机访 问;需要数组大小是 4 的整数倍,不过 可以用边界特判法解决。 测试一下加速了多少倍? 优化前: 优化后: 测试结果 SOA + unroll 的方案,比优化前快了0 码力 | 108 页 | 9.47 MB | 1 年前3Rust分布式账务系统 - 胡宇
● 事务层与账户层分 离 ● 独立水平扩展 ● CQRS ● Event Sourcing ● 针对读场景,写场 景分别优化 ● 稳定的底层 API ● 灵活的顶层 API ● 树状结构 ● 聚合查询 ● 正确性:内存安全,线程安全 ● 可靠性: Raft 共识算法 raft-rs ● 高性能:关键路径无锁单线程 顶层架构 ● Gateway 路由层 ○ 业务 Marker 事务层 ○ 使用业务 id 进行路由 ○ 执行转账计划 ○ 分发账户变动请求 ● Auticuro 账户层 ○ 使用账户 id 进行分区 ○ 执行账户变动请求 ○ 更新账户余额 分布式账务系统 性能展示 8 vCPUs * 5 节点 SSD 磁盘 当 TPS = 10K 时, 延迟 P99 < 20ms 分布式账务系统 高吞吐,超低延迟 账户层: Auticuro Auticuro 分布式账务系统 账户层: Auticuro ● 1. 接受转账请求,转换成 events ○ Tokio + Tonic 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ○ 共识:基于 raft-rs 的可靠消息队 列 ○ 存储: Rocksdb0 码力 | 27 页 | 12.60 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
free(a[i]); • free(a); • ↑ 有 Java 病的人,才会这样分配二维数组,又低效,又不方便。 • 造成了 m + 1 次 malloc 调用,内存都是分散的,每次访问都要解开两层指针,非常低效。 • 分配 n*m 二维数组,正确的方式永远是: float *a = malloc(n * m * sizeof(float)); • 也不要用 vector> 序的循环,其 X 是外层循环体,在先后执行的时间上是不连续的。 • 从而在硬件看来,以 YX 序遍历,就和顺序访问一维数组没什么两样,从而缓存预取能正 常运作,甚至编译器可以优化成一个 nx*ny 的一层循环。 • 而如果以 XY 序遍历,就像跳跃着访问一样,不连续,缓存得不到利用,每次读取只用了 其中 4 字节,浪费了缓存行剩下的 60 字节,非常低效。 • 结论: • 对于 YX 序(列主序, 造成的,一部分是因为跳 跃的访存让 CPU 没有办法自动预取造成的 。 封装成 ndarray 类 ndarray.h ,同学们可以在作业或 是自己的项目里随意使用。 不要再用 Java 式的二层三层指针 了,用 ndarray<2, float> 声明一 个二维浮点数组, ndarray<3, int> 声明一个三维整型数组。 这里的 ndarray 通过 a(x, y) 来 索引,看起来像 0 码力 | 147 页 | 18.88 MB | 1 年前3GPU Resource Management On JDOS
Management On JDOS 梁永清 liangyongqing1@jd.com 提供的服务 1. 用于实验的 GPU 容器 2.基于 Kubeflow 的机器学习训练服务 3.模型管理和模型 Serving 服务 Experiment Training Serving 均基于容器,不对业务方直接提供 GPU 物理机 GPU 实验 JDOS 常规的容器服务 ,使用 gpu 的 Serving 服务 提供统一便捷的 Serving 服务,只需用户指定模型,即可提供 grpc 和 rest 服务,同时使用 GPU 复用 +HPA 提高 GPU 利用率 创建 Serving 与训练集成 • 用户只需要简单选择机房和 镜像填写模型名即可完成 Serving 服务创建 自有模型 • 用户只需要填写模型地址即 可 GPU 监控 • 容器监控服务,自适 应 GPU 容器,可根据0 码力 | 11 页 | 13.40 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器
个元素的平衡二叉树,深 度只有 ceil(log(n+1)) 层。也就是说我们最多只需要 ceil(log(n+1)) 次大小判断,就能找到任 意一个数!因为算法复杂度可以忽略 +1 -1 这些小东西,所以 set 查找的最坏复杂度是 O(logn) ! 2 1 4 5 8 7 4 要找的数 ceil(log(6+1)) = 3 层 4 < ? 从 set 到 map :无非是外挂了个值类型 3 次就找到了目标。这还是最坏的情况,最好只需要 1 次就够了。 • 最坏的情况需要判断多少次?最坏不会超过树的深度,而一棵有着 n 个元素的平衡二叉树,深 度只有 ceil(log(n+1)) 层。也就是说我们最多只需要 ceil(log(n+1)) 次大小判断,就能找到任 意一个数!因为算法复杂度可以忽略 +1 -1 这些小东西,所以 set 查找的最坏复杂度是 O(1) ! 4 要找的数0 码力 | 90 页 | 8.76 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅
任务,一个负责下载,一个负责和用户交 互。并在主线程中等待该任务组里的任务 全部执行完毕。 • 区别在于,一个任务不一定对应一个线程 ,如果任务数量超过 CPU 最大的线程数, 会由 TBB 在用户层负责调度任务运行在 多个预先分配好的线程,而不是由操作系 统负责调度线程运行在多个物理核心。 封装好了: parallel_invoke 更好的例子 第 1 章:并行循环 时间复杂度( time-efficiency auto_partitioner 快 3.31 倍 原因 • tbb::simple_partitioner 能够按照给定的粒度 大小( grain )将矩阵进行分块。块内部小区 域按照常规的两层循环访问以便矢量化,块外 部大区域则以类似 Z 字型的曲线遍历,这样 能保证每次访问的数据在地址上比较靠近,并 且都是最近访问过的,从而已经在缓存里可以 直接读写,避免了从主内存读写的超高延迟。0 码力 | 116 页 | 15.85 MB | 1 年前3
共 20 条
- 1
- 2