C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程如下载一个文件,同时还要和用户交互。 • 这在 GUI 应用程序中很常见,比如浏览 器在后台下载文件的同时,用户仍然可以 用鼠标操作其 UI 界面。 没有多线程:程序未响应 • 没有多线程的话,就必须等文件下载完了 才能继续和用户交互。 • 下载完成前,整个界面都会处于“未响应”状 态,用户想做别的事情就做不了。 现代 C++ 中的多线程: std::thread • C++11 开始,为多线程提供了语言级别的 表达式。 • 当那个线程启动时,就会执行这个 lambda 里的内容。 • 这样就可以一边和用户交互,一边在另一 个线程里慢吞吞下载文件了。 错误:找不到符号 pthread_create • 但当我们直接尝试编译刚才的代码,却在链接时发生了错误。 • 原来 std::thread 的实现背后是基于 pthread 的。 • 解决: CMakeLists.txt 里链接 Threads::Threads Threads::Threads 即可: 有了多线程:异步处理请求 • 有了多线程的话,文件下载和用户交互分 别在两个线程,同时独立运行。从而下载 过程中也可以响应用户请求,提升了体验 。 • 可是发现一个问题:我输入完 pyb 以后, 他的确及时地和我交互了。但是用户交互 所在的主线程退出后,文件下载所在的子 线程,因为从属于这个主线程,也被迫退 出了。 主线程等待子线程结束: t1.join()0 码力 | 79 页 | 14.11 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台自助上线;解放运维,工 作重心向业务稳定性保 障,建设平台工程体系 研发 研发时间被大量占用: • 本地开发环境难模拟 • 多业务联调艰难,诊断耗时多 • 出现问题诊断耗时多 • 流程割裂协作痛苦,响应慢 调试自测免打扰:本地 / 子环境免打扰,独立完成验证工作 自助验证更高效:自动化工作流 + 云上环境,高效验证调试 安全发布有信心: 一个平台完成日常 90% 工作,开发自助发布 需求研发总耗时降低 安全建设缺乏时机和抓手 • 出现问题,影响业务进度 前置安全服务:全流程嵌入安全检测,避免流入业务环节。 全流程安全门禁:关键环节设置安全门禁,快速反馈研发改进 故障拦截率提升 1-3 倍 业务响应效率提升 3-5 倍 全流程安全建设 更多价值体现 组织 靠流程和个人,效率越来越低 • 低人效 / 低质量 / 低效率 / 高成本 • 人淹没在系统的海洋里 • 无数平台手工切换 靠系统和技术,能力长在平台上 平台。 效果收益 1. 每月节省 15 人天 2. 新项目接入效率提升 8 倍 (人力从 8 人降低为 1 人) 3. 整体生产力提升一倍以上 4. 大幅降低发布事故和错误率 自动化测试场景:上千测试用例为发布保驾护航 — — 字 节 跳 动 - 飞 书 S R E 工 程 师 “ Z a d i g 解 决 方 案 面 向 开 源 , 可 用 性 极 高0 码力 | 59 页 | 81.43 MB | 1 年前3
Zadig 产品使用手册付效率低下、占据大量研发时间 、研发利用率极低 环境不透明、测试效率低下、测 试有效性低、大量手工、价值难 以体现 上下游烟囱式、协作效率低、团 队花大量时间在碎片化沟通和流 程制定上、各方能力受限、无法 快速响应市场需求 层级越高、对产研状态越模糊 管理低效、延误战机 少量配置、快速拉起环境、稳定 性有保障、减少 90% 手工操作、 赋能开发、员工成就感高 碎片化:手工协作 + 复杂工具链 工程化:一个平台 程度高、测试有效性提升、质量 有保障、横向赋能、技能提升 随时调用工程基线提供的能力、 产品视角开发交付、团队高效协 同、稳定迭代 产研数字化过程数据透明、关键 指标易抽取、有能力合理调动资 源、随时决策响应客户需求 碎片化 研 发模 式 产研全流程拉通需求到上线所需的代码、服务、配置和数据的一致性交付 Jira 飞书 项管 其他 自测 环境 Argo K8s JFrog YAML 、产研高效工程化协作、快速应对业务迭代 Zadig 产品特性:发布中心 编排组织、流程、内外部系统,管理代码、配置、数据变更流程,支持灰度组合策略 Zadig 产品特性:客户交付 面向大客户全天候响应、全地域升级部署,提供自运维和专用服务通道,实现稳定高效交付和服务保障 成 立 于 2 0 1 8 年 , K o d e R o v e r 是 国 内 在 云 原 生 D e v O p0 码力 | 52 页 | 22.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 请问下面这三段代码有什么错误? • float x = -3.14; • printf(“%f\n”, abs(x)); • char str[10]; • scanf(“%10s”, str); • int size • 如果用来获取 float 类型的绝对值呢? • 编译通过了,但是结果却不对! • 你会发现 x 无论如何变化,都是 0.0 。 • 这其实是两个 bug 共同作用的结果。 printf 的错误:不会编译时检测参数类型是否正确 • 第一个 bug 是, printf 其实不知道他的参数是什 么类型,他只看到你字符串里写的 “ %f” ,会误以 为输入的是 float 参数。 • 如果你输入的是 int 类型的函数: • int abs(int x); • 因此在输入给他一个浮点类型的 x 时,相当于 • x = (float)abs((int)x) • 所以被 x 被隐式转换(不会产生错误)成了 int 之后才调用 abs ,相当于调用了 x = abs(- 3) 。 fabs 函数:取出浮点的绝对值 • abs 是整数的绝对值函数,而这里我们其实是 需要浮点的绝对值函数,他叫做0 码力 | 128 页 | 2.95 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人图咨询服务 Source : Graph Aware 图数据库发展趋势 AtlasGraph 研发背景 • 业务对大图分析的诉求(千亿点、万亿边) • 实时风控对图库的性能挑战( OLTP 毫秒级响应) • 海致图平台产品服务于金融、政府行业有大量业务经验积累(接近客户需求) • 现有开源产品无法满足要求(受限于基础架构设计,优化性能有限) 新一代分布式图数据库需具备的特性 特性 信 雅 分布式存储及并行计 算, Shared Nothing 模式支 持存储计算分离 高性能 基于 Rust 开发的分布式存储引 擎及图计算引擎,精细的内存 管理设计,内置索引系统,支 持毫秒级的并发查询响应速度 易用 AQL(Atlas Graph Query Language) ,类 SQL 的图查询 语言,内置上百种分析函数, 面向分析师友好,拥抱标准, 基于 openCypher 向 ISO0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程传了指向 ret 的指针,但 ret 的值并没有被改写成 功。 分析返回的错误代码 • CUDA 的函数,如 cudaDeviceSynchronize() 。 • 他们出错时,并不会直接终止程序,也不会抛出 C++ 的异常,而是返回一个错误代码,告诉你出的具体什么 错误,这是出于通用性考虑。 • 这个错误代码的类型是 cudaError_t ,其实就是个 enum 类型,相当于 类型,相当于 int 。 • 可以通过 cudaGetErrorName 获取该 enum 的具体名 字。这里显示错误号为 77 ,具体名字是 cudaErrorIllegalAddress 。意思是我们访问了非法的地 址,和 CPU 上的 Segmentation Fault 差不多。 封装好了: helper_cuda.h • 其实 CUDA toolkit 安装时,会默认附带一系列案例代码, 让他包含这个头文件目录。 • 他定义了 checkCudaErrors 这个宏,使用时只需: • checkCudaErrors(cudaDeviceSynchronize()) • 即可自动帮你检查错误代码并打印在终端,然后退出。还会 报告出错所在的行号,函数名等,很方便。 堆上分配试试? • 那你可能会想,难道是因为我的 ret 创建 在栈上,所以 GPU 不能访问,才出错的 ? •0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器由浅入深学习 map 容器 by 彭于斌( @archibate ) 我负责监督你鞋习 ! 我负责监督你鞋习 ! 本期看点: 用方括号 [ ] 取出 map 元素居然是错误的! 能不能在遍历的同时删除元素?安全吗? emplace , emplace_hint , try_emplace 的区别? 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2 读取元素,找不到键值会出错,调试时更早发现错误。 • C++ 中 val = m[“key”] 读取元素,找不到键值不会出错而是默默创建,还初始化为 0 。 • C++ 中 val = m.at(“key”) 读取元素,找不到键值会出错,调试时更早发现错误。 • 所以 C++ 中读取元素,应该用 at() 才对, at() 在读取时和多数语言的 [] 行为一致。 • 很多初学者都会错误使用 [] 读取元素,他 读取元素,他以为找不到键值会报错,结果他不报错,默默创 建了个 0 返回给你,导致实际报错的地方滞后,没发现错误在 map 的读取这里,严重影 响他的调试效率( javascript 的 undefined 直呼内行)。 写入 map 元素 • mapm; • 写入 map 中指定键值的元素有两种方法。 • m[“key”] = val; // 0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南cmake_minimum_required 指定最低所需的 CMake 版本 假如你写的 CMakeLists.txt 包含了 3.15 版本才有的特性, 如果用户在老版本上使用,就会出现各种奇怪的错误。 因此最好在第一行加个 cmake_minimum_required(VERSION 3.15) 表示本 CMakeLists.txt 至少需要 CMake 版本 3.15 以上才能运行。 如果用户的 享有同样的属性 相当于改变了各个属性的初始默认值。 要注意此时 set(CMAKE_xxx) 必须在 add_executable 之前才有效。 如果你从百度学的 CMake ,你可能会犯如下的错误 对于 CXX_STANDARD 这种 CMake 本就提供了变量来设置的东西,就不 要自己去设置 -std=c++17 选项,会和 CMake 自己设置好的冲突,导致出 错。 请始终用 CXX_STANDARD OpenVDB (反面教材) 一些老年项目作者喜欢在项目里自己塞几个 FindXXX.cmake ,然而版本可能和系统里 的不一样,比如用 3.0 的 finder 去找 2.0 的包,容易出现一些奇奇怪怪的错误。 不建议大家这样用自己创建一个 cmake/ 目录来存用到的所有库的 finder ,尽量用系统 自带的,可以保证用的是系统自带库的那个配置。 find_package(Qt5 REQUIRED)0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅请求,如果是单线程的 listen-accept 循环 ,则在处理完 A 的请求之前, B 的请求 就无法处理,造成“无响应”现象。 C 的请 求进来,则还得继续排队…… • 每个请求开启一个线程来处理,这样处理 A 用户的同时还可以继续监听 B 用户发 来的请求,及时响应,改善用户体验。 • 并行:某图形学爱好者购置了一台 4 核处理 器的电脑,他正在渲染 cornell box 的图像,0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理资源获取视为初始化,反之,资源释放视为销毁 C++ 除了用于初始化的构造函数( constructor ) 还包括了用于销毁的解构函数( destructor ) 离开 {} 作用域自动释放 手动释放 RAII :避免犯错误 与 Java , Python 等垃圾回收语言不同, C++ 的 解构函数是显式的,离开作用域自动销毁,毫不含 糊(有好处也有坏处,对高性能计算而言利大于 弊) 如果没有解构函数,则每个带有返回的分 reinterpret_cast(0xb8000) 而不是 (void *)0xb8000 • 更加明确用的哪一种类型转换( cast ),从而避免一些像是 static_cast (ptr) 的错误 。 • 虽然作者也经常会忍不住在 zeno 中用 编译器默认生成的构造函数:无参数(小心 POD 陷阱!) • 除了我们自定义的构造函数外,编译器还会自动生成一些构造函数。 • 当一个类 最简单的办法是,直接禁止用户拷贝这个 类的对象,在 C++11 中可以用 = delete 表示这个函数被删除,让编译器不要自动 生成一个默认的(会导致指针浅拷贝的) 拷贝构造函数了。 • 这样就可以在编译期提前发现错误: 解决方案:要么定义 • 如果需要允许用户拷贝你的 Vector 类对象 ,我们还是需要实现一下的。 • 发现了吗?其实不管是 size/resize 这样的 get/set 模式也好;自定义的拷贝构造函数 0 码力 | 96 页 | 16.28 MB | 1 年前3
共 20 条
- 1
- 2













