Performance Engineering: Being Friendly to Your Hardware
WORD PTR cs:[rax+rax*1+0x0] 12cd: 00 00 00 12d0: c4 a1 7c 10 04 16 vmovups ymm0,YMMWORD PTR [rsi+r10*1] 12d6: c4 a1 7c 11 04 17 vmovups YMMWORD PTR [rdi+r10*1],ymm0 12dc: _m128i*>(dst), head); dst += padding; src += padding; size -= padding; } __m128i c0, c1, c2, c3, c4, c5, c6, c7; while (size >= 128) { c0 = _mm_loadu_si128(reinterpret_cast(src) + 0); t_cast (src) + 2); c3 = _mm_loadu_si128(reinterpret_cast (src) + 3); c4 = _mm_loadu_si128(reinterpret_cast (src) + 4); c5 = _mm_loadu_si128(reinterpret_cast 0 码力 | 111 页 | 2.23 MB | 5 月前3Forwarding References
c2("abc"s, "def"s); // OK std::string txt = "abc"; MyClass c3(txt, txt); // OK MyClass c4("abc", "def"); // ERROR CppCon 2023 | Forwarding References Sinks: Constraining a forwarding c2("abc"s, "def"s); // OK std::string txt = "abc"; MyClass c3(txt, txt); // OK MyClass c4("abc", "def"); // OK CppCon 2023 | Forwarding References Sinks: Constraining a forwarding c2("abc"s, "def"s); // OK std::string txt = "abc"; MyClass c3(txt, txt); // OK MyClass c4("abc", "def"); // OK CppCon 2023 | Forwarding References Sinks: Constraining a forwarding0 码力 | 107 页 | 3.72 MB | 5 月前3Session Types in C++
enter(); while (true) { auto [c2, v1] = c1.recv(); auto [c3, v2] = c2.recv(); auto c4 = c3.send(v1 + v2); auto o1 = c4.offer(); if (o1.index() == 0) { c1 = take<0>(o1)0 码力 | 89 页 | 1.55 MB | 5 月前3Multi Producer, Multi Consumer, Lock Free, Atomic Queue
pop: 9377623 tsc: 2445890844 tsc/op: 260 push/pop per sec: 9377895 $ ./cbuild/q_bandwidth -W4 -p4 -c4 -d 2048 Q BW: data size: 4 index size: 4 capacity: 2048 producers: 4 consumers: 4 for: 1000ms mpmc_queue0 码力 | 54 页 | 886.12 KB | 5 月前3Back to Basics Concepts
requires IsPrimeclass C2 { ... }; C2<6> c3; // ERROR: concept IsPrime not satisfied C2<7> c4; // OK Constraints for Non-Type Template Parameters constexpr bool isPrime(int val) { for (int i 0 码力 | 23 页 | 2.14 MB | 5 月前3High-Performance Numerical Integration in the Age of C++26
= a − h ∗ da_dt(t, a); 14 t = t − h; 15 } Euler’s method yn+1 = yn + h × f (tn, yn) Gµν = 8πG c4 Tµν ⇒ H2 = � ˙a a �2 = 8πG 3 ρ − kc2 a2 ˙H + H2 = ¨a a = − 4πG 3 � ρ + 3P c2 � ⇒ H2 H2 00 码力 | 57 页 | 4.14 MB | 5 月前3Adventures in SIMD Thinking (Part 1 of 2)
a9 a10 a11 a12 a13 a14 a15 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b a c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 dn0 码力 | 88 页 | 824.07 KB | 5 月前3现代C++ 教程:高速上手C++11/14/17/20
原子操作与内存模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 原子操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 一致性模型 . . 实例被创建出现主要就是用于唤醒等 待线程从而避免死锁。std::condition_variable 的 notify_one() 用于唤醒一个线程;notify_all() 则是通知所有线程。下面是一个生产者和消费者模型的例子: #include#include #include #include #include std::mutex 的排他性,我们根本无法 期待多个消费者能真正意义上的并行消费队列的中生产的内容,我们仍需要粒度更细的手段。 67 7.5 原子操作与内存模型 第 7 章并行与并发 7.5 原子操作与内存模型 细心的读者可能会对前一小节中生产者消费者模型的例子可能存在编译器优化导致程序出错的情况 产生疑惑。例如,布尔值 notified 没有被 volatile 修饰,编译器可能对此变量存在优化,例如将其作 0 码力 | 83 页 | 2.42 MB | 1 年前3Hello 算法 1.1.0 C++ 版
我们按照说明书一步步操作,就能组装出精美的积木模型。 第 1 章 初识算法 hello‑algo.com 15 图 1‑5 拼装积木 两者的详细对应关系如表 1‑1 所示。 表 1‑1 将数据结构与算法类比为拼装积木 数据结构与算法 拼装积木 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 值得说明的是,数据结 一定的“动态性”。 Tip 如果你感觉物理结构理解起来有困难,建议先阅读下一章,然后再回顾本节内容。 3.2 基本数据类型 当谈及计算机中的数据时,我们会想到文本、图片、视频、语音、3D 模型等各种形式。尽管这些数据的组织 形式各异,但它们都由各种基本数据类型构成。 基本数据类型是 CPU 可以直接进行运算的类型,在算法中直接被使用,主要包括以下几种。 ‧ 整数类型 byte、short、int、long 是双精度 64 位;没 有 char 类型,单个字符实际上是长度为 1 的字符串 str 。 ‧ C 和 C++ 未明确规定基本数据类型的大小,而因实现和平台各异。表 3‑1 遵循 LP64 数据模型,其用于 包括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字0 码力 | 379 页 | 18.47 MB | 1 年前3Hello 算法 1.0.0b5 C++版
我们按照说明书一步步操作,就能组装出精美的积木模型。 第 1 章 初识算法 hello‑algo.com 14 图 1‑5 拼装积木 两者的详细对应关系如表 1‑1 所示。 表 1‑1 将数据结构与算法类比为积木 数据结构与算法 拼装积木 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 值得说明的是,数据结构 对其长度进行调整。 � 如果你感觉物理结构理解起来有困难,建议先阅读下一章“数组与链表”,然后再回顾本节内 容。 3.2 基本数据类型 谈及计算机中的数据,我们会想到文本、图片、视频、语音、3D 模型等各种形式。尽管这些数据的组织形式 各异,但它们都由各种基本数据类型构成。 基本数据类型是 CPU 可以直接进行运算的类型,在算法中直接被使用,主要包括以下几种类型。 ‧ 整数类型 byte、short、int、long bool 1 byte false true false 对于表 3‑1 ,需要注意以下几点。 ‧ C 和 C++ 未明确规定基本数据类型大小,而因实现和平台各异。表 3‑1 遵循 LP64 数据模型,其用于包 括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字0 码力 | 377 页 | 30.69 MB | 1 年前3
共 20 条
- 1
- 2