陈东 - 利用Rust重塑移动应用开发-230618Rust Crypto Core 利用 Rust 重塑移动应用开发 RCC_android RCC_ios https://github.com/KeystoneHQ/rust-crypto-core https://github.com/KeystoneHQ/rcc_android https://github.com/aaronisme/rcc_ios Rust Crypto Core0 码力 | 22 页 | 2.10 MB | 1 年前3
Go读书会第二期Go 工具链使用实践 Part9 – 标准库、反射与 cgo 践行哲学,遵循惯例,认清本质,理解原理 • 高频使用的标准库包 ( net 、 http 、 strings 、 time 、 crypto 等 ) • Reflect 反射使用三大法则 • Cgo 使用的开销 • Unsafe 包的安全使用法则 “ 自带电池”,开箱即用 Part10 – 工程实践 践行哲学,遵循惯例,认清本质,理解原理0 码力 | 26 页 | 4.55 MB | 1 年前3
Bringing Existing Code to CUDA Using constexpr and std::pmr|void add_cpu(int n, float* x, float* y) { for (int i = 0; i < n; i++) y[i] = x[i] + y[i]; } TEST_CASE("cppcon-0", "[CUDA]") { int N = 1 << 20; float* x = new float[N]; float* = new float[N]; for (int i = 0; i < N; i++) { x[i] = 1.0f; y[i] = 2.0f; } add_cpu(N, x, y); delete[] x; delete[] y; } An Even Easier Introduction to CUDA 4 "[CUDA]") { int N = 1 << 20; float* x; float* y; cudaMallocManaged(&x, N*sizeof(float)); cudaMallocManaged(&y, N*sizeof(float)); // … cudaFree(x); cudaFree(y); } An Even Easier0 码力 | 51 页 | 3.68 MB | 6 月前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming这就是,无分支优化。 • setle 指令是单独一条指令,不需要跳转。 比起需要跳转的 jle 指令,他避免了 CPU 预测分支和预测失败带来的额外开销。 条件跳转指令 vs 无分支指令 • x86 指令集架构中,条件跳转指令有 j 开头的一系列,无分支指令有 set 系列和 cmov 系列。 • jle .L1 上一次比较结果为小于等于时,程序跳转到 .L1 处,否则不跳转继续往下执行。 位时代 cmov 系列曾经是 x86 的一个拓展特性(像 sse 一样),使用前需 要先用 cpuid 指令检测是否支持,如果在不支持 cmov 的 CPU 上使用会产生 SIGILL 错误。不过现在 64 位的 x86 CPU 都保证自带了 cmov 和 sse 拓展,所以不需要手动 开启什么开关编译器就会自动生成利用 cmov 和 sse 指令的高效代码,这也是 x86-64 的优点之一。 https://www.felixcloutier.com/x86/cmovcc https://www.felixcloutier.com/x86/setcc https://www.felixcloutier.com/x86/jcc 条件后缀一览表 后缀 含义 英文全称 le 小于等于(有符号) less or equal ge 大于等于(有符号) greater or equal0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器4 find(2) begin() end() * * * 出错! 在 set 中查询元素是否存在 • 因此,可以用这个写法: • set.find(x) != set.end() • 来判断集合 set 中是否存在 元素 x 。 • 这是个固定的写法,虽然要 调用两个函数看起来好像挺 麻烦,但是大家都在用。 • iterator find(int const &val) const; iterator end() const; 1 2 4 find(2) begin() end() find(8) 在 set 中查询元素是否存在 • 还有一种更直观的写法: • set.count(x) != 0 • count 返回的是一个 int 类型,表示 集合中相等元素的个数。 • 等等,不是说 set 具有去重的功能,不会 有重复的元素吗?为什么标准库让 count 计算个数而不是直接返回 类型能隐式转换为 bool , 所以 != 0 可以省略不写。 • size_t count(int const &val) const; 从 set 中删除指定元素 • set.erase(x) 可以删除集合中值为 x 的元素。 • erase 返回一个整数,表示被他删除元素的个 数。 • 个数为 0 就说明集合中没有该元素,删除失败 。 • 个数为 1 就说明集合中存在该元素,删除成功 。0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化这样一来,访问的数据量比较小时,就可以自动预先加 载到这个更高效的缓存里,然后再开始做运算,从而避 免从外部内存读写的超高延迟。 缓存的分级结构 查看高速缓存大小: lscpu • 可以看到我们 x86 电脑的缓存结构分为三级。 • 一级缓存分为数据缓存和指令缓存,其中数据缓存有 32 KB , 6 个物理核心每个都有一个,总共 192 KB 。而指令缓存的大小刚好和数据缓存一样也是 192 回缓存中的数据。如果找不到,则向主内存发送请求,等读 取到该地址的数据,就创建一个新条目。 • 在 x86 架构中每个条目的存储 64 字节的数据,这个条目 又称之为缓存行( cacheline )。 • 当访问 0x0048~0x0050 这 4 个字节时,实际会导致 0x0040~0x0080 的 64 字节数据整个被读取到缓存中。 • 这就是为什么我们喜欢把数据结构的起始地址和大小对齐到 AOS ,他的 MyClass 有三个 float ,大小仅为 12 字节。 • 所以当修改 MyClass 的 x 属性时,必须读取整个 MyClass ,仅仅 修改其中的 x 属性,然后写回。这就浪费了: y 的写、 z 的写、 z 的读。实际用上的只有: x 的读, y 的读, x 的写。浪费了 50% 带宽。 • 而 SOA 把三个属性分开存,每个属性作为独立的数组,稠密存储。 这样当用不到0 码力 | 147 页 | 18.88 MB | 1 年前3
C++23: An Overview of Almost All New and Updated FeaturesMultidimensional Subscript Operator Attributes on Lambda-Expressions Literal Suffix for size_t auto(x): decay-copy in The Language #elifdef, #elifndef, and #warning Marking Unreachable Code Assumptions Multidimensional Subscript Operator Attributes on Lambda-Expressions Literal Suffix for size_t auto(x): decay-copy in The Language #elifdef, #elifndef, and #warning Marking Unreachable Code Assumptions Multidimensional Subscript Operator Attributes on Lambda-Expressions Literal Suffix for size_t auto(x): decay-copy in The Language #elifdef, #elifndef, and #warning Marking Unreachable Code Assumptions0 码力 | 105 页 | 759.96 KB | 6 月前3
RustBelt - Rust 的形式化语义模型{True} let x = 10 {x = 10} {x = 3} x += 1 {x = 4} {True} loop {} {False} Hoare Logic Logics P: x ↦ v Ownership We own “x”, and “x” points to “v”. Disjointness Given “(x ↦ v) ∗ (y ↦ w)” that “x ≠ y”, i.e., they do not alias. P ∗ Q Separation Logic (Iris) P Q v x y P −∗ Q Magic wand Consuming resource “P”, we can reach resource “Q”. Q P what we acually own Logics (x ↦ v) v) ∗ (x ↦ w) ⟹ False (x ↦ v) ∧ (x ↦ w) ⟹ v = w Separation Logic (Iris) (x = 1) ∗ (y = 2) ⟺ (x = 1) ∧ (y = 2) Resources, unique Resources, not duplicable Non-resources Logics {True} let x0 码力 | 21 页 | 2.63 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针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 = 1000; • int *arr = (int *)malloc(size); 位的整数,实际上的内存地址并没有 64 位。 • 实际上地址的高 16 位始终和第 48 位一致(符号扩展),也就是虚拟地址空间只有 48 位。 • 而经过 MMU 映射后实际给内存的地址只有 39 位,因此如今的 x64 架构实际上只能访 问 512GB 内存,如果插了超过这个大小的内存条他也不会认出来。 • 此外, 16 位计算机实际上能通过额外的段寄存器访问到 20 位的内存地址( 1MB )。 • 32 intptr_t 代替。 实验:各种标准化类型的大小 • 我们可以通过 sizeof(T) 获取 T 类型的字节数。 实验:不同大小之间的整数互转 • C 语言可以用 (short)x 的形式来强制把任意类型的 x 转换为 short 类型。 • 如果源类型比目的类型小,那么会根据目的类型是有 符号还是无符号的,自动扩展他的符号位。 • 例如 char 类型的 -128 是 100000000 码力 | 128 页 | 2.95 MB | 1 年前3
whats new in visual studioChatterjee – _2 Address Sanitizer /fsanitize=address support in MSVC now generally-available • x86 and X64 support • Debug configurations (/MTd, /MDd) included • Runtime libraries automatically linked Debug Edit Find in Files 1.8x faster 1 2 0 5 10 15 20 25 30 35 40 45 50 47 27 Series1 Open C++ File 2.4x faster 1 2 0 0.5 1 1.5 2 2.5 2.02 0.82 Series1 IntelliSense Ready* 1.9x faster *) Colorization + IntelliSense Ready 18x faster Learn more at http://aka.ms/18xfaster Performance of Visual Studio Developer inner-loop Build Debug Edit Find in Files 1.8x faster Open C++ File 2.4x faster IntelliSense0 码力 | 42 页 | 19.02 MB | 6 月前3
共 50 条
- 1
- 2
- 3
- 4
- 5













