C++高性能并行编程与优化 -  课件 - 07 深入浅出访存优化}; • CacheEntry cache[512]; • 当 CPU 读取一个地址时: • 缓存会查找和该地址匹配的条目。如果找到,则给 CPU 返 回缓存中的数据。如果找不到,则向主内存发送请求,等读 取到该地址的数据,就创建一个新条目。 • 在 x86 架构中每个条目的存储 64 字节的数据,这个条目 又称之为缓存行( cacheline )。 • 当访问 0x0048~0x0050 当读和写创建的新条目过多,缓存快要塞不下时,他会把 最不常用的那个条目移除,这个现象称为失效( invalid )。 如果那个条目是被标记为脏的,则说明是当时打算写入的 数据,那就需要向主内存发送写入请求,等他写入成功, 才能安全移除这个条目。 • 如有多级缓存,则一级缓存失效后会丢给二级缓存。 连续访问与跨步访问 • 如果访问数组时,按一定的间距跨步访问,则效率如何? • 从 1 到 16 SOA 会让 CPU 不得不同时维护很多条预取赛道( mc_x, mc_y, mc_z ),当赛 道多了以后每一条赛道的长度就变短了,从而能够周转的余地时间比较少,不利于延迟隐藏。 而如果把这三条赛道合并成一条( mc ),这样同样的经费(缓存容量)能铺出的赛道(预 取)就更长,从而 CPU 有更长的周转时间来隐藏他内部计算的延迟。所以本案例中 AOS 比 SOA 好。 AOS 、 SOA 、 AOSOA0 码力 | 147 页 | 18.88 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 06  TBB 开启的并行编程之旅并发:某互联网公司购置了一台单核处理 器的服务器,他正同时处理 4 个 HTTP 请求,如果是单线程的 listen-accept 循环 ,则在处理完 A 的请求之前, B 的请求 就无法处理,造成“无响应”现象。 C 的请 求进来,则还得继续排队…… • 每个请求开启一个线程来处理,这样处理 A 用户的同时还可以继续监听 B 用户发 来的请求,及时响应,改善用户体验。 • 并行:某图形学爱好者购置了一台 vector 的 resize 不会零初始化其中的 值。 加速比: 6.26 倍 并行筛选 8 (不推荐) 而是用 std::vector 作为 parallel_reduce 的元 素类型,通过合并得出最终结果,也是可以的。 很直观,可惜加速效果不好。 加速比: 2.04 倍 并行筛选 9 (用于 GPU ) 线程粒度很细,核心数量很多的 GPU ,往往没办法用 concurrent_vector0 码力 | 116 页 | 15.85 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 04 从汇编角度看编译器优化艹标准委员会什么时候肯把他加入标准呢?看看人家 C 语言。 编译器优化:合并写入 将两个 int32 的写入合 并为一个 int64 的写入 。 合并写入:不能跳跃 但如果访问的两个元素地 址间有跳跃,就不能合并 了。 第 4 章:矢量化 更宽的合并写入:矢量化指令( SIMD ) 两个 int32 可以合并为一个 int64 四个 int32 可以合并为一个 __m128 xmm0 由 SSE 引入,是个 指令:敢不敢再宽一点? 为什么编译器没有用 256 位的 ymm0 ? 因为他不敢保证运行这个程序的电脑支持 AVX 指令集…… 两个 int32 可以合并为一个 int64 四个 int32 可以合并为一个 __m128 八个 int32 可以合并为一个 __m256 让编译器自动检测当前硬件支持的指令集 -march=native 让编译器自动判断当前硬件支 持的指令。老师的电脑支持 AVX0 码力 | 108 页 | 9.47 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程构建一个计数迭代器,他作为区间表示的就是 整数的区间。 合并多个迭代器为一个: zip_iterator • 可以用 thrust::make_zip_iterator(a, b) 把多个迭代器合并起来,相当于 Python 里的 zip 。 • 然后在函数体里通过 auto const &tup 捕获,并通过 thrust::get(tup) 获取这个合并 迭代器的第 index 个元素……之所以他搞这么复杂,其实是因为 的初衷是为了节省不必要 的运算用的,然而对于 j < 32 以下那几个 并没有节省运算(因为分支是按 32 个线 程一组的),反而增加了分歧需要避免副 作用的开销。因此可以把 j < 32 以下的那 几个赋值合并为一个,这样反而快。 使用网格跨步循环一次读取多个 arr 元素 • 可见共享内存中做求和开销还是有点大,之后那么 多次共享内存的访问,前面却只有一次全局内存 arr 的访问,是不是太少了。 std::max 来防止 访问越界。主要是 GPU 的 SIMT 处理这 个比较擅长,不像 CPU 如果这样来钳制 可能导致矢量化失败。 减轻 membound :一次代替四次迭代 • 和第七课提到的循环合并法局部迭代一样的方式 。 • 不过这里改用了 GPU 的板块共享内存,线程之 间自动并行,没有像 CPU 那样用循环。 下一课主题? GPU vs CPU • cudaStream 异步编程(流水线式并行) 0 码力 | 142 页 | 13.52 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型倍速度! • 这就是量化数据类型的思想,把占空间大的数据 类型转换成较小的(损失一定精度,换来性能) 。 • 因此如果你的程序不需要那么高精度,可以考虑 用小点的数据类型。 8 个 bit 合并进一个 int8_t :每个占据 1/8 字节 • 考虑到我们的 i % 2 只可能是 0 和 1 ,也就是 实际只占据了 1bit ,而如果用 int8_t 存储是 1 字 节也就是 8bit bit 如何合并到一个 int8_t • 通过位运算: • bits |= 1 << n; • 可以设置 bits 的第 n 位为 1 。 • bits |= 0 << n; • 则没有任何改变。 std::vector:标准库帮你实现好了 • 其实标准库的 vector 是一个特化的版本 ,他会自动像刚刚说的把值看做 1bit ,然后八个 合并成一个 int8_t 0 码力 | 102 页 | 9.50 MB | 1 年前3
 Zadig 面向开发者的云原生 DevOps 平台-> 调试 (使用 kubectl/ 日志系统) 2. 测试流程 合并到 develop -> GitLab-CI 自动构建打包 Chart (还是那堆复杂的脚 本) -> -> Rancher 上手动替换 Helm Chart 版本 -> 自动化 / 手工测试 3. 上线流程 合并 master -> GitLab-CI 自动构建打包 Chart -> 数千微服务已经上了 K8s ,没有业务边界,环 境不稳定出了问题,所有人吃大锅饭 “ 开发无法本地联调自测,集成测试环境 脏, ” 乱,差 极不稳定,总被其他人干扰 测试同时验证多个分支,集成合并冲突不断,自 动化测试遥遥无期,测试全靠人工验证 运维无脑排障、重启、删节点,沦为工具人…… “ “ ” ” 一系列问题(来自社区的声音): 1. 业务边界清晰 2. 权限得到控制0 码力 | 59 页 | 81.43 MB | 1 年前3
 Rust分布式账务系统 - 胡宇API 到底层 API 的翻 译 ○ 产生转账计划 ● Marker 事务层 ○ 使用业务 id 进行路由 ○ 执行转账计划 ○ 分发账户变动请求 ● Auticuro 账户层 ○ 使用账户 id 进行分区 ○ 执行账户变动请求 ○ 更新账户余额 分布式账务系统 性能展示 8 vCPUs * 5 节点 SSD 磁盘 当 TPS = 10K 时, 延迟 P99 < 20ms 分布式账务系统 高吞吐,超低延迟 账户层: Auticuro 分布式账务系统 账户层: Auticuro ● 1. 接受转账请求,转换成 events ○ Tokio + Tonic 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ○ 共识:基于 raft-rs 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events ,更新状态机 (账户表) ○ 去重 & 更新余额 ○ 关键路径采用无锁单线程 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 20 码力 | 27 页 | 12.60 MB | 1 年前3
 应用 waPC (rust) 做软件测试工具wasm • Operation 是我们要在 wasm 里注册 命名 • 以数据的长度,设置 wasm 的 linear memory 的指针 • Guest 可执行任务 • Guest 也可返回请求 host Invoke(ctx,operation,payload) WAPC 流程 • Uses Length of response and error to return result request_marshalli ng); reg.insert(“response_marshalling”.into(),response_marsh alling); } 自动化 HTTP 请求例子 自动化测试以循环方式执行 • Request 用了 http1x • foo_index! 里取 _i • 在 response_marshalling 里 foo_assert_eq HttpBody.get("data").unwrap_or(&mut NULL),&json!("hi"),"data is hi"); Ok(msg.to_vec()) } 自动化 HTTP 请求例子 自动化测试以循环方式执行 测验报告 HTML/ JSON 报告 Wasm Mock Server • 模拟数据规则 • 自动化测试 • 模拟数据规则 • 自动化测试 Some of0 码力 | 30 页 | 2.50 MB | 1 年前3
 Zadig 产品使用手册本地编写测试脚本并针对 sit 环境本地自测 2. 没问题后提交到 GitLab 仓库 测试验证 Sprint 发布 需求开发 变更发布 产品规划 测试验证 自动化 CD 过程:合并代码后自动触发更新集成环境 包括步骤: auto-sit 环境构建 -> 部署 -> 场景测试 -> 安全扫描 ->IM 通知 Sprint 发布 需求开发 变更发布 产品规划 测试验证0 码力 | 52 页 | 22.95 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 13 C++ STL 容器全解之 vectorvector 作为这个参数,就会出错!报错 会说因为 vector 和 initializer_list 不是同一个类型 。 • 那要如何插入另一个 vector ,或者说,把 a 和 b 这两个数组合并起来呢? • iterator insert(const_iterator pos, initializer_listlst); vector 容器: insert 函数,插入另一个 0 码力 | 90 页 | 4.93 MB | 1 年前3
共 13 条
- 1
 - 2
 













