C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
__syncthreads 之类的 GPU 特有的函数,因此也不能 完全替代 __host__ 和 __device__ 。 通过 #ifdef 指令针对 CPU 和 GPU 生成不同的代码 • CUDA 编译器具有多段编译的特点。 • 一段代码他会先送到 CPU 上的编译器(通常是系统自带的编译 器比如 gcc 和 msvc )生成 CPU 部分的指令码。然后送到真 正的 GPU 编译器生成 GPU 指令码。最后再链接成同一个文件 += 一样,不过是原 子的。他的第一个参数是个指针,指向要 修改的地址。第二个参数是要增加多少。 也就是说: • atomicAdd(dst, src) 和 *dst += src 差不 多。 atomicAdd :会返回旧值(划重点!) • old = atomicAdd(dst, src) 其实相当于: • old = *dst; *dst += src; • 利用这一点可以实现往一个全局的数组 shared memory ),他的性质类似于 CPU 中的缓 存——和主存相比很小,但是很快,用于缓冲临时数据。还有点特殊的性质,我们稍后会 讲。 • 通常板块数量总是大于 SM 的数量,这时英伟达驱动就会在多个 SM 之间调度你提交的 各个板块。正如操作系统在多个 CPU 核心之间调度线程那样…… • 不过有一点不同, GPU 不会像 CPU 那样做时间片轮换——板块一旦被调度到了一个 SM0 码力 | 142 页 | 13.52 MB | 1 年前3Rust 异步并发框架在移动端的应用 - 陈明煜
Future.poll() Reactor fd fd listen listen find 现有并发框架 Third Party Runtime 目前 Rust 社区最广泛使用的事件 驱动型调度框架,擅长处理大量异 步 IO 的场景。具有非常强大的生 态。 tokio 第一个适配 Rust async/await 原语 的运行时库,与 tokio 类似支持异步 IO ,目前已经半废弃 两种接口拥有两套割裂的调度模式和线程池 华为 Ylong 异步并发框架 Ylong Runtime 并发框架 华为 Rust 异步并发框架,近期计划在 OpenHarmony 上开源。与 Tokio 类似,同样为事 件驱动型调度框架,提供异步 IO 、定时器、同步原 语等功能。但额外提供: 任务优先级调度 异步并行迭代器 结构化并发 Ylong Runtime 对外 接口 APP/SA 调度器0 码力 | 25 页 | 1.64 MB | 1 年前3Await-Tree Async Rust 可观测性的灵丹妙药 - 赵梓淇
的独特优势 • Ownership 与 Lifetime • 无栈协程 Async Rust 回顾 Rust 的无栈协程抽象 — Future Async Rust 回顾 • 通过 poll 驱动的状态机 • 组合嵌套为调度单元: Task • async fn 语法糖 Async Rust 观测与调试的痛点 Async Rust 回顾 • 特性: Future 灵活的可组合性 •0 码力 | 37 页 | 8.60 MB | 1 年前3Zadig 面向开发者的云原生 DevOps 平台
业务创新 平台运维 业务压力大,能力建设缓慢: • 大量工作花在工具链维护 • 项目间依赖复杂,环境管理难 • 交付版本依赖工单,发布风险高 • 公共资源 / 业务资源利用率低 赋能多业务:一个平台解决了多异构项目的管理和规范 团队高效协作:定义团队角色工作流模板,随时可用云上环境 价值清晰呈现:为管理者提供全视角效能数据,赋能数字决策 人工低效操作减少 80% 构建资源利用率提升 业务资源利用率提升 30% 统一治理内部规范,开发 自助上线;解放运维,工 作重心向业务稳定性保 障,建设平台工程体系 研发 研发时间被大量占用: • 本地开发环境难模拟 • 多业务联调艰难,诊断耗时多 • 出现问题诊断耗时多 • 流程割裂协作痛苦,响应慢 调试自测免打扰:本地 / 子环境免打扰,独立完成验证工作 自助验证更高效:自动化工作流 + 云上环境,高效验证调试 安全发布有信心: 一个平台完成日常 需求研发总耗时降低 30% 需求迭代周期缩短 1-5 倍 解放开发,专注编码 更多的架构和技术提升 测试 效率和质量难以平衡: • 自动化测试难以开展 • 环境不稳定并行验证效率低 • 测试多苦劳,价值难以体现 测试效果提升:独立稳定环境用于测试验收、自动化建设 价值被团队感知:自动化测试从开发到发布被全团队感知 部署频率升高 1-5 倍 验证有效性提升 100% 解放测试,全面自动化0 码力 | 59 页 | 81.43 MB | 1 年前3新一代分布式高性能图数据库的构建 - 沈游人
路径算法 • … 图深度学习 • 图嵌入 • 图卷积 • 图注意力网络 • 图自编码器 图查询及其应用场景 图查询 • 使用图数据库的查询语言进行点边的关联查询,可以快速完成传统数据库难以完成的 多度点边关 联 当前图的典型应用场景 路径识别 群体挖掘 节点识别 相似节点 链接预测 连接强度 一致行动人 同事关系 实际控制人 可能认识的人 上下游 同爱好的人 亲属关系 … 针对大规模图优化的存算引擎 - 配合 Atlas 图平台,实现无代码图分析 - Query 性能分析模块,启发式提示优化 - 内置多种分析函数,面向分析师友好 -MVOCC 保证事务一致性 - 多副本管理保证数据服务高可用 - 在线备份提供容灾保障 高速 易用 可靠 Why Rust ? Performance • Blazingly fast and memory-efficient 内存缓存结构:加速图数据查询 • 由于图数据的查询通常是 IO 密集型,且访问的数据随机又分散,拥有内存缓存能起到很 好的加速效果 • 要想让内存缓存发挥最大的作用,就要能在有限的内存中存下尽量多的图数据 • 例如,对于属性的存储,可以通过自行序列化 / 反序列化大幅节省内存 • 而自定义存储格式往往需要内存的精细操作,由于 Rust 允许在 unsafe 下访问裸指针, 可以实现零开销读取0 码力 | 38 页 | 24.68 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起
GNU gcc g++ gfortran LLVM clang clang++ flang 多文件编译与链接 • 单文件编译虽然方便,但也有如下缺点: 1. 所有的代码都堆在一起,不利于模块化和理解。 2. 工程变大时,编译时间变得很长,改动一个地方就得全部重新编译。 • 因此,我们提出多文件编译的概念,文件之间通过符号声明相互引用。 • > g++ -c hello.cpp -o hello PUBLIC test) # 为 myexec 链接刚刚制作的库 libtest.a • 其中 PUBLIC 的含义稍后会说明( CMake 中有很多这样的大写修饰符) 为什么 C++ 需要声明 • 在多文件编译章中,说到了需要在 main.cpp 声明 hello() 才能引用。为什么? 1. 因为需要知道函数的参数和返回值类型:这样才能支持重载,隐式类型转换等特性。例 如 show(3) ,如果声明了 库就是受到他启发(完全是头文件组成) 6. fmtlib/fmt - 格式化库,提供 std::format 的替代品(需要 -DFMT_HEADER_ONLY ) 7. gabime/spdlog - 能适配控制台,安卓等多后端的日志库(和 fmt 冲突!) • 只需要把他们的 include 目录或头文件下载下来,然后 include_directories(spdlog/include) 即 可。 • 缺点:函数0 码力 | 32 页 | 11.40 MB | 1 年前3Zadig 产品使用手册
传统 Jenkins 方案 GitLab + Jenkins + 脚本化 运行效率低,管理维护成本高 方案局限性大,安全性风险高 无法支持敏捷交付模式 支持从需求到发布全流程敏捷交付。尤其面向 多服务并行部署发布,云原生构建环境和运行 环境,基础设施对接及企业级 SSO/ 权限管理 等 运维管理类平台 蓝鲸 Rainbond KubeSphere KubeVela 面向资源管理的运维工具集 云厂商 DevOps 平台 华为云 DevCloud 阿里云效 腾讯 CODING 云厂商引流为主,锁定风险高 对多云跨地域支持不够 实施负担较重难以推广 面向多云友好,厂商中立,全球多地跨云跨域 安全可靠自动化部署 云原生 CI/CD 工具 Tekton Argo 使用门槛高、学习成本高 需要额外建设全流程能力 接入和使用都极其简单,内置模板库 和最佳实践,基于平台工程打造,可以轻松连 高 级 工 程 师 为 主 , 核 心 成 员 是 来 自 于 谷 歌 , 腾 讯 , 七 牛 云 , 阿 里 的 技 术 骨 干 。 公 司 已 经 连 续 完 成 来 自 顶 级 资 本 的 多 轮 融 资 。 自 Z a d i g 2 0 2 1 年 开 源 以 来 , 公 司 连 续 两 年 被 评 为 “ 开 源 中 国 ” 的 “ 年 度 优 秀 开 源 技 术 团 队 ”0 码力 | 52 页 | 22.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅
有几个核心就开 几个线程,因为我们只要同时执行就行了嘛。 • 比如 cornell box 这个例子里,我们把图片均匀 等分为四块处理。然而发现 4 号线程所在的块, 由于在犄角旮旯里光线反弹的次数多,算得比其 他块的慢,而有的块却算得快。但是因为木桶原 理,最后花的时间由最慢的那个线程决定,因此 变成 1 分 30 秒了,多出来的 30 秒里 1 号和 2 号 核心在闲置着,因为任务简单已经算完了,只有 运算符依次访问 连续的 n 个元素, * 运算符访问当前指 向的元素。 可安全地被多线程并发访问 • 除了内存不连续、指针和迭代器不失效的 特点, tbb::concurrent_vector 还是一个多 线程安全的容器,能够被多个线程同时并 发地 grow_by 或 push_back 而不出错 。 • 而 std::vector 只有只读的 .size() 和 [] 运算符是安全的,且不能和写入的 wrap 大小 64 ,尹伟达的 wrap 大小 32 高性能计算既然要高性能,必须针对不同硬 件优化,而优化策略都不一样,何谈统一? 黄仁勋回应称:单机上 CPU 的并行,多机上的 CPU 并行,单机单卡 GPU ,单机 多卡 GPU ,每一种要采用的策略都完全不同,表示不看好 oneapi 能统一异构计算 …… 现在流行改名运动? Facebook 改名 Meta ? TBB 改名 OneTBB0 码力 | 116 页 | 15.85 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
125/64*4≈8 • 即从主内存读取一次 float 花费 8 个 cycle , 符合小彭老师的经验公式。 • “right” 和“ wrong” 指的是分支预测是否成功。 多少计算量才算多? • 看右边的 func ,够复杂了吧?也只是勉勉强强超过一 点内存的延迟了,但在 6 个物理核心上并行加速后, 还是变成 mem-bound 了。 • 加速比: 1.36 倍 • 应该达到 https://blog.csdn.net/qq_36287943/article/details/103601176 第 3 章:预取与直写 顺序访问与随机访问 • 随机访问的效率比顺序访问低的多。 • 其中一个原因当然是:随机访问只会访问到其中一个 float ,而这导致 他附近的 64 字节都被读取到缓存了,但实际只用到了其中 4 字节,之 后又没用到剩下的 60 字节,导致浪费了 94% ,我们把每个核心访问的地方跨越了 16KB , 这样 CPU 就知道每个核心之间不会发生冲突 ,从而可以放心地放在一级缓存里,不用担心 会不会和其他核心共用了一个缓存行了。 • 不过错误共享只会发生在写入的情况,如果多 个核心同时读取两个很靠近的变量,是不会产 生冲突的,也没有性能损失。0 码力 | 147 页 | 18.88 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
拷贝 拷贝 ptr=xxx, len=5 ptr=yyy, len=5 弱引用胖指针: string_view • 如果把一个强引用的 string 到处拷贝来拷贝去,则其指向的字符串也会被多 次拷贝,比较低效。人们常用 string const & 来避免不必要拷贝,但仍比较麻 烦。 • 因此 C++17 引入了弱引用胖指针 string_view ,这种弱引用( weak reference _S_local_capacity + 1 了没,他是为 了给 ‘ \0’ 留个空位,为的是让 c_str 总能正常得到 0 结尾字符串。 所以因为要支持 c_str , string 其实比 vector 多一个负担:需要 额外一个字节的空间来存放 ‘ \0’ 。 string 的小字符串优化 • string 的 capacity 函数也经过了特殊处理。 string 内存分布示意图 _M_dataplus GB18030 编 码,包含了 27484 个汉字。 • 但是随着富连网的普及,很多网站都会跨国访问,如果你的电脑配置为 GBK ,那么看到其他编码格式的网站就会出现乱码。如何统一世界上这么多 文字的编码?所以出现了俗称“万国码”的 Unicode 。他给世界上所有的字符编 码,从英文字母到中文汉字到古埃及象形文字,现在全部都可以用一个 0x000000~0x10FFFF 的整数表示了,是不是很暴力?0 码力 | 162 页 | 40.20 MB | 1 年前3
共 21 条
- 1
- 2
- 3