C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南
00 一、划分子项目 • 大型的项目,往往会划分为几个子项目。 • 即使你只有一个子项目,也建议你先创建 一个子目录,方便以后追加新的子项目。 • 左图的案例中,我们在根目录下,创建了 两个子项目 biology 和 pybmain ,他们 分别在各自的目录下有自己的 CMakeLists.txt 。 二、根项目的 CMakeLists.txt 配置 • 在根项目的 CMakeLists CMakeLists.txt 中,设置了默 认的构建模式,设置了统一的 C++ 版本 等各种选项。然后通过 project 命令初始 化了根项目。 • 随后通过 add_subdirectory 把两个子项 目 pybmain 和 biology 添加进来(顺序 无关紧要),这会调用 pybmain/CMakeLists.txt 和 biology/CMakeLists.txt 。 三、子项目的 时自动检测目录是否更新,如果目录有新文件了, CMake 会自动帮你重新运行 cmake -B build 更新 myvar 变量。 六、头文件和源文件的一一对应关系 • 通常每个头文件都有一个对应的源文件,两个文件名字应当相同 (方便我们理解,也方便 IDE 跳转),只有后缀名不一样。 • 如果是一个类,则文件名应和类名相同,方便查找 ( Animal.cpp )。 • 头文件中包含函数和类的声明,源文件则包含他们的实现。0 码力 | 56 页 | 6.87 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起
的内容插入到记号所在的位置,这样不就只用编辑 hello.h 一次了嘛 ~ • 后来,这个编译前替换的步骤逐渐变成编译器的了一部分,称为预处理阶段, #define 定 义的宏也是这个阶段处理的。 • 此外,在实现的文件 hello.cpp 中导入声明的文件 hello.h 是个好习惯,可以保证当 hello.cpp 被修改时,比如改成 hello(int) ,编译器能够发现 hello 这种形式表示不要在当前目录下搜索,只在系统目 录里搜索,” hello.h” 这种形式则优先搜索当前目录下有没有这个文件,找不到再搜索系统 目录。 • 此外,在实现的文件 hello.cpp 中也导入声明的文件 hello.h 是个好习惯: 1. 可以保证当 hello.cpp 被修改时,比如改成 hello(int) ,编译器能够发现 hello.h 声明的 hello() 和定义的 hello(int) 递归地使用头文件(续) • 但是这样造成一个问题,就是如果多个头文件都引用了 MyClass.h ,那么 MyClass 会被 重复定义两遍: • 解决方案:在头文件前面加上一行: #pragma once • 这样当预处理器第二次读到同一个文件时,就会自动跳过 • 通常头文件都不想被重复导入,因此建议在每个头文件前加上这句话 头文件进阶 - 递归地使用头文件(再续) (自动跳过) CMake 中的子模块0 码力 | 32 页 | 11.40 MB | 1 年前3新一代分布式高性能图数据库的构建 - 沈游人
的学科带头人,我国高性能计算和存储系统等方面的 泰斗和先行者。 2021 年 3 月 25 日,海致科技与清华大学计算机科学与技术系共同建设高性能图计算院士专家工作站 。 高性能图计算是高性能计算、图计算两项技术融合产生的新的技术方向,满足人们对更大规模、更复 杂数据的实时处理和存储需求,是计算机领域竞争新战略制高点。 产学结合、协同创新,打造全球领先的国产自研图数据库 AtlasGraph ,培育世界级的图计算软硬件 Projection Filter Stage Stage 物理执行计划 01 02 03 将不同的执行阶段推送到对应的存储 引擎,减少网络传输和内存压力 实际执行时,执行器等待流数据,处 理后将数据推送到下一个执行器 切分执行计划,将执行计划划分成不 同的执行阶段 内存缓存结构:加速图数据查询 • 由于图数据的查询通常是 IO 密集型,且访问的数据随机又分散,拥有内存缓存能起到很 自研图计算系统架构、极致的性能优化 深度适应客户的系统环境和算法需求 • 机器数量有限,通常小于 10 • 网络带宽不高(千兆、万兆以太网) • 需要支持各种不同类型的图计算算法 双重执行模式 • 单机和分布式两套计算系统,在不同的使用 环境中都能达到最佳性能 针对常用算法逐个设计优化方案 • 对于常用算法,跳过固定的编程模型,分 别设计最佳的计算方案 • 例如我们自研的 node2vec 采样算法比现0 码力 | 38 页 | 24.68 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南
CMake 项目的构建分为两步: • 第一步是 cmake -B build ,称为配置阶段( configure ),这时只检测环境并生成构建规则 • 会在 build 目录下生成本地构建系统能识别的项目文件( Makefile 或是 .sln ) • 第二步是 cmake --build build ,称为构建阶段( build ),这时才实际调用编译器来编译代码 • 在配置阶段可以通过 -D 设置缓存变量。第二次配置时,之前的 CMake 自己设置好的冲突,导致出 错。 请始终用 CXX_STANDARD 或是全局变量 CMAKE_CXX_STANDARD 来 设置 -std=c++17 这个 flag , CMake 会在配置阶段检测编译器是否支持 C++17 。 CUDA 的 -arch=sm_75 也是同理,请使用 CUDA_ARCHITECTURES 属 性。 再说了 -std=c++17 只是 GCC 编译器的选项,无法跨平台用于 C:/vcpkg/scripts/buildsystems/vcpkg.cmake” • PATH 目录路径,例如 “ C:/Qt/Qt5.14.2/msvc2019_64/lib/cmake/” • BOOL 布尔值,只有两个取值: ON 或 OFF 。 • 注意: TRUE 和 ON 等价, FALSE 和 OFF 等价; YES 和 ON 等价, NO 和 OFF 等价。 https://www.cnblogs0 码力 | 166 页 | 6.54 MB | 1 年前3Zadig 面向开发者的云原生 DevOps 平台
部署 / 灰度上线 xN 监控 / 告警 xN 版本归档 xN 交付追踪 xN 数据度量 xN 服务、工单管理 事件、缺陷管理 想 法 用 户 运行阶段 需求阶段 研发阶段 现代软件交付挑战:开发 5 分钟,上线 2 小时 服务一:设计 | 代码编写 | 构建 | 测试 | 部署 | 发布 个 统 一 的 协 作 平 台 , 面 对 这 样 的 挑 战 , 以 小 鹏 、 理 想 汽 车 为 例 。 小鹏同时采用 Zadig 的主机项目和 K8s Helm Chart 项目两种场景做业务 接入,把交付端实现统一管理起来,来满足研发所有业务的日常迭代需 求。 理想使用 K8s CRD 来实现对设备状态的定义和管理,同时设备端使用 Agent 来和云端做交互,利用 领域云计算工程技术专家和高级工程师为主,骨干技术成员是来 自于谷歌,腾讯,七牛云,阿里。公司已经连续完成来自顶级资本的多轮融资。 自 Zadig 2021 “ ” “ ” 年开源以来,公司连续两年被评为 开源中国 的 年度优秀开源技术团队 , 36 氪「新经济 “ ” 之王」基础软件赛道的 年度企业 , GADI “ ” 汽车新智造创新行业峰会的 最佳数字化服务商企业 。经过几年 的快速发展,0 码力 | 59 页 | 81.43 MB | 1 年前3Zadig 产品使用手册
新版本全量发布 Sprint 发布 需求开发 测试验证 产品规划 变更发布 生产环境发布—— Istio 发布, 执行工作流更新生产环境 步骤包含:部署新版本 20% 流量导入新版本 -> 审批 -> 100% 流量导入新版本 Sprint 发布 需求开发 测试验证 产品规划 Sprint 发布 变更发布 需求开发 测试验证 产品规划 uat 发布——版本管理 生成版本信 里 的 技 术 骨 干 。 公 司 已 经 连 续 完 成 来 自 顶 级 资 本 的 多 轮 融 资 。 自 Z a d i g 2 0 2 1 年 开 源 以 来 , 公 司 连 续 两 年 被 评 为 “ 开 源 中 国 ” 的 “ 年 度 优 秀 开 源 技 术 团 队 ” , 2 0 2 2 年 度 3 6 氪 「 新 经 济 之 王 」 基 础 软 件 赛 道 的 “0 码力 | 52 页 | 22.95 MB | 1 年前3谈谈MYSQL那点事
机房的 M2 只做 standby 容灾方 式的用途。 当然这里会用到 3 台数据库服务器,也许会增加采 购压力,但是我们可以提供更好的对外数据服务的能力和 途径,实际中尽可能两者兼顾。 MySQL 架构设计—高可用架构 系统优化:硬件、架构 系统优化:硬件、架构 服务优化 服务优化 应用优化 应用优化 MySQL MySQL 优化方式 优化方式 影响性能的因素 SHOW INDEX INDEX FROM xxx FROM xxx 来查看表索引 来查看表索引 使用 使用 LOAD DATA LOAD DATA 导入数据比 导入数据比 INSERT INTO INSERT INTO 快多了 快多了 SELECT COUNT(*) FROM Tbl SELECT COUNT(*) FROM Tbl 在0 码力 | 38 页 | 2.04 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
‘ \ n’ , ^H 就是 ‘ \b’ ,所以以前原始的计算机键盘上其 实还没有 Enter 键,大家都是按 Ctrl+J 来换行的… … • 不过,如果直接在控制台输入 ‘ ^’ 和 ‘ C’ 两个字符并 没有 Ctrl+C 的效果哦!因为 ‘ ^C’ 是 Ctrl+C 输入之 后一次性显示出来的,并不是真的说 Ctrl 就是 ‘ ^’ 这 个字符。 C 语言字符串 第 2 章 C 语言中的字符类型 ,不用手动 free 。 C++ 字符串和 C 字符串的不同 • C 语言字符串是单独一个 char *ptr ,自动以 ‘ \0’ 结尾。 • C++ 字符串是 string 类,其成员有两个: char *ptr; size_t len; • 第二个成员用来确定结尾的位置,不需要 ‘ \0’ 结尾。 • 因此 string 类从 C 字符串构造时,可以额外指定一个长度: • string(“hello” 语言的这项规定,只能退而求其次,他另 外定义了一个 string 类,重载了 + 运算符,并告诉同学们:以后尽量用我这 个封装好的类,不要直接用 C 语言的 const char * 。 • 因此如果需要把两个字符串加在一起,就必须至少有一方是 string 才行。 • 可以用 string(“hello”) 这种形式包裹住每个字符串常量,这样就方便用 + 了 。 • 初学者建议每个字符串都用 string(“0 码力 | 162 页 | 40.20 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
修 饰符,即可让他在 GPU 上执行。 • 不过调用 kernel 时,不能直接 kernel() ,而 是要用 kernel<<<1, 1>>>() 这样的三重尖括 号语法。为什么?这里面的两个 1 有什么用 ?稍后会说明。 • 运行以后,就会在 GPU 上执行 printf 了。 • 这里的 kernel 函数在 GPU 上执行,称为核 函数,用 __global__ 修饰的就是核函数。 都可以调 用。 让 constexpr 函数自动变成 CPU 和 GPU 都可以调用 • 这样相当于把 constexpr 函数自动变成修饰 __host__ __device__ ,从而两边都可以调用。 • 因为 constexpr 通常都是一些可以内联的函数,数学计 算表达式之类的,一个个加上太累了,所以产生了这个 需求。 • 不过必须指定 --expt-relaxed-constexpr 他在 GPU 编译模式下会定义 __CUDA_ARCH__ 这个宏,利用 #ifdef 判断该宏是否定义,就可以判断当前是否处于 GPU 模式 ,从而实现一个函数针对 GPU 和 CPU 生成两份源码级不同的 代码。 __CUDA_ARCH__ 是个版本号 • 其实 __CUDA_ARCH__ 是一个整数,表 示当前编译所针对的 GPU 的架构版本号 是多少。这里是 520 表示版本号是0 码力 | 142 页 | 13.52 MB | 1 年前3Rust与算法 - 谢波
结算及大数据系统研发工程师 疫情下的明智选择 / 个人项目实践 学习中总结探索 2015 年发布,很多人近几年才知道 Rust , Rust 中国 大会也才第三届,期待 Rust 中国大会第十届 Rust 处于起步阶段 中文圈学习资料或书籍少,有部分是翻译国外产品,能 不能中国人向国外输出作品 Rust 缺少学习资源 Rust 未来大有可为 Rust 在操作系统,数据库,各种框架和工具上应用范围 广 写作动机 要反复总结和修改 ( 费曼学习法 ) 。 写作本书给我的启示 基础、排序、查找、树、图 代码框、颜色、图片绘制均由 Latex 完成 可参考点 为什么 为什么讲这个话题? 为什么要讲数据结构和算法两部分? 算法相关知识 算法相关知识 • 抽象数据类型 • 时空复杂度 • 复杂度计算 • 基本数据结构复杂度 抽象数据类型 什么是抽象数据类型? 为什么需要抽象数据类型? 时空复杂度0 码力 | 28 页 | 3.52 MB | 1 年前3
共 26 条
- 1
- 2
- 3