C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化二级缓存有 256 KB , 6 个物理核心每个都有一个, 总共 1.5 MB 。 • 三级缓存由各个物理核心共享,总共 12 MB 。 通过图形界面查看拓扑结构: lstopo 根据我们缓存的大小分析刚刚的图表 • 也可以看到刚刚两个出现转折的点,也是在 二级缓存和三级缓存的大小附近。 • 因此,数据小到装的进二级缓存,则最大带 宽就取决于二级缓存的带宽。稍微大一点则 只能装到三级缓存,就取决于三级缓存的带 )。 • 因此第二次进入的时候,如果 n 不超过上一次的大小 ,就还是用的第一次分配的内存,避免了重新分配的开 销。对 func 需要被重复调用的情况很实用。 第 6 章:多维数组 C 语言静态数组 • float a[n]; 可以在栈上分配有 n 个元素的一维数组。 • 通过 a[i] 访问第 i 个元素。 • float a[n][m]; 可以在栈上分配 n 行 m 列的二维数组。 ,才能储存在内存中。 • 对于 float a[3][4] 编译器实际上会把他变成一维数组 float a[3*4] ,然后把 a[i][j] 翻译为 a[i * 4 + j] 。 C++ 静态数组 • arraya; 可以在栈上分配有 n 个元素的一维数组。 • 通过 a[i] 访问第 i 个元素。 • array , m> a; 0 码力 | 147 页 | 18.88 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人银行证券保险 企业、公安部、上海市公安局、武汉市公安局等 100+ 公安机构,国家电网、 国信通产业集团等电力能源行业提供数据智能产品解决方案及长期服务。 海致专注为政府、金融、能源等客户提供大数据处理、分析、挖掘服务,在互 联网技术基础上,打造专业、易用的企业级大数据实战应用产品及解决方案。 北京中关村总部 武汉运维中心 深圳研发中心 上海应用中心 专注于数据智能技术赋能中国数字经济发展 AtlasGraph 大规模图数据分析平 台”荣获中国计算机学会( CCF : China Computer Federation )“ 2021 年 CCF 科 学技术奖科技进步卓越奖”。 伴随市场对于知识图谱应用的不断深入,图数据规模和应用性能之间的矛盾愈 加凸显,海致针对以上背景展开了系统性的技术攻关,解决了图数据的高效存 储、索引及复制难题,提出了基于图缩减的高效分析方法,并孵化出了一个大 规模图数据分析平台 AtlasGraph 。 5 获得 2022 年中国电子学会科学技术奖科技进步一等奖 中国电子学会发布的《 2022 中国电子学会科学技术奖公告》,海 致星图与北京邮电大学、蚂蚁科技集团有限公司、中移动信息技术 有限公司联合研发的“大规模复杂异质图数据智能分析技术与规模化 应用”项目,斩获“科学技术奖科技进步一等奖”,这也是国内电子信 息领域的最高奖项。 该奖0 码力 | 38 页 | 24.68 MB | 1 年前3
谈谈MYSQL那点事比如,订单处理流程,那么对读需要强一致性,实时写实 时读,类似种涉及交易的或者动态实时报表统计的都要采 用这种架构模式 弱一致性 如果是弱一致性的话,可以通过在 M2 上面分担一些读压力 和流量,比如一些报表的读取以及静态配置数据的读取模块 都可以放到 M2 上面。比如月统计报表,比如首页推荐商品 业务实时性要求不是很高,完全可以采用这种弱一致性的设 计架构模式。 中间一致性 如果既不是很强的一致性又不是很弱的一致性,那 MySQL MySQL 技巧分 技巧分 享 享 MySQL MySQL 技巧分享 技巧分享 常用技巧 常用技巧 使用 使用 Explain/ DESC Explain/ DESC 来分析 来分析 SQL SQL 的执行情况 的执行情况 使用 使用 SHOW PROCESSLIST SHOW PROCESSLIST 来查看当前 来查看当前 MySQL MySQL 服务器线 服务器线 MySQL Slow Log 分析工具 分析工具 mysqldumpslow - mysql mysqldumpslow - mysql 官方提供的慢查询日志分析 官方提供的慢查询日志分析 工具 工具 mysqlsla - hackmysql.com mysqlsla - hackmysql.com 推出的一款日志分析工具 推出的一款日志分析工具 ,功能 ,功能0 码力 | 38 页 | 2.04 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南biology/CMakeLists.txt 。 三、子项目的 CMakeLists.txt 配置 • 子项目的 CMakeLists.txt 就干净许多,只是创建了 biology 这个静态库对象,并通过 GLOB_RECRUSE 为他批量添加 了所有位于 src 和 include 下源码和头文件。 • 根项目的 CMakeLists.txt 负责处理全局有效的设定。而子 项目的 单项目有效。直接在你自己项目的 CMakeLists.txt 最开头写一行: • set(Qt5_DIR ”/opt/Qt5.12.1/lib/cmake/Qt5”) # 一定要加在最前面! 三种方案利弊分析 • 单次有效(通过命令行)最安全,小彭老师高度推荐。 • 全局有效(添加环境变量)可能影响以后其他项目。比如你 A 项目依赖 Qt5.12.1 ,你设置了环 境变量 Qt5_DIR=/opt/Qt5 1/msvc2017_64/bin/Qt5Core.dll (实际的动态库文件,对应 Qt5::Core ) • D:/Qt5.12.1/msvc2017_64/lib/Qt5Core.lib (实际的静态库文件,对应 Qt5::Core ) • D:/Qt5.12.1/msvc2017_64/lib/cmake/Qt5/Qt5Config.cmake (包配置文件) • 可以看到尽管是 Windows0 码力 | 56 页 | 6.87 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程<< ... • 这样显然是会被他自动优化掉的。 模板的应用:编译期分支 • 更进一步,可以用 C++17 的 if constexpr 语法,保证是编译期确定的分支: • (下一讲会深入分析编译器的工作原理) 模板的难题:编译期常量的限制 • 编译期常量的限制就在于他不能通过运行时变量组成的表达式来指定。比如: • 这里在 if constexpr 的表达式里用到了运行时变量,从而无法作为编译期分支的条件。 这里用到了带 auto 的 lambda ,利用了他具有多 次编译的特性,实现编译多个分支的效果。 • std::visit 、 std::variant 的这种模式称为静态多态, 和虚函数、抽象类的动态多态相对。 • 静态多态的优点是:性能开销小,存储大小固定。 缺点是:类型固定,不能运行时扩充。 用 variant 不用 visit ,就像看四大 名著不看红楼梦,后面我忘了,总 之就是只能度过一个相对失败的人0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 该类的解构函数一定在 main 之后执行 • 该技巧可用于在程序退出时删除某些文件之类 。 • 这就是小彭老师的静态初始化 (static-init) 大法 。 静态初始化用于批量注册函数 • 我们可以定义一个全局的函数表(右图中的 functab ),然后利用小彭老师的静态初始化 大法,把这些函数在 main 之前就插入到全局 的函数表。 • 这样 main 里面就可以仅通过函数名从 里面就可以仅通过函数名从 functab 访问到他们,从而 catFunc 和 dogFunc 甚至不需要在头文件里声明(只需 要他们的函数签名一样即可放入 function 容 器)。 静态初始化的顺序是符号定义的顺序决定的,若在不同文件则顺序可能打乱 • 你可能已经兴冲冲地把 dogFunc 和 catFunc 挪到另一个文件,然后把 functab 声明为 extern std::map< o 文 件在链接中是处于 cat.o 和 dog.o 后面 的话,那么 cat.o 和 dog.o 的静态初始 化就会先被调用,这时候 functab 的 map 还没有初始化( map 的构造函数也 是静态初始化!)从而会调用未初始化的 map 对象导致奔溃。 函数体内的静态初始化 • 为了寻找思路,我们把眼光挪开全局的 static 变量,来看看函数的 static 变量吧0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南main.cpp 调用 mylib.cpp 里的 say_hello 函数 改进: mylib 作为一个静态库 改进: mylib 作为一个动态库 改进: mylib 作为一个对象库 https://www.scivision.dev/cmake-object-libraries/ 对象库类似于静态库,但不生成 .a 文件,只由 CMake 记住该库生成了哪些对象文件 改进: mylib 作为一个对象库 / 对象库类似于静态库,但不生成 .a 文件,只由 CMake 记住该库生成了哪些对象文件 对象库是 CMake 自创的,绕开了编译器和操作系统的各种繁琐规则,保证了跨平台统一性 。 在自己的项目中,我推荐全部用对象库 (OBJECT) 替代静态库 (STATIC) 避免跨平台的麻烦 。 对象库仅仅作为组织代码的方式,而实际生成的可执行文件只有一个,减轻了部署的困难。 静态库的麻烦: GCC 对象库可以绕开编译器的不统一:保证不会自动剔除没引用到的对象文件 虽然动态库也可以避免剔除没引用的对象文件,但引入了运行时链接的麻烦 add_library 无参数时,是静态库还是动态库 ? 会根据 BUILD_SHARED_LIBS 这个变量的值决定是动态库还是静态库。 ON 则相当于 SHARED , OFF 则相当于 STATIC 。 如果未指定 BUILD_SHARED_LIBS 变量,则默认为 STATIC0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起有时候我们会有多个可执行文件,他们之间用到的某些功能是相同的,我们想把这些共用 的功能做成一个库,方便大家一起共享。 • 库中的函数可以被可执行文件调用,也可以被其他库文件调用。 • 库文件又分为静态库文件和动态库文件。 • 其中静态库相当于直接把代码插入到生成的可执行文件中,会导致体积变大,但是只需要 一个文件即可运行。 • 而动态库则只在生成的可执行文件中生成“插桩”函数,当可执行文件被加载时会读取指定目 CMake 中的静态库与动态库 • CMake 除了 add_executable 可以生成可执行文件外,还可以通过 add_library 生成库 文件。 • add_library 的语法与 add_executable 大致相同,除了他需要指定是动态库还是静态库: • add_library(test STATIC source1.cpp source2.cpp) # 生成静态库 libtest add_library(test SHARED source1.cpp source2.cpp) # 生成动态库 libtest.so • 动态库有很多坑,特别是 Windows 环境下,初学者自己创建库时,建议使用静态库。 • 但是他人提供的库,大多是作为动态库的,我们之后会讨论如何使用他人的库。 • 创建库以后,要在某个可执行文件中使用该库,只需要: • target_link_libraries(myexec0 码力 | 32 页 | 11.40 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台Zadig 优势、使用场景、解决问题域 Zadig 解决问题域 Zadig 云原生开放性:极简、 0 负担接入 Zadig 业务架构 Zadig 系统架构 1 Zadig 行业方案 对比分析 职能 传统 DevOps 方案 ZadigX 云原生 DevOps 方案 降本提效 组织能力提升 业务负责人 研发不透明,规划凭感觉: • 发版时间靠运气 • 团队熬夜冲进度 研发 / 高效率 / 低成本 • 人在系统之上 / 高效交互 • 复杂性下沉到单一平台 整体人效提升 1-5 倍 解除组织 / 流程 / 系统 孤岛,打造成长型组织 企业收益分析 现存方案 典型代表 方案特点分析 Zadig 方案优势 传统 Jenkins 方案 GitLab + Jenkins + 脚本化 运行效率低,管理维护成本高 方案局限性大,安全性风险高 无法支持敏捷交付模式;手工维护成本 • 自动化测试效益分析 高效协同的测试管理 • 一套 YAML/Chart 模板管理数百微服务 • 每个技术栈抽象一套构建模板 • 运维统一工作流规范,开发自主使用 • 跨多项目复用模板 扫码查看易快报案例 强大免运维的模板库 • 系统纬度:集群、项目、服务、环境、工作流 • 项目纬度:构建、测试、部署, DevOps 指标 • 迭代纬度:需求到发布效率、质量分析 • 效能度量:耗时分析、通过率统计、趋势分析0 码力 | 59 页 | 81.43 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programminge 等于 equal ne 不等于 not equal http://unixwiz.net/techtips/x86-jumps.html 手动进行无分支优化的方法 无分支优化:从汇编角度分析 • 发生了什么?让我们把源码和汇编逐个对应。 • x 是第一个参数(通过 edi 传入,被存入 rbp 指向的堆 栈) • 比较 x 和 0 的大小( cmp 命令把刚存入堆栈的 x 和 0 3 字节 填充零) • 返回类型 int 占据 4 字节( eax 寄存器就是 4 字节的) • 返回值都放 eax 寄存器(刚刚算得的就在 eax ,直接返 回) 无分支优化:从语法角度分析 • 刚刚其实是利用了 C 语言把 bool 类型的 true 当做 1 , false 当做 0 的特性。 • (int)true == 1 (int)false == 0 • 例如: • ifelse 的。 “ 摆大烂”的效果和 ifelse 几乎一样,也就是说根本没用,三目运算符还是生成了 低效的跳转指令,自己不上进,还指望编译器来救你?你还不如坐等天上掉馅饼。 从汇编角度分析( -O0 ) 从汇编角度分析( -O3 ) 因为 clamp 用了两次分支, if-else-if-else ,刚才 -O0 时是需要连续两次条件跳转指令的。 但是在 -O3 的淫威下,编译器把其中一个条件跳转自动优化掉了(0 码力 | 47 页 | 8.45 MB | 1 年前3
共 20 条
- 1
- 2













