RustBelt - Rust 的形式化语义模型第三届中国 Rust 开发者大会 王俊吉 RustBelt - Rust 的形式化语义模型 Outline Background • RustBelt Project • Rust Types Overview Rust Semantics • Type System • The own Predict • Exclusive Ownership & Mutable Borrow0 码力 | 21 页 | 2.63 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南vcpkg 装的库)。 科普:语义版本号( semantic versioning )系统 • 软件行业记录版本迭代普遍采用的是一套所谓的语义版本号系统,英文简称 semver 。 • 通常他的格式是三个用点分隔开来的十进制数字:. . • 例如: 1.2.0 , 0.6.8 , 18.11.0 • major 称为主版本号,出现功能重大变更,以至于和旧 旧 API 不兼容的时候会增加该号。 • minor 称为次版本号,功能有所变更或增加,但依然和旧的 API 兼容时会增加该号。 • patch 称为补丁版号,功能没有改变,只是修复了一些 bug 就重新发布时会增加该号。 • 也有的软件不拘一格(例如我们的 zeno ),索性用发布的日期作为版本号的三个数字, 例如 2022.11.2 。不论采用哪种编号方案,都是几个用点分开的数字,并且数字越大越新 ,且优先比较靠前面的数字。因此为了通用, CMake 支持最多四个点分开的版本号: . . . 。并且如果你写 0.6.8 他会自动帮你把多余的 tweak 默认为 0 ,也就是说 0.6.8 == 0.6.8.0 , 1.2 == 1.2.0 == 1.2.0.0 。 • 比较版本号时,可以用 if (${XXX_VERSION} VERSION_LESS 0 码力 | 56 页 | 6.87 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程CPU 生成两份源码级不同的 代码。 __CUDA_ARCH__ 是个版本号 • 其实 __CUDA_ARCH__ 是一个整数,表 示当前编译所针对的 GPU 的架构版本号 是多少。这里是 520 表示版本号是 5.2.0 ,最后一位始终是 0 不用管,我们 通常简称他的版本号为 52 就行了。 • 这个版本号是编译时指定的版本,不是运 行时检测到的版本。编译器默认就是最老 的 CMake 设置架构版本号 • 可以用 CMAKE_CUDA_ARCHITECTURES 这个变量 ,设置要针对哪个架构生成 GPU 指令码。 • 小彭老师的显卡是 RTX2080 ,他的版本号是 75 ,因 此最适合他用的指令码版本是 75 。 • 如果不指定,编译器默认的版本号是 52 ,他是针对 GTX900 系列显卡的。 • 不过英伟达的架构版本都是向前兼容的,即版本号为 75 的 RTX2080 也可以运行版本号为 52 的指令码,虽然 不够优化,但是至少能用。也就是要求:编译期指定的 版本 ≤ 运行时显卡的版本。 CMAKE_CUDA_ARCHITECTURES 会自动转换成 --gpu-code 等编 译 flag 版本号不要太新了 • 比如这里设置了 RTX3000 系列的架构版 本号 86 ,在 RTX2080 上就运行不出结 果。 • 最坑的是他不会报错!也不输出任何东西0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南VERSION x.y.z) 可以把当前项目的版本号设定为 x.y.z 。 • 之后可以通过 PROJECT_VERSION 来获取当前项目的版本号。 • PROJECT_VERSION_MAJOR 获取 x (主版本号)。 • PROJECT_VERSION_MINOR 获取 y (次版本号)。 • PROJECT_VERSION_PATCH 获取 z (补丁版本号)。 一些没什么用,但 CMake 这个变量来获得当前 CMake 版本号。 CMAKE_MINIMUM_REQUIRED_VERSION 获取 cmake_minimum_required 中指定的“最小所需版本号”。 注意: cmake_minimum_required 不仅是“最小所需版本” 虽然名字叫 minimum_required ,实际上不光是 >= 3.15 就不出错这么简单。 根据你指定的不同的版本号,还会决定接下来一系列0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 注意:这里的 m_inner.speak() 只是一个例子,其实不一定是成员函数,完全可以是 std::sort(m_inner.begin(), m_inner.end()) 之类的任意表达式,只要语义上通过,就可以实例化。 • (把 sort 封装成虚函数,留作回家作业) Zeno 中对 OpenVDB 的类型擦除 • 结合类型擦除技术,自动虚克隆技术。 • VDBGrid 作为所有网格类的基类提供各个0 码力 | 54 页 | 3.94 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人先水平。” 以终为始,以行为知,这一项目从图计算所面临的挑战出发,解决了大规模图数据所产生 的建模能力不足、结构知识难用、巨量数据难算等技术挑战,实现了大规模复杂异质图数 据的表示学习模型、语义推荐和风险管理关键技术,构建了完整的兼具理论指导与应用检 验的大规模图数据智能分析系统与平台,满足了大数据时代从复杂异质图数据中进行知识 发现的重要需求。最终获得国内外授权发明专利 43 项, CCF0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理• v2 = v1; • 时,因为拷贝赋值被删除,编译器会尝试: • v2 = List(v1) • 从而先调用拷贝构造函数,然后因为 List(v1) 相 当于就地构造的对象,从而变成了移动语义,从 而进一步调用移动赋值函数。 构造函数全家桶:总结 限于篇幅,其实构造函数还完全没讲完…… 下一讲继续完善我们刚才发明的 Vector 类 ! 也会详解 && 到底有哪些意思…… 来学智能指针压压惊0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串,尽量只在标准库里做手脚,尽可能只利用现有的语言特性,实现 cpp 的现代化。” • 例如 shared_ptr 可以通过利用语言本身的“拷贝构造函数”实现引用计数,没必要在编译器里 开洞。但“移动语义”这个概念在旧 cpp 里没有,所以这个是真正必要的语言本身的改动。 • 而 java 就是在语言层面,直接在 jvm 里引入了引用计数,宣称“一切皆对象”,虽然方便了 富连网业务中常见的面向对象编程范式,但也妨碍了0 码力 | 162 页 | 40.20 MB | 1 年前3
共 8 条
- 1













