<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:ns0="http://www.w3.org/2005/Atom" version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Caturra的中文转录小站</title><link>https://uni.bluepuni.com</link><description>一些演讲的中文转录稿</description><language>zh-CN</language><lastBuildDate>Sat, 27 Jun 2026 03:42:16 +0000</lastBuildDate><ns0:link href="https://uni.bluepuni.com/rss.xml" rel="self" type="application/rss+xml" /><item><title>为什么 STM 不只是研究玩具</title><link>https://uni.bluepuni.com/archives/why-stm-can-be-more-than-a-research-toy/</link><guid>https://uni.bluepuni.com/archives/why-stm-can-be-more-than-a-research-toy/</guid><description>## 摘要 (Abstract) 软件事务内存 (Software Transactional Memory, STM) 承诺在无需特定硬件支持的情况下简化并发编程。然而，STM 的可信度取决于它在多大程度上能够利用多核技术来超越顺序代码的性能。最近的一篇 CACM 论文 [8] 质疑了 STM 提供良好性能的能力，并建议将其局限为一个“研究玩具”（research toy）。 本文通过迄今为止最广泛的 STM 与顺序代码的性能对比，重新审视了这些结论。我们在广泛的基准测试和两种不同的多核系统上，评估了最先进的 STM 系统 SwissTM。我们剖析了同步的固有成本，以及编译器插桩（compiler instrumentation）和透明私有化（transparent privatization）带来的开销。</description></item><item><title>为什么 STM 只能是研究玩具</title><link>https://uni.bluepuni.com/archives/software-transactional-memory-why-is-it-only-a-research-toy/</link><guid>https://uni.bluepuni.com/archives/software-transactional-memory-why-is-it-only-a-research-toy/</guid><description>**STM带来的开销很可能会掩盖它的前景。** TM（事务内存）1 是一种并发控制范式，它为代码区域提供原子性和隔离性的执行。TM被许多研究人员认为是解决多核处理器编程问题最有希望的方案之一。它最吸引人的特点是，大多数程序员只需要局部推理共享数据访问，标记要以事务方式执行的代码区域，然后让底层系统确保正确的并发执行。这种模型有望提供细粒度锁的扩展性，同时避免锁组合的常见陷阱（如死锁）。在本文中，我们探讨了一个高度优化的STM的性能，并观察到在低并行度下TM的整体性能明显较差，这可能会限制这种编程范式的采用。 事务内存系统的不同实现会在影响性能和可编程性的设计上做出权衡。Larus和Rajwar 2 概述了事务内存系统实现的设计权衡。以下是一些设计选择：</description></item><item><title>发现面向用户的概念</title><link>https://uni.bluepuni.com/archives/discovering-a-user-facing-concept/</link><guid>https://uni.bluepuni.com/archives/discovering-a-user-facing-concept/</guid><description>## 简介与背景 大家好，我是 Christopher Di Bella，欢迎收看《发现面向用户的概念》（Discovering a User-Facing Concept）。 几年以来，我一直对使用和编写 C++ 概念（Concepts）非常感兴趣。大概是在 2016 年左右，我开始对它们产生浓厚的兴趣。曾有一段时间，我以为自己已经理解了应该如何编写概念。直到 2018 年，Eric Niebler 在推特上发了这样一段话，彻底颠覆了我对编写概念的思考方式。他说：**“虽然概念是对类型的约束，但你不能通过观察系统中的类型来找到它们；你需要通过研究算法来发现它们。”**</description></item><item><title>API 设计的艺术</title><link>https://uni.bluepuni.com/archives/the-art-of-api-design/</link><guid>https://uni.bluepuni.com/archives/the-art-of-api-design/</guid><description>大家好，欢迎收听我的演讲：**理解 API 设计的艺术（The Art of API Design）**。 首先，我是谁？我是 Chris。这些年来，我曾有幸构建过非常多的代码库。在与年轻工程师共事的过程中，我发现他们在成长之路上似乎经常犯一些相同的错误。因此，我想把这次演讲当作一次经验的累积分享，给大家一个领先的起点，让大家知道在设计时应该注意些什么。 因为情况往往是这样的：人们在大学里学习编程，学习整洁代码（clean coding）和代码审查；但是，当他们第一次被委以重任去进行架构设计和 API 设计时，他们的初次尝试往往并不顺利。接着大家就会觉得：“哦，这个人不能被信任去设计 API”，所以每当发生这种情况时，其他人就会接手。这就剥夺了他们通过经验进行学习的机会。</description></item><item><title>有符号整数有害论</title><link>https://uni.bluepuni.com/archives/signed-integers-considered-harmful/</link><guid>https://uni.bluepuni.com/archives/signed-integers-considered-harmful/</guid><description>## 开场白与背景 我的名字是 Robert Secord。如果你们中有人昨天参加了奥斯陆 C++ 用户组的活动，你会发现这场演讲与昨天有很多重叠。我今天将仅仅聚焦于昨天演讲的下半部分，也就是有符号（signed）与无符号（unsigned）整数的对比，并提供更多的细节。我今天没有准备很多幻灯片——我通常都会准备很多——这意味着演讲时间应该刚好够，而且在此过程中我也可以随时回答问题。我的行程安排得很紧，外面已经有一辆车在等我，要马上送我去火车站，然后我要赶去机场飞回葡萄牙。等我在这里的工作结束，我的假期还有三天。 所以，演讲结束后我就得马上跑路，大家有什么问题请在演讲期间提出来。如果你在演讲结束后挡在我通往大门的路上，要知道我体重将近 300 磅，撞上去大概会很疼的。那么让我们开始吧。</description></item><item><title>深入 Skylake 微架构</title><link>https://uni.bluepuni.com/archives/advanced-skylake-deep-dive/</link><guid>https://uni.bluepuni.com/archives/advanced-skylake-deep-dive/</guid><description>大家好，欢迎来到本次技术演讲（Tech Talk），非常高兴大家都能出席。今天由我来向大家介绍 Matt Godbolt。Matt Godbolt 是一位 C++ 开发者，他热衷于探究编译器、操作系统和芯片的底层原理。白天，他和我们在座的许多人一样，为金融行业编写软件；到了晚上，他会开发复古计算机的模拟器，并维护 Compiler Explorer。Compiler Explorer 是它的官方名称，但大家都管它叫 Godbolt。所以理所当然地，当有人在 Jane Street 内部建立这个工具的实例时，他们将其命名为 Godbolt，这也使得 Matt 成为我们这里第一位已经拥有以他名字命名的内部域名的外部演讲者。请大家和我一起欢迎 Matt Godbolt。 谢谢你，Jasper。非常感谢邀请我来这里，这太棒了。 我很期待和大家聊聊我喜欢深究的这些东西。所以这次演讲的主题是“微架构：底层究竟发生了什么（Microarchitecture, What Happens Beneath）”，这可能不是我起过的最好的标题。是的，正如 Jasper 所说，你们之前听说过我，可能主要是因为 ...</description></item><item><title>互斥锁真的慢吗</title><link>https://uni.bluepuni.com/archives/are-mutexes-slow/</link><guid>https://uni.bluepuni.com/archives/are-mutexes-slow/</guid><description>## 引言：互斥锁（Mutex）真的很慢吗？ 谢谢大家。大家好，我是 Jon。就像刚刚介绍里用几句优美的话描述的那样，这就是我。我今天来这里是为了深入探讨一些相当极客、底层的内容，希望你们都会喜欢。这次演讲并不是专门针对 Rust 的，尽管我做的很多工作都和 Rust 有关。但碰巧的是，关心 Rust 的人往往也非常关心并发、并行、速度、数据系统和算法等问题。我有一种感觉，在座的各位即使不是因为 Rust 编程语言，也同样关心这些类似的问题。我希望这次演讲的内容能有更广泛的适用性。 你们会在几张幻灯片上看到一点点 Rust 代码，但我相信你们能够认出它们，并在脑海中将其映射为你偏好的任何语言。这次演讲的标题是《互斥锁（Mutexes）很慢吗？》。有一个被称为“顾德里奇新闻标题定律”（注：应为贝特里奇标题定律）的说法指出：任何这类以问号结尾的标题，你都可以用“不”来回答。毫不意外，这个问题的答案也是“不”——但这背后的原因却非常有趣。</description></item><item><title>《学问猫说历史》文字版</title><link>https://uni.bluepuni.com/archives/xue-wen-mao/</link><guid>https://uni.bluepuni.com/archives/xue-wen-mao/</guid><description>## 第一集：造人的故事 **学问猫**：大家好，新的学期开始了。前面我们学过了汉字，现在我来给你们说一说历史。一提起历史，你们是不是感到很神秘、很枯燥，离自己很远，和我们没有多大的关系呢？其实，我们的今天就是明天的历史。而我要和你们说的历史，也就是从前发生在我们这个世界上的一些很重要的事。过去的事情知道得多了，我们也就能够从里面找出规律来，避免犯过去的人已经犯过的错误。如果你们不想这么麻烦，那么你也可以不在上面下功夫，也不一定非要知道得比别人多不可。但是，别人都知道的历史常识，你最好也要知道。 好了，我们现在开始正式上课。</description></item><item><title>这 POSIX 吗？探究不同操作系统和库的网络实现</title><link>https://uni.bluepuni.com/archives/wait-is-it-posix-investigating-different-os-and-library-implementations-for-networking/</link><guid>https://uni.bluepuni.com/archives/wait-is-it-posix-investigating-different-os-and-library-implementations-for-networking/</guid><description>大家好，我是 Katherine Rocha，我们将探讨 POSIX 网络以及不同操作系统及其实现方式。 先简单介绍一下我自己。我是 Catalyst Space 的一名软件工程师，我们有一套名为 Ether 的定制飞行软件解决方案，主要使用 C++ 编写，但也包含一些 Python。另外，大家可以了解一下，我的一些爱好包括系谱学（genealogy），实际上这也是我在大多数演讲中都会提到的内容，因为我认为回顾过去以在未来做出更好的决定，以及理解我们对未来的影响，是我们能做的最重要的事情之一。 简单介绍一下我就职的公司，这样大家就能理解我为什么关注这些内容。Catalyst 致力于制造能够进行动态太空操作的卫星。这意味着你的航天器可以不断升级，我们可以将其移动到不同的轨道，从而延长目前已经在太空中的航天器的寿命。我们主要致力于三个领域，而我倾向于更多地关注升级平台和寿命延长方面。这是我们正在研制的最大的一款航天器，它相当大，但我们也致力于一款较小的航天器，更多是用于概念验证以及做一些其他的事情。这就是那个非常简单的模型，我们在上面运行 Ether 软件。随之而来的是很多能力。相比典型的...</description></item><item><title>即将到来的低延迟、并发与并行特性</title><link>https://uni.bluepuni.com/archives/interesting-upcoming-low-latency-concurrency-and-parallelism-features/</link><guid>https://uni.bluepuni.com/archives/interesting-upcoming-low-latency-concurrency-and-parallelism-features/</guid><description>好的，我想时间到了。欢迎来到这个关于“有趣的即将到来的低延迟、并发与并行特性”的专场，特别是过去三次 C++ 标准会议中讨论的内容。我们三个人自从在 IBM 共事以来，一直非常紧密地在低延迟、并发和并行领域合作，这种合作一直延续至今。我叫 Michael Wong，将和我的同事 Paul McKenney 以及 Maged Michael 一起探讨这三个主题。 我们之所以挑选这些特性，是因为它们非常有趣。其中一些很有可能在未来进入标准，而且它们的体量刚好适合放在一次演讲中介绍。所以我将讨论 SIMD。Maged 将讨论并发队列（Concurrent Queues），然后 Paul 会上台讨论“生命周期结束指针失效（Lifetime End Pointer Zap）”。 需要说明的是，第一个特性（SIMD）已经在 C++26 中了，目前正在进行投票。第二个特性，并发队列，在停滞了许多年之后取得了长足的进步，也许它会在未来的某个时间进入标准。我们认为并发队列还有很大的发展空间，因为并发队列可能会变得非常混乱——你知道，有许多不同的种类，我们欢迎任何人提出改进建议，甚至分享他们自己的并发队列...</description></item><item><title>std::expected+单子，能提高性能吗</title><link>https://uni.bluepuni.com/archives/can-std-expected-with-monadic-operations-really-boost-your-cpp-code-performance/</link><guid>https://uni.bluepuni.com/archives/can-std-expected-with-monadic-operations-really-boost-your-cpp-code-performance/</guid><description>好了，麦克风工作正常吗？好的。我们可以开始了。如果想看清幻灯片或者看清我，大家可以坐近一点。谢谢大家今天来参加我的演讲。 让我们来聊聊 `std::expected` 的性能以及这种抽象的单子操作（monadic operations）。首先让我自我介绍一下。我叫 Vitaly，在 Remarkable 工作。Remarkable 是一家挪威公司，我们正在制作这种极其出色的电子笔记板（Notapods）。在屏幕上，你们可以看到我们几周前刚发布的最新型号。非常棒的产品，大家可以去看看。在这家公司，我在 App Foundation 团队担任首席软件工程师。我们团队为其他团队提供库和框架，但不直接参与面向用户的功能开发。 关于今天的内容，最开始我打算只谈 `expected` 以及 `expected` 的单子操作性能。但当我开始准备时，我意识到如果这太抽象，仅仅挂在文档上，并没有太大意义。这就是为什么我们不仅要研究 `expected` 的单子操作，还要将其与它最接近的竞争对手进行比较。请耐心听我说，我会告诉你原因。</description></item><item><title>整洁的代码，糟糕的性能</title><link>https://uni.bluepuni.com/archives/clean-code-horrible-performance/</link><guid>https://uni.bluepuni.com/archives/clean-code-horrible-performance/</guid><description>**Marko / 主持人 (Dennis):** Marko，我们要不要直接开始？简单介绍一下这个话题的背景。我知道在座的很多人和我们一样都是开发者，所以他们可能非常渴望开始这个讨论。你知道，甚至我还记得当我刚入行时，我读过那些书，我是读着那些书长大的。好吧，也许随着我职业生涯的某种发展，我发现有些事情绝对不像书里写的那么简单。但是，是的，让我们开始吧。Marko？ **Marko:** 当然。我本来想让 Casey 来做概述，但我也可以试着讲讲。在那段视频中，主要的论点是：很多架构书籍中常见的建议并不一定有助于编写高性能的代码。Casey 举了几个例子，比如将经典的类层级结构（Class Hierarchy）转换为使用 switch 语句，以及其他一些优化措施。这些优化让代码运行速度——我不记得确切的数字了——但可以说是快了几个数量级。 显然，互联网上的很多人对此持不同意见，并争辩说，当初开发这些方法的理由基本上是为了提高开发人员的生产力，而不是为了优化机器周期。我想，这就是很多人产生分歧的地方，或者说大家对于什么更重要有不同的看法。我不确定这里能不能发链接，但 Casey 和 B...</description></item><item><title>MDSPAN：一次横跨 C++、Kokkos 与 SYCL 的深度解析</title><link>https://uni.bluepuni.com/archives/mdspan-a-deep-dive-spanning-cpp-kokkos-and-sycl/</link><guid>https://uni.bluepuni.com/archives/mdspan-a-deep-dive-spanning-cpp-kokkos-and-sycl/</guid><description>**我是 Nevin Lieber。** 我在美国芝加哥地区的阿贡国家实验室（Argonne National Laboratory）工作。我主要负责 C++ 标准委员会的工作，以及 SYCL 和 Kokkos 项目。我在我们的新超级计算机 Aurora 上工作。在委员会中，我是库演进孵化器（Library Evolution Incubator）的副主席，也是美国代表团的副主席。我同时担任行政主席，也是 Khronos SYCL 委员会的成员。基本上，我就是不断自愿承担更多的工作。然后你们把这些头衔放到了网站上。 那么，**MDSPAN 是什么？** 它是 C++23 中的一种非拥有性（non-owning）多维数组视图。我们将其加入的原因是，我们将其视为一种词汇类型（vocabulary type），既可以在不同领域间通用，也是你希望在接口中使用的东西，就像 `string_view` 和 `span` 一样。你需要这些东西。 它的样子如下。它有四个模板参数，一堆构造函数和一种索引方式。还有其他一些成员，但并不多。元素类型（Element types）很明显，比如 `mdspan`...</description></item><item><title>文本（渲染）的艺术</title><link>https://uni.bluepuni.com/archives/the-art-of-text-rendering/</link><guid>https://uni.bluepuni.com/archives/the-art-of-text-rendering/</guid><description>谢谢大家，早上好。是的，今天的讲座题目是关于文本渲染的艺术，我应该特别说明是**实时渲染（real-time rendering）**，因为当然，如果你想做文本渲染，你大可以使用 LaTeX。但是当你尝试做实时渲染时，情况就有点不同了。 正如刚才介绍的，我主要是一名神经科学研究员，但我需要开发一些软件来对数据进行实时可视化。当时我想，“好吧，没问题，我只需要把字母一个接一个地放好，问题就解决了。” 然后我接触到了**排版（typography）**，我才发现这比简单地把字形（glyph）并在起要困难得多。实际上，如果你想要正确的文本渲染，你需要执行很多规则。这是一件非常痛苦的事情，但你是可以做到的。如果你不知道这些规则，屏幕上就会显示出一堆垃圾。 这就引出了一些例子。这个例子来自一个叫“Not Arabic（不是阿拉伯语）”的博客。如果你懂阿拉伯语，你会发现这根本不是阿拉伯语，因为它没有对字形进行塑形（shape）。这意味着这对阅读阿拉伯语的人来说只是一堆乱码。当然，在电子游戏中，他们只是把一些阿拉伯语字形放上去，然后说，“行了，这样就行了。” 但其实不行，这是一个问题。</description></item><item><title>驯服 Filter View</title><link>https://uni.bluepuni.com/archives/taming-the-filter-view-in-cpp-programming/</link><guid>https://uni.bluepuni.com/archives/taming-the-filter-view-in-cpp-programming/</guid><description>我喜欢来这里。生活很大程度上在于找到你的同类（finding your people）。我花了很多时间试图弄清楚我的同类在哪里，而他们就在这里。 我是 Nico Josuttis，我们得谈谈。我们必须谈谈 C++ 的 `filter view`（过滤视图）。本次演讲的题目是“驯服 C++ Filter View”，这当然暗示了一个信息：这里面有问题，或者说有惊喜。你可能会说，这很符合 C++ 的传统。 首先，了解这些惊喜是什么以及我们在哪里需要小心是很有趣的。当然，另一个问题是“为什么会这样”。</description></item><item><title>在 C++26 时代选择合适的容器</title><link>https://uni.bluepuni.com/archives/how-to-choose-the-right-container-in-cpp26-and-beyond/</link><guid>https://uni.bluepuni.com/archives/how-to-choose-the-right-container-in-cpp26-and-beyond/</guid><description>所以，我们今天要讨论如何在 C++26 中选择正确的容器。但我的幻灯片空间快不够了。喂？啊，好的。我可能会停下来回答几个问题，但我有很多内容要讲。最后肯定会留出更多时间。如果我们没时间回答你的问题，直接来找我就行。我今天一整天都在。 我们要谈论 C++。如果我说“当前的 C++”，我指的是 C++23。我知道，很遗憾，不是每个人都用上了 23，但它是最新的标准。如果我谈论“即将到来的 C++”，那将是 C++26，因为我们基本上可以确定这些内容会进入 26。具体来说，我们要讨论的是标准库容器。 我编程很长时间了，使用 C++ 有 35 年，在 C++ 委员会待了 20 年。但为什么？为什么要谈论容器？我的意思是，每个人都知道容器，每个人都使用容器。它们被讨论过，被写成文章过。为什么它们至今仍有趣？</description></item><item><title>过度设计 max(a, b)</title><link>https://uni.bluepuni.com/archives/overengineering-max-a-b/</link><guid>https://uni.bluepuni.com/archives/overengineering-max-a-b/</guid><description>### **1. 开场白：一个“不实用”的演讲** 我非常兴奋能做这次演讲。它关于我大约两年前实现的一个东西。我提交这个演讲主题本来是为了 C++ Now 2025，但去年 C++ Now 接受了我另一个更无聊、但实际上能教给人们一些有用东西的演讲，这让我很失望。但幸运的是，我又有机会再次展示它。我记得当我实现其中一些部分时，我曾怀疑自己是否做得太过火了。我的老板却说：“不，不，继续做。即使失败了，它也能成为一个很棒的 C++ Now 演讲。”所以，我真的很兴奋。 我也很喜欢这次演讲被安排在与 Brad 的“实用 CMake”演讲并行进行，因为我讲的这些东西，没有一样是实用的。</description></item><item><title>johnysswlab 作者谈自动向量化</title><link>https://uni.bluepuni.com/archives/making-a-program-faster-multithreading-and-automatic-compiler-vectorization/</link><guid>https://uni.bluepuni.com/archives/making-a-program-faster-multithreading-and-automatic-compiler-vectorization/</guid><description>欢迎大家。这次演讲是关于多线程和自动编译器的，所以我们在这里会重点关注性能。我是一名性能工程师，这也是我工作的一部分。所以这次演讲非常注重实践。这不是一个新的演讲，虽然这里是 C++ Now，很多人都期待着最新的东西。但在性能方面，你通常会坚持使用那些经过考验的老方法，尤其是 C++ 新标准在性能方面并没有太多发展。 所以，这次演讲分为两个部分。第一部分是关于多线程的，我会讲到 OpenMP 和 OpenMP 编程接口（API）。第二部分是关于单线程优化。 **（跳过了不需要的第一个演讲。）**</description></item><item><title>为什么 29% 的 x86 都是我的错</title><link>https://uni.bluepuni.com/archives/why-29-percent-of-x86-is-my-fault/</link><guid>https://uni.bluepuni.com/archives/why-29-percent-of-x86-is-my-fault/</guid><description>好的，大家好。我是 Tom Forsyth。我一生中扮演过很多角色。我当过游戏程序员、图形程序员、指令集设计师，还在 Oculus 做了大量的 VR 工作。实际上，我刚刚意识到，我参与的第一款游戏发布至今已经 20 年了。所以，这挺酷的。 我突然意识到，哦，是的，1999 年是 20 年前了。天哪，我老了。不管怎样，这是我关于指令集生命周期的演讲，因为我非常幸运地参与了一件事物的开端，它最终演变成了 AVX-512，也就是所有最新英特尔 CPU 中那个花哨的新指令集。机缘巧合的是，我现在又回到了英特尔做这个演讲，尽管我中途去了 Oculus 搞了一阵子 VR。 这次演讲的副标题是“为什么 29% 的 x86 都是我的错”。我知道你们都热爱 x86，我很抱歉。这个统计数据有点可疑。我只是翻了翻指令手册，数了数有多少指令是以 V 开头的，我想那应该就是我的错。当然，这不只是我一个人的功劳。在英特尔，有成百上千的人参与了指令集的设计。而我说的“错”（fault），指的是如果 CR4.OSFXSR 没有被正确设置时会发生的 UD fault（无效指令异常）。这是个 CPU 领域的笑话。抱歉。</description></item><item><title>正确使用弱序 C++ 原子操作</title><link>https://uni.bluepuni.com/archives/using-weakly-ordered-c-plus-plus-atomics-correctly/</link><guid>https://uni.bluepuni.com/archives/using-weakly-ordered-c-plus-plus-atomics-correctly/</guid><description>大家好，我叫 Hans Boehm。我在 Google 的 Android 部门工作。 我将要讨论如何正确使用 C++ 中的原子操作（atomics），特别是弱顺序原子操作（weakly ordered atomics），这是一个充满问题的话题。本次演讲旨在稍微减少一些对它们的滥用。 ### 我们为什么关心原子操作？</description></item><item><title>理解 POWER 多处理器</title><link>https://uni.bluepuni.com/archives/understanding-power-multiprocessors/</link><guid>https://uni.bluepuni.com/archives/understanding-power-multiprocessors/</guid><description>#### 摘要 要利用当今的多处理器，就需要高性能且正确的并发系统代码（例如优化编译器、语言运行时、操作系统内核等），而这反过来又要求对可依赖的、可观察的处理器行为有很好的理解。然而，不幸的是，对于几种当前的多处理器而言，这个关键的硬件/软件接口并不清晰。 在本文中，我们描述了 IBM POWER 多处理器的行为特征，它们具有一种微妙且高度宽松的内存模型（ARM 多处理器在这方面有非常相似的架构）。我们对几代处理器进行了广泛的实验：POWER G5、5、6 和 7。基于这些实验、已发布的微架构细节以及与 IBM 员工的讨论，我们给出了一个抽象机语义，该语义从大部分实现细节中抽象出来，但能解释一系列微妙示例的行为。我们的语义用散文解释，但在严格的、可由机器处理的数学中定义；我们还通过一个可执行的检查器确认，它为我们的示例捕获了可观察的处理器行为或架构意图。虽然未经供应商官方认可，但我们相信该模型为推理当前的 POWER 多处理器提供了一个合理的基础。</description></item><item><title>数据中心：CPU 设计的现代挑战</title><link>https://uni.bluepuni.com/archives/data-center-computers-modern-challenges-in-cpu-design/</link><guid>https://uni.bluepuni.com/archives/data-center-computers-modern-challenges-in-cpu-design/</guid><description>能来到这里参加杰出校友系列讲座，我感到非常荣幸。校友办公室声称，从你踏入校园的第一天起，你就是校友了。 我父亲今年 95 岁，患有阿尔茨海默病。他已经不记得北卡罗来纳州在哪里了，但他仍然保有那种幽默感。所以我告诉他，我受邀来做这个杰出校友讲座。他想都没想就对我 smirked（得意地笑）了一下，然后说：“所以，你是替谁来的？” 好了，这是一个工程技术讲座。尽管这里不是一个工程学院校区，但我还是戴上了我的工程师帽子。</description></item><item><title>现代程序调优的心智模型</title><link>https://uni.bluepuni.com/archives/mental-models-for-modern-program-tuning/</link><guid>https://uni.bluepuni.com/archives/mental-models-for-modern-program-tuning/</guid><description>大家好，我想向大家介绍来自英特尔的 Andy Kleen，他是一位资深的 Linux 内核黑客。他参与了 x86-64 的初始移植工作，并曾担任 x86-64 移植的维护者，他在内核领域做出了很多贡献。 好的，今天我想谈谈现代程序调优的心智模型，我需要补充一下，我主要讨论的是缓存性能。我将要谈论的一些事情，如果你有缓存调优的经验，可能已经知道了，但我也会加入一些新内容。同时，我还会讲如何校准它，也就是说，一旦你有了心智模型，如何根据现实情况——即实际发生的情况——来校准它。我还会介绍一些新技术。我应该补充一下，这些技术有些是英特尔特有的，主要是因为这是我的工作内容，但也许它们也对其他方面有用。 #### 程序性能的两种视角</description></item><item><title>实用的面向数据设计</title><link>https://uni.bluepuni.com/archives/practical-data-oriented-design/</link><guid>https://uni.bluepuni.com/archives/practical-data-oriented-design/</guid><description>谢谢。我是 Andrew Kelley，Zig 软件基金会的主席和首席软件开发者。感谢大家来听我的演讲。首先，我这个遥控器该指向哪里？我正在按“前进”按钮。没反应？没有。我们遇到了一些技术问题。哦，好了。我得用力长按一下。好了，成功了。 好吧，我想先简单介绍一下我的背景故事。我相信在座的很多人都会觉得很熟悉。我很小的时候就对游戏产生了兴趣。但我父母给我定了个规矩，我每天只能玩电脑、看电视或玩电子游戏一小时。不管是什么，就是一天一小时。时间一到，我就会被赶下线。所以，不用说，我变得非常会钻空子。 我玩的第一款游戏是世嘉创世纪（Sega Genesis）上的《刺猬索尼克2》。所以这款游戏在我心中总占有一个怀旧的位置。但我最喜欢的游戏是那些你可以自己创造东西的游戏。有人还记得《托尼霍克职业滑板2》（Tony Hawk&amp;#x27;s Pro Skater 2）吗？它里面有那个关卡编辑器，对吧？那玩意儿简直绝了。这个东西太酷了。你可以制作自己的关卡，可以设置起点，甚至可以自己制作、命名、计分那些“gap”（技巧挑战点）。然后你还可以和朋友们玩本地多人游戏，玩像 HORSE 和捉人游戏之类的。超级酷。</description></item><item><title>Arm 的弱序内存模型和屏障要求</title><link>https://uni.bluepuni.com/archives/arm-weakly-ordered-memory-model-and-barrier-requirements/</link><guid>https://uni.bluepuni.com/archives/arm-weakly-ordered-memory-model-and-barrier-requirements/</guid><description>好的，我们开始吧。大家好，感谢今天来听我的演讲。我将和大家探讨 ARM64 的弱顺序内存模型以及正确使用屏障（barrier）的必要性。我要讲的内容相当多，不确定在 30 分钟内能讲完多少。所以，我们看看能进行到哪里。如果有人愿意多留一会儿，我会留下来继续讲，直到讲完为止。我们拭目以待。 那么，我先搞清楚怎么用这个软件。我需要点击一下就可以，还是要按那个按钮？好的，可以了。 ### 那么，我是谁？</description></item><item><title>模板的奇妙之处：测试、调试和基准测试模板代码</title><link>https://uni.bluepuni.com/archives/template-shenanigans-testing-debugging-and-benchmarking-template-code/</link><guid>https://uni.bluepuni.com/archives/template-shenanigans-testing-debugging-and-benchmarking-template-code/</guid><description>好的，这篇演讲不会谈论钟琴（Glockenspiels），但会讨论模板代码。你们可能知道，我编程已经很长时间了，而且我一直对元编程很感兴趣。比如，我在大学里学过一点 Lisp 的元编程，然后我们接触了一些 C++ 和模板，之后我还在 Java 和 Ruby 中做过元编程。这是我喜欢做的事情，对我来说也是一种挑战。我读了很多相关的书，但所有这些书、所有这些演讲中，很少有——或者说几乎没有——会谈论你该如何去开发它。我的意思是，我不知道你们是否能看到这本书，这是一本很棒的《C++ Templates》。在 800 页的内容里，我记得只有 11 页是关于实际测试和调试模板代码的。这里还有另一本 Ivan Čukić 的书，也是一本很棒的书。同样，他可能也只有一页内容介绍了一种实现这个目的的技术。所以，这次演讲我们将讨论如何编译代码，我们将讨论如何测试、调试和进行基准测试。我们不会讨论具体的模板技巧之类的东西，那些内容你可以在很多其他人的演讲中找到。好的。哦，抱歉。 啊，是的。好的。我住在乡下，在这场疫情中我非常幸运，因为我有动物，我可以出门散步。对我来说，这里的生活和封锁前没有太大区别。所以...</description></item><item><title>更少的核心，更高的赫兹</title><link>https://uni.bluepuni.com/archives/fewer-cores-more-hertz/</link><guid>https://uni.bluepuni.com/archives/fewer-cores-more-hertz/</guid><description>### 摘要 在现代服务器 CPU 中，单个内核可以以不同的频率运行，这允许对性能/能耗的权衡进行细粒度控制。然而，调整频率会产生很高的延迟。我们发现这可能导致一种**频率倒置**问题，即 Linux 调度器将一个新激活的线程放置在一个空闲的内核上，而这个内核需要几十到几百毫秒才能达到高频率，而就在此之前，另一个已经在高频运行的内核变为空闲。 在本文中，我们首先通过一个案例研究，说明了在一台 80 核 Intel® Xeon 机器上编译 Linux 内核期间调度器行为中，重复出现的频率倒置所带来的显著性能开销。接下来，我们提出了两种策略来减少 Linux 调度器中发生频率倒置的可能性。当在 Intel® Xeon 上对 60 个不同的应用程序进行基准测试时，表现更好的策略 `$S_{move}$` 为 23 个应用程序带来了超过 5% 的性能提升（最高 56%，且无额外能耗开销），而仅有 3 个应用程序的性能下降超过 5%（最高 8%）。在一台 4 核 AMD Ryzen 机器上，我们获得了高达 56% 的性能提升。</description></item><item><title>高效解释器的结构与性能</title><link>https://uni.bluepuni.com/archives/the-structure-and-performance-of-efficient-interpreters/</link><guid>https://uni.bluepuni.com/archives/the-structure-and-performance-of-efficient-interpreters/</guid><description>#### 摘要 为高通用性能而设计的解释器通常会执行大量的间接分支（在我们测试的基准程序中占所有已执行指令的 3.2%-13%）。在我们模拟的多种配置中，这些分支消耗了超过一半的运行时间。我们评估了各种现有和提议的分支预测方案在多种解释器上的准确性，预测失误如何影响解释器的性能，以及两种不同的解释器实现技术在各种分支预测器下的表现。我们还提出了一些硬件设计者、C 编译器作者和解释器作者可以用来提高解释器性能的方法。 ---</description></item><item><title>C++ 大规模并行 Socket 处理算法</title><link>https://uni.bluepuni.com/archives/algorithm-for-massively-parallel-work-with-sockets-in-cpp/</link><guid>https://uni.bluepuni.com/archives/algorithm-for-massively-parallel-work-with-sockets-in-cpp/</guid><description>**主持人：** 今天，Vladislav Shpilevoy 将为大家介绍一个类似于 Boost.Asio 的东西，或者可以说是打了类固醇的 libuv。他会更侧重于算法本身，而不是具体实现，但其实现也是开源的，并且已经在实际的生产项目中使用。Vlad，请问这个演讲对于那些不打算编写自己的事件循环（event loop）——我已经忘了“loop”怎么翻译了——的人来说，会有用吗？ **Vladislav：** 绝对会有趣，至少我希望如此。首先，对于那些显然要去实现它的人。其次，对于那些仅仅好奇事件循环内部是如何工作的人，通过了解一些内部细节，你可能会学会如何更有效地使用它们——不一定是具体的 Boost.Asio，尽管我也会提到一些关于它的内容。第三，我希望这个演讲本身就足够有趣，即使对那些不打算写 event loop 或者已经对它们了如指掌的人也是如此。后面会有动画，请大家坚持看到最后。第四，即使你不打算写自己的 event loop，也许我的算法或实现中的某些想法会让你觉得有趣，可以借鉴到你自己的东西里，而这些东西甚至可能不是 event loop。也就是说，这次会议是关于 C...</description></item><item><title>多核场景下的 Linux 调度器现状和未来</title><link>https://uni.bluepuni.com/archives/current-status-and-future-of-linux-schedulers-in-multi-core-scenarios/</link><guid>https://uni.bluepuni.com/archives/current-status-and-future-of-linux-schedulers-in-multi-core-scenarios/</guid><description>大家下午好，感谢大家一直在这里听我们一起交流。我是陈渝，来自英特尔。我看到很多熟悉的面孔，感觉非常亲切。今天很高兴能跟大家分享我们之前在多核系统上做 Linux 内核的一些体会。 今天早些时候跟一些同学交流，提到操作系统这块可能要跟 AI 结合，确实是个难点。所以今天跟大家分享的，可能是一些具体的 Linux 内核问题，特别是调度器相关的问题。希望能够集思广益，或者说是抛砖引玉，看看大家有没有什么想法，来结合 AI 解决这些具体的问题。 首先，我先介绍一下背景。我们这个组是英特尔的软件组。每次有新的 CPU 即将发布或刚刚发布后，都会到我们组这边。我们会做一些 CPU 功能的适配，以及性能的调优。我们需要保证的是，新的 CPU 跑起来之后，软件和内核层面至少不能造成性能回退。在这个调优的过程中，我们就会经常发现一些问题：当 CPU 的核数越来越多的情况下，我们发现 Linux 内核里面有很多的性能瓶颈。</description></item><item><title>Linux调度器：十年的核心浪费</title><link>https://uni.bluepuni.com/archives/the-linux-scheduler-a-decade-of-wasted-cores/</link><guid>https://uni.bluepuni.com/archives/the-linux-scheduler-a-decade-of-wasted-cores/</guid><description>### 摘要 作为资源管理的核心部分，操作系统线程调度器必须维持以下简单的不变性原则：确保就绪的线程被调度到可用的CPU核心上。尽管这看起来很简单，但我们发现这个原则在Linux中经常被打破。核心可能会空闲数秒，而与此同时，就绪的线程却在运行队列（runqueues）中等待。在我们的实验中，这些性能错误导致了同步密集型科学应用出现多倍的性能下降，内核编译（kernel make）的延迟增加了13%，以及一个广泛使用的商业数据库的TPC-H吞吐量下降了14-23%。这项工作的主要贡献在于发现和分析这些错误，并提供修复方案。传统的测试技术和调试工具在确认或理解这类错误方面效果不佳，因为它们的症状通常难以捉摸。为了推动我们的调查，我们构建了新的工具，用于在线检查对不变性原则的违反情况并可视化调度活动。这些工具简单、易于跨内核版本移植，并且运行时开销可以忽略不计。我们相信，将这些工具纳入内核开发人员的工具箱，将有助于抑制这类错误的发生。 ### 1. 引言</description></item><item><title>调度器之战：ULE vs. CFS</title><link>https://uni.bluepuni.com/archives/the-battle-of-the-schedulers-freebsd-ule-vs-linux-cfs/</link><guid>https://uni.bluepuni.com/archives/the-battle-of-the-schedulers-freebsd-ule-vs-linux-cfs/</guid><description>### **摘要** 本文分析了两种广泛使用的开源调度器——ULE（FreeBSD 的默认调度器）和 CFS（Linux 的默认调度器）——在设计和实现上的选择对应用程序性能的影响。我们在其他条件完全相同的情况下对 ULE 和 CFS 进行了比较。我们已将 ULE 移植到 Linux，并用它来调度所有通常由 CFS 调度的线程。我们在运行 ULE 的修改版内核和运行 CFS 的标准 Linux 内核上，比较了一大套应用程序的性能。观察到的性能差异完全是调度决策的结果，并不反映 FreeBSD 和 Linux 之间其他子系统的差异。 研究表明没有绝对的赢家。在许多工作负载下，两个调度器的性能相似，但对于某些工作负载，存在显著甚至令人惊讶的差异。ULE 可能会导致饥饿，即使在执行具有相同线程的单个应用程序时也是如此，但这种饥饿现象实际上可能为某些工作负载带来更好的应用程序性能。CFS 更复杂的负载均衡机制能更快地对工作负载变化做出反应，但从长远来看，ULE 实现了更好的负载均衡。</description></item><item><title>缓存淘汰懂 FIFO 就行了</title><link>https://uni.bluepuni.com/archives/fifo-queues-are-all-you-need-for-cache-eviction/</link><guid>https://uni.bluepuni.com/archives/fifo-queues-are-all-you-need-for-cache-eviction/</guid><description>#### **摘要** 作为一种缓存淘汰算法，FIFO（先进先出）具有许多吸引人的特性，如简单、高速、可扩展和对闪存友好。然而，对FIFO最主要的批评是其效率低下（高未命中率）。 在本文中，我们展示了一种简单、可扩展、基于FIFO的算法，该算法使用三个静态队列（S3-FIFO）。通过对来自14个数据集的6594个缓存轨迹进行评估，我们表明S3-FIFO在所有轨迹上的未命中率都低于当前最先进的算法。此外，S3-FIFO的效率非常稳健——在14个数据集中，它在其中10个数据集上实现了最低的平均未命中率。FIFO队列使得S3-FIFO能够实现良好的可扩展性，在16个线程下，其吞吐量比优化的LRU（最近最少使用）高出6倍。</description></item><item><title>CacheLib 缓存引擎</title><link>https://uni.bluepuni.com/archives/the-cachelib-caching-engine/</link><guid>https://uni.bluepuni.com/archives/the-cachelib-caching-engine/</guid><description>## 摘要 Web服务在系统架构的几乎每一层都依赖于缓存。通常，每个缓存都由不同的团队独立实现和维护，并高度专用于其功能。例如，应用数据缓存与CDN缓存是独立的。然而，这种方法忽视了不同缓存系统共有的难题，大大增加了部署、维护和扩展每个缓存所需的总工作量。 本文提出了一种不同的缓存开发方法，已在Facebook成功应用，该方法从原本不相交的缓存系统中提取出一组共同的核心需求和功能。_CacheLib_是一个通用缓存引擎，基于Facebook一系列缓存用例的经验设计而成，它简化了缓存的开发和维护。CacheLib于2017年首次在Facebook部署，如今为超过70个服务提供支持，包括CDN、存储和应用数据缓存。</description></item><item><title>BWoS：基于块的工作窃取</title><link>https://uni.bluepuni.com/archives/bwos-block-based-work-stealing/</link><guid>https://uni.bluepuni.com/archives/bwos-block-based-work-stealing/</guid><description>### 摘要 工作窃取是一种广泛用于多核并行处理的调度技术。每个核心拥有一个任务队列，并通过从其他队列窃取任务来避免空闲。先前的工作主要关注于在核心之间平衡工作负载，而忽略了窃取行为是否可能对所有者的性能产生负面影响或阻碍同步优化。现实世界中用于并行处理的工业级运行时在很大程度上依赖于工作窃取队列来实现可扩展性，而这类队列可能成为其性能瓶颈。 我们提出了基于块的工作窃取（BWoS），这是一种新颖且实用的设计，它将每个核心的队列分割成多个块。窃取者（thieves）和所有者（owners）很少在同一个块上操作，从而极大地消除了干扰，并使得所有者与窃取者之间的同步可以进行激进的优化。此外，BWoS启用了一种新颖的概率性窃取策略，保证窃取者以更高的概率从更长的队列中窃取任务。在我们的评估中，当应用于Java G1GC时，使用BWoS在Renaissance宏基准测试中性能提升高达1.25倍；当应用于Go运行时，在JSON处理方面平均提速1.26倍；当应用于Rust Tokio运行时，Hyper HTTP服务器的最大吞吐量提高了1.12倍。在微基准测试中，它比现有SOTA（state-of-t...</description></item><item><title>使用 VFIO 对 NVMe 设备进行「传输层」测试</title><link>https://uni.bluepuni.com/archives/transport-level-testing-of-nvme-devices-using-vfio/</link><guid>https://uni.bluepuni.com/archives/transport-level-testing-of-nvme-devices-using-vfio/</guid><description>大家好，欢迎收听我关于使用 VFIO 对 NVMe 设备进行传输层测试的演讲。我叫 Klaus，是三星电子的一名软件工程师。我的日常工作主要围绕开源软件展开。我是 QEMU 模拟 NVMe 设备的联合维护者之一，同时也活跃在开源 NVMe 生态系统的其他各个领域。 今天我们将讨论 VFIO。为了理解我们将要使用的技术，我们需要先了解一些 NVMe 和 PCI Express 的底层知识。然后，我们会稍微谈谈 IOMMU 及其工作原理，以及 VFIO 内核框架。我们将利用这些知识，尝试在不到 30 分钟内编写一个驱动程序，这个驱动程序将能够向 NVMe 设备提交底层的命令。我们还将看到如何与控制器内存缓冲区（Controller Memory Buffer）进行交互，它也是一个基于 PCI Express 的设备。 #### NVMe 概览</description></item><item><title>我们如何为多核编程</title><link>https://uni.bluepuni.com/archives/how-we-program-multicores/</link><guid>https://uni.bluepuni.com/archives/how-we-program-multicores/</guid><description>多核时代来临时，很多程序员只是想，我有一台四核计算机，我可以把我的代码拿来，在这台机器上运行，它的速度就会快四倍。然后他们买了这些机器，却发现事实并非如此。 有个人叫 Alex Guinaris，他与比尔·盖茨共事多年，曾是美国在线（America Online）的首席科学官。他们当时正在构建一个大项目，当多核处理器出现时，他决定将他们所有的机器部件全部更新换代。于是他们购买了这些大规模的多核机器。我记得他说过，他们有些机器好像是 16 核的。他做了所有这些工作，把所有软件都部署到了这些 16 核机器上，并期望一切都能运行得快 16 倍。但结果并非如此。他非常失望。 于是他开始研究不同的技术和不同的语言，每个人都承诺使用不同的技术可以让事情变得更快。他尝试了所有这些东西，但没有一个起作用。然后他尝试了 Erlang，结果成功了。实际上，速度并没有快 16 倍。我们没花太多力气就让它跑得快了不少。所以他对此相当满意。</description></item><item><title>与专家 Daniel Lemire 探讨 SIMD、缓存和 CPU 内部</title><link>https://uni.bluepuni.com/archives/on-simd-cache-and-cpu-internals-with-the-expert-daniel-lemire/</link><guid>https://uni.bluepuni.com/archives/on-simd-cache-and-cpu-internals-with-the-expert-daniel-lemire/</guid><description>**Łukasz:** 大家好！我的名字是 Łukasz，这里是游戏工程播客。这次我邀请到了 Daniel Lemire，他是加拿大魁北克大学的计算机科学教授。他是 CPU 性能方面的世界级专家，也是无数开源库的作者，其中包括可能是性能最高的 JSON 解析库，名为 `simdjson`。我们谈论了 CPU 架构以及如何让你的程序快如闪电。希望你们喜欢！ 你能告诉我 CPU 在计算机里是做什么的吗？ **Daniel Lemire:** 好的，当然，我们可以花好几个小时来讨论 CPU 的作用。所以，也许回到过去会很有趣。我开始编程时，是在一台 TRSAT 上。它被称为彩色计算机，因为你可以在上面实现彩色显示。在那个时候，孩子们用汇编语言编程是很常见的。我们实际上，你知道，如果你和我这个年纪的人交谈，就会发现买一个汇编器然后开始用它编程是相当普遍的。</description></item><item><title>SIMD 增强的 libc 字符串函数实现</title><link>https://uni.bluepuni.com/archives/simd-enhanced-libc-string-functions-how-it-s-done/</link><guid>https://uni.bluepuni.com/archives/simd-enhanced-libc-string-functions-how-it-s-done/</guid><description>是的，大家好，欢迎来到我的演讲。我是 Robert Clausecker。大约两年前，我为 FreeBSD 基金会做了一个项目，使用汇编和 SIMD 技术优化了所有 libc 的字符串函数。在这次演讲中，我想向大家展示其中遇到的问题，以及可以期待什么样的性能提升。也许这些技术对于处理其他像字符串处理一样棘手的任务也会有用。 那么，我们用字符串做什么呢？在座有多少人写过 C 语言？可能大部分都写过吧？是的。所以你们都知道，如果使用 `string.h` 里的基本字符串函数，你可以复制字符串、获取字符串长度、查找字符、比较字符串、查找子字符串、按分隔符拆分字符串，你也可以把这整个东西当成一团燃烧的垃圾扔进垃圾桶。你可以对字符串做很多不同的事情，但它们基本上都归结为一些非常简单的原语。 在大多数情况下，你想要读取一个字符串，然后可能想把它写到别的地方。或者你可能想读取一个字符串，然后将每个字符与别的东西进行比较。还有一些特殊情况，比如查找子字符串，这非常复杂，有很多相关的研究。按分隔符拆分也是一个我们只会简要提及的案例，因为它需要一个特殊的集合匹配操作，这用 C 语言也是可以做到的。</description></item><item><title>超越顺序一致性</title><link>https://uni.bluepuni.com/archives/beyond-sequential-consistency-leveraging-atomics-for-fun-and-profit/</link><guid>https://uni.bluepuni.com/archives/beyond-sequential-consistency-leveraging-atomics-for-fun-and-profit/</guid><description>好的。太棒了。是的。我的名字是 Chris Fretz。这是我的演讲《超越顺序一致性——利用原子操作实现乐趣与性能提升》。我是 Bloomberg 团队的一员。我是 Bloomberg 的一名高级 C++ 工程师，在一个名为 Tickerplant 的组织工作。按惯例说一句，我们正在招聘。如果你喜欢你所看到的，可以来找我聊聊。好的。 对于这次演讲，我乐于在进行中回答问题。我之前排练时时间有点紧，所以可能会在某个时刻停止接受提问。我们看到时候的情况。好的。 那么，我们先从本次演讲的概览开始。这里的目标，显然是讨论 C++ 中可用的不同内存排序模型，以及这些模型的性能差异。我认为这一点，我希望这一点是这次演讲的独特之处。我看过，我知道 Alex 去年在这个会议上做过一个关于不同内存模型的非常棒的演讲。我见过几次类似主题的演讲。但我从未见过有人真正将这些模型应用到一个具体的数据结构上，然后实际去探讨它们能带来怎样的性能差异。我认为这是一个有趣的问题。因为，如果你要花费时间和精力、承担维护和开发成本去真正尝试使用松散原子操作（relaxed atomics），你最好对你到底能得到什么有所了解。...</description></item><item><title>PIN：用于体系结构研究的二进制插桩</title><link>https://uni.bluepuni.com/archives/binary-instrumentation-for-architectural-studies-pin/</link><guid>https://uni.bluepuni.com/archives/binary-instrumentation-for-architectural-studies-pin/</guid><description>在本次教程中，我们将了解什么是插桩（instrumentation）以及什么是动态二进制插桩（dynamic binary instrumentation）。然后，我们将看到 PIN 究竟是如何进行动态二进制插桩的，以及如何使用 PIN 进行体系结构研究。你们在做家庭作业时将会用到 PIN，所以请注意听，如果有任何问题，请随时打断我。 ### 什么是插桩？ 让我们从插桩开始。插桩是一种将额外代码插入到应用程序中，以观察、研究甚至改变其行为的技术。许多程序分析工具都使用插桩来进行性能剖析（performance profiling）、错误检测以及捕获和读取行为。</description></item><item><title>RPCS3：为什么 PS3 模拟这么快</title><link>https://uni.bluepuni.com/archives/why-is-ps3-emulation-so-fast-rpcs3-optimizations-explained/</link><guid>https://uni.bluepuni.com/archives/why-is-ps3-emulation-so-fast-rpcs3-optimizations-explained/</guid><description>我为 PlayStation 3 版本的《尼尔》（Nier）创建了一个补丁，使其能以任意帧率运行。在制作这个补丁的过程中，我发现游戏代码中存在一个奇怪的模式。游戏喜欢先将一个向量寄存器清零，然后再将这个清零的寄存器转换为浮点数。但问题是，与所有其他数字不同，二进制中“零”的表示方式对于浮点数和整数来说是完全相同的。换句话说，这里的第二条指令基本上什么也没做。这个模式在《尼尔》的代码中出现了 2434 次。 幸运的是，当我们将 PlayStation 3 的 PowerPC 代码转换到 x86 平台时，我们能够优化掉这个浮点转换。但我无法向你展示 RPCS3 中优化此模式的代码，因为 RPCS3 并没有直接优化这个模式。我们并不是将 PowerPC 代码直接翻译成 x86，而是将其翻译成一种叫做 LLVM-IR 的中间语言。开源的 LLVM 项目懂得如何接收 LLVM-IR 并为许多不同的计算机架构输出代码。由于 LLVM 项目收到了大量的贡献，像“对常量值进行浮点转换”这类简单的优化就不再需要 RPCS3 团队重新实现了。 这就是为什么当你在 RPCS3 中首次启动游戏时，在“编译 P...</description></item><item><title>纯粹的 Folly</title><link>https://uni.bluepuni.com/archives/sheer-folly/</link><guid>https://uni.bluepuni.com/archives/sheer-folly/</guid><description>欢迎来到今天最艰难的一场演讲。早上的演讲比较容易，你喝了咖啡，精神百倍。午饭过后，食物正在转化为热量，被分解吸收，诸如此类的好事正在发生。这是一场很棒的午后讨论。然后，就到了我这场演讲，它将与你身体因消化而产生的睡意作斗争。 这场演讲的标题到最后才会变得显而易见。所以，标题是“纯粹的 `folly`”。请注意，`folly`（愚蠢之事）这个词用的是代码字体。 我想在这场演讲中讨论的问题是：我们为什么还在乎 C++？随着这么多其他语言的出现，我们为什么还在乎 C++？更广泛地说，我们为什么还在乎系统级语言？我们为什么依然在乎？</description></item><item><title>Facebook 标准字符串的奇特细节</title><link>https://uni.bluepuni.com/archives/the-strange-details-of-std-string-at-facebook/</link><guid>https://uni.bluepuni.com/archives/the-strange-details-of-std-string-at-facebook/</guid><description>大家好，欢迎来到“Facebook 标准字符串的奇特细节”分享会。现在，你可能会问，尼古拉斯，标准字符串（`std::string`）到底能有什么奇特的呢？如果四年前你问我这个问题，我可能答不上来。但是现在，现在我有一些答案了。这些答案能解答诸如：字符串是如何实现的？为什么 GCC 在大多数程序中都有一个 25 字节的 `null` 数组？以及当你试图让字符串变得更快时，会出什么问题？ 但问题是，这些问题本身并不是我今天站在这里的原因。当然，我今天就是要来回答这些问题。但这并不是这次演讲存在的理由。这次演讲之所以存在，是因为我缺少一些问题的答案。具体来说，我最想得到答案的那个问题是：在 Facebook，哪种字符串是最高效的字符串？对你而言，哪种字符串是最高效的？我没有那个答案。 不过，我确实知道几件事。第一件也是最重要的一件事是：字符串很重要。如果你去看 Facebook 的代码，你会发现代码里到处都是字符串。我上 GitHub 克隆了一大堆热门的 C++ 项目，发现它们也同样到处都在用字符串。`Hello World` 是一个很奇怪的程序，因为它 `include` 了 `iost...</description></item><item><title>在持久内存的世界探索</title><link>https://uni.bluepuni.com/archives/a-journey-into-the-world-of-persistent-memory/</link><guid>https://uni.bluepuni.com/archives/a-journey-into-the-world-of-persistent-memory/</guid><description>### 什么是持久内存？ 我很高兴能在这里向大家介绍什么是持久内存。正如Pierre所说，我是法国INRIA的一名高级研究员。你们可以听出我浓重的口音，我是法国人。我不是一个理论家，我是一个系统（system）领域的从业者。这意味着我感兴趣的不是计算机系统背后的理论，而是我们如何能让应用程序更高效。所以，在这次演讲中，我的重点将是性能，以及我们如何高效地使用持久内存。 那么，什么是持久内存？它其实就是易失性内存（volatile memory，也就是传统内存）和持久性存储（persistent storage）之间的一场美妙联姻。这具体意味着什么呢？它意味着你拥有内存的属性。你拥有字节可寻址性（byte addressability），这意味着处理器可以通过简单的加载（load）和存储（store）指令来访问持久内存。与易失性内存的主要区别在于，当你关闭计算机时，你的数据仍然会保留在持久内存中。所以，它的行为就像一个持久性存储设备。它非常有意思的地方在于，你既拥有内存的属性，又拥有硬盘的持久性，并且性能几乎和易失性内存一样好。</description></item><item><title>非阻塞数据结构</title><link>https://uni.bluepuni.com/archives/nonblocking-data-structures/</link><guid>https://uni.bluepuni.com/archives/nonblocking-data-structures/</guid><description>## 第一部分 大家早上好，感谢各位的到来。也谢谢 Peter 的介绍。 我很高兴能来到这里。我一直想来圣彼得堡看一看，所以当我有机会来这里讲课，并且明天还能在 Hydra 大会演讲时，我立刻抓住了这个机会，因为我一直都想到这儿来。</description></item><item><title>你所有的内存，都归谁所有</title><link>https://uni.bluepuni.com/archives/all-your-memory-are-belong-to-whom/</link><guid>https://uni.bluepuni.com/archives/all-your-memory-are-belong-to-whom/</guid><description>我的名字是 Vlastimil，你可能从《我如何删除了 SLOB 分配器》以及其续集《我如何又删除了 SLAB 分配器》这两部影片中记得我。 现在，我负责维护剩下的 SLUB 分配器，并活跃于内存管理系统（MMS）的其他部分。 但过去两年我一直在谈论删除 SLOB/SLAB 分配器的事情，所以我决定换个主题。我喜欢的另一种演讲形式是，介绍一些介于调试和解释内核内部原理之间的内容，这总是一个很好的机会，可以深入研究源代码和历史，甚至去了解那些我平常不会去看的细节，并从中学习到一些东西，包括那些我希望自己没学到的东西——这次演讲就完全是这种情况。 如果你对标题里糟糕的语法感到困惑，那说明你太年轻了，不记得 2000 年左右的一个网络迷因，它引用了 80 年代末一款翻译得很烂的日本电子游戏。 当然，在那个时候，还不是“你所有的内存”（all your memory），而是“你所有的基本页”（all your base pages），因为那时还没有巨页（huge pages），Linux 甚至都还不存在。我实在忍不住想在幻灯片里放一些更令人难忘的台词，所以提前为此道歉。 ### free 命令...</description></item><item><title>Maple Tree：结构和算法</title><link>https://uni.bluepuni.com/archives/maple-tree-structure-and-algorithms/</link><guid>https://uni.bluepuni.com/archives/maple-tree-structure-and-algorithms/</guid><description>大家好，我是Liam Howlett，我在Oracle工作。欢迎参加关于Maple Tree数据结构的结构和算法的讨论。那么，我将稍微谈谈Maple Tree的总体思路，它与其他树的不同之处以及相似之处。我会回顾一下我们编写这个树的原因、使用它的好处和理由，然后我们将深入节点细节，展示一些小树的例子，接着探讨查找、存储或修改树结构的算法。 Maple Tree**满足了大多数B树的要求**。Maple Tree的特别之处在于它能够存储范围。一个条目可以通过多个索引找到。一个索引仍然可以引用一个条目，但以目前的实现方式效率较低。我们将在不久的将来研究解决这个问题。Maple Tree的另一个好处是对读取者的RCU保护。这意味着写入者不必阻塞读取者。还有一些术语上的差异。我们称存储条目的地方为“槽位”，而“枢轴点”通常被称为“键”。我们使用枢轴点与索引和最后作为特定条目的范围。我们称之为枢轴点，是因为正如我之前所说，它可以对应多个键。所以这里只是想指出这个区别。B树历史上是为了加速磁盘访问而存在的。Maple Tree的设计旨在优化缓存命中。基本上，我们不是去访问RAM，而是尝试在CPU缓...</description></item><item><title>API &amp; ABI 版本控制</title><link>https://uni.bluepuni.com/archives/api-abi-versioning/</link><guid>https://uni.bluepuni.com/archives/api-abi-versioning/</guid><description>好的。大家好。今天早上怎么样？你们好吗？嗯，很棒。很棒。到目前为止，你们享受这次大会吗？ 我也是。好的。感谢大家来到这里。我将要和大家谈谈 API、ABI 版本控制，以及基本上当您做出任何类型的更改时，如何在您的代码中处理其带来的影响。 通常，当您更改某些内容，当您发布一个新的提交时，您应该问自己的问题是：这会带来什么影响？</description></item><item><title>C++ 标准定义的用户类型分类</title><link>https://uni.bluepuni.com/archives/a-tour-of-cpp-recognised-user-type-categories/</link><guid>https://uni.bluepuni.com/archives/a-tour-of-cpp-recognised-user-type-categories/</guid><description>我的名字是 Nina Ranz。我从 2013 年起就是标准委员会的成员，但我大多数时候都躲在阴暗的角落里，很少出来和真人打交道。我所在的 C++ 核心语言工作组（Core Working Group），负责管理标准的前 16 个章节，这部分标准主要讨论语言语法，基本不涉及库。我就是那种确保所有逗号都各就其位、所有规则都清晰明确并表达其应有之意的人之一。显然，我对字母 C 也有一种特殊的偏好。这完全是无意的。 我为什么会在这里？ 很多人在封城期间做了各种有趣的事情，比如学习一门新语言，或者补完所有没读过的书和没看过的电影。而我，则帮助了我亲爱的朋友 John Lakos。哎呀！没关系，一切都好。我帮助了我的好朋友 John Lakos 以及其他几位非常非常聪明的人写了一本书。我在其中的角色，基本上是一个语言律师（language lawyer）。我的职责是确保书中的写法绝对、完全正确。</description></item><item><title>C++ 的前向进度保证</title><link>https://uni.bluepuni.com/archives/forward-progress-guarantees-in-cpp/</link><guid>https://uni.bluepuni.com/archives/forward-progress-guarantees-in-cpp/</guid><description>好的， crew，准备好了吗？摄像机开拍。好的。好的。 欢迎大家来听这场关于**前向进度保证**（forward progress guarantees）的讲座。我们将讨论 C++ 中的前向进度保证，但实际上**不仅仅是 C++**。原因是，很多语言实际上（de facto）都引入了 C++ 的抽象机模型。没有多少语言会去自己定义什么是内存，很多甚至连自己的内存模型都懒得定义，同样，它们也不会定义自己的前向进度保证。很多语言的情况是，有人在 LLVM 上构建了一个前端，然后在不知不觉中，就把 C++ 的抽象机带到了他们的程序底层。 好的。所以这里的规则通常适用于各种语言，尽管 C++ 对其自身的一些设施有非常具体的措辞，我会在激活这些部分时告诉大家。</description></item><item><title>使用 io_uring 改进 ioctl</title><link>https://uni.bluepuni.com/archives/revamping-ioctl-with-io-uring/</link><guid>https://uni.bluepuni.com/archives/revamping-ioctl-with-io-uring/</guid><description>欢迎来到这次演讲，它关于去年在内核 5.19 版本中引入的一项新功能。 它被称为 `Uring Command`。虽然标题也说这是关于改造 `ioctl` 的，但实际上它的应用范围比这更通用一些。 如果你因为任何原因正在寻找构建一个新的用户接口的方法，这或许是你想要考虑的东西。 我是 Kanchan，Anos 是联合演讲者，但不幸的是他没能来到现场。 那么，让我们开始吧，或许可以粗略地将用户与内核的通信分为两类。 第一类是我们通过明确定义的系统调用（system calls）进行的通信，我将其标记为**结构化通信**。 而其他所有不适合那些明确定义的系统调用的通信，都归入**非结构化通信**的范畴。 我们之所以有这种分类，是因为构建系统调用通常需要创建通用的抽象。 所以，你可能正在编写某个内核组件，它可能是一个驱动程序，一个文件系统，或者其他一些内核组件。 有时你可能想与用户空间应用程序进行通信。 如果你正在做的事情是众所周知的或以前做过的，你可以使用一个系统调用，这样事情就解决了。 但是，如果你正在做一个稍微特殊的操作，你可能会发现将其变得通用有些困难。 这就是为什么创建新的系统调用...</description></item><item><title>耐力组管理</title><link>https://uni.bluepuni.com/archives/endurance-group-management/</link><guid>https://uni.bluepuni.com/archives/endurance-group-management/</guid><description>#### 主讲人介绍及议题概述 好的，我是 Mark Carlson，来自东芝存储（Toshiba Memory）。Paul 和我将要就这个“耐力组管理”（Endurance Group Management）的话题进行一次演讲。这个议题也包含了 NVM 集（NVM set）管理。当 NVM 集和耐力组在 NVMe 1.4 规范中被引入时，其功能是相当有限的，因为 SSD 制造商会交付一个预先配置好 NVM 集的驱动器。作为客户，你实际上对于这些 NVM 集的位置以及它们的大小，只有非常有限的控制能力。 我们在这项新工作中正在做的，是允许对 NVM 集和耐力组进行更精细的控制。NVMe 1.4 版本虽然有耐力组的概念，但它只是驱动器告诉主机，驱动器内部正在对哪些区域进行磨损均衡（wear leveling）。结果就是，在某些情况下，主机必须跨越不同的 NVM 集进行磨损均衡，这完全取决于制造商交付给你的产品是什么样的。所以，我们正在这个领域增加更多的能力。我就不念摘要了，那是一张我们俩的漂亮合影，我们直接进入正题，好吗 ？</description></item><item><title>静态初始化顺序难题（SIOF）</title><link>https://uni.bluepuni.com/archives/the-static-initialization-order-fiasco/</link><guid>https://uni.bluepuni.com/archives/the-static-initialization-order-fiasco/</guid><description>这就是静态初始化顺序问题，或者说如何正确地初始化全局状态。特别说明，本次演讲不会讨论你是否应该使用全局变量。本次演讲的前提是我们已经决定要使用全局变量，现在我们想知道如何正确地初始化它们，因为正如我们所见，这有点棘手。在整个演讲中，我们将尝试编写一个日志记录器（logger）。这个日志记录器应该能够同时将消息记录到 `std::cout` 和某个文本文件，并且它应该在程序执行的任何时刻都可用。如果你了解我，我有点“库依赖症”。所以在整个演讲过程中，我写了越来越多有用的代码片段，最终把它们放到了一个小型库中，叫做 Atum 库。你可以在那个 URL 找到它，更多信息也在最后。但我们基本上会在这次演讲中编写它的大部分内容。 ```cpp // logger.hpp</description></item><item><title>C++ 对象生存期（不）完全指南</title><link>https://uni.bluepuni.com/archives/an-in-complete-guide-to-cpp-object-lifetimes/</link><guid>https://uni.bluepuni.com/archives/an-in-complete-guide-to-cpp-object-lifetimes/</guid><description>我今天要讨论的是对象生存期 (object lifetimes)。我最初给幻灯片的标题是《C++ 对象生存期完全指南》，但后来我觉得这个标题可能有点太雄心勃勃了。所以我在这里给自己留了点余地。事实证明，这确实是正确的，因为这属于那种我自己也想学习，所以才提交的议题。所以，在我写这个演讲的大纲时，我其实并不知道所有细节。 随着我学得越多，我越发意识到这份指南有多么不“完全”，而且至关重要的是，我发现标准中关于这个主题存在着多少 bug。我们接下来就会看到。 所以，这次演讲是关于对象生存期的。那么最直接的问题就是：什么是对象？什么是生存期？</description></item><item><title>如何让 C++ 二进制文件小巧可爱</title><link>https://uni.bluepuni.com/archives/how-to-keep-cpp-binaries-small/</link><guid>https://uni.bluepuni.com/archives/how-to-keep-cpp-binaries-small/</guid><description>感谢大家的到来。在接下来的 60 加 90 分钟里，我们将讨论二进制大小的问题。总共是两个半小时，时间很充裕。所以，如果你有任何问题或意见，因为你可能对某些部分更了解，或者有一些自己的想法，随时可以打断我。如果你愿意，这次分享可以非常有互动性。 好的，让我自我介绍一下。嗯哼。我又遇到这个问题了。好吧，没关系，我用空格键。我叫 Sandor Dargo，是 Spotify 的一名高级工程师。 所以我不是在嵌入式领域工作，但我们确实有一些嵌入式相关的业务，只是我不在那个部门。 嗯，我喜欢写作，可能比演讲更喜欢。我写的东西不限于 C++，但主要关于 C++，有时也会写一些关于我读过的斯多葛哲学书籍。我热爱旅行，也热爱一切与美食相关的事物。 举个例子，我喜欢烘焙酸面包，并且去年刚在我居住的法国通过了几个品酒师考试。我不是为了这个才搬到法国的。我有两个活泼可爱的孩子，非常感谢我的妻子照顾他们，这样我才能和大家在这里相聚。</description></item><item><title>concept 和 std::ranges 时代的文档</title><link>https://uni.bluepuni.com/archives/documentation-in-the-era-of-concepts-and-ranges/</link><guid>https://uni.bluepuni.com/archives/documentation-in-the-era-of-concepts-and-ranges/</guid><description>大家好，我是 Christopher Debella，Google 的一名软件工程师。 我的名字是 Sai Brand，我是微软的 C++ 开发者布道师。 今天，我们将和大家探讨在概念（concepts）和范围（ranges）时代下的文档化问题。</description></item><item><title>C++ 异常的误用案例及改进方案</title><link>https://uni.bluepuni.com/archives/exceptionally-bad-the-story-on-the-misuse-of-exceptions-and-how-to-do-better/</link><guid>https://uni.bluepuni.com/archives/exceptionally-bad-the-story-on-the-misuse-of-exceptions-and-how-to-do-better/</guid><description>欢迎来到我的演讲，“异常糟糕”（Exceptionally Bad），讲述异常的故事、误用以及如何做得更好。好的，这是我放上去的幻灯片，因为我的公司希望我放一张彭博工程（Bloomberg Engineering）的幻灯片。是的，我在彭博工作。但我是谁？站在前面这位风度翩翩的年轻人是谁？嗯，我从1991年开始专业地用C++编程。所以我干这行很久了，可以追溯到C-front（早期的C++编译器）的旧时代。在我的职业生涯中，我做了很多系统分析和架构设计。在永久加入彭博之前，我做了21年的顾问，这意味着我见过很多不同的公司，很多不同的团队，见过哪些行得通，哪些行不通。我目前在彭博领导行情服务器（ticker plants）的Linux迁移工作。这些服务器负责将我们作为行情提供给彭博客户的所有数据。那么，当我做演讲时，我喜欢做什么？我的人生信条是做我称之为“聚焦实用软件工程”的演讲。它扎根于现实世界，因为那通常是我编程和工作的地方。我希望演讲能让你带走一些东西并使用，无论是改变你的思维方式，还是给你一些工程原则来运行你自己的项目。好的。那么，我有很多幻灯片。我想这是我第一次拥有如此多的幻灯片数...</description></item><item><title>使用 PMR 分配器以获取更好性能</title><link>https://uni.bluepuni.com/archives/basic-usage-of-pmrs-for-better-performance/</link><guid>https://uni.bluepuni.com/archives/basic-usage-of-pmrs-for-better-performance/</guid><description>大家好，下午好，欢迎来到我关于PMR和性能的演讲。那么，这里都有谁呢？我是谁？我是一名自由职业者，主要从事C++编程。我从网络协议开始，然后做了很多客户端服务器、REST相关的工作，现在转到了Qt和用户界面。我一直在Linux、Windows上工作，最近几年更多地转向嵌入式领域，而我似乎总是关心性能。那么，这次演讲讲些什么？首先是介绍，我们现在在做什么，然后我们会快速看一下分配器，再看STL中的分配器支持，然后看这些神秘的PMR，没人知道它是什么，接着是如何使用它们，然后我会稍微离题讲一下系统分配器的主题，之后是提问时间和简短总结。 什么是分配器？嗯，当今计算机硬件中最慢的部分不是处理器，而是内存总线。因此，我们必须关心CPU缓存，关心“热度”，关心数据局部性。此外，分配内存是昂贵的，因为涉及到系统调用，我们必须在**线程**之间同步，我们必须关注碎片化，避免碎片化。而分配器就是试图为我们解决这些问题的软件片段。 有两种内存分配器：系统内存分配器和自定义内存分配器。系统内存分配器由标准库、C库提供给你。它们也可以在程序启动时在运行时注入到程序中。它们通过`malloc`和`free`函...</description></item><item><title>函数契约实践</title><link>https://uni.bluepuni.com/archives/function-contracts-in-practice-using-cpp/</link><guid>https://uni.bluepuni.com/archives/function-contracts-in-practice-using-cpp/</guid><description>大家好，欢迎来到“函数契约”。我叫 Rostislav Khlebnikov，或者 Slava。我是 Bloomberg BDE Solutions 团队的负责人，我们为 C++ 开发基础库。今天我将要谈论函数契约。它们为什么重要，它是什么，为什么它们重要，以及为什么你在开发函数时，可能会选择一个有前置条件的函数，或者换句话说，所谓的“窄契约”。然后，我将讨论如何设计一个好的契约？对于你的函数来说，一个好的契约有哪些方面？接着，一旦你实现并设计好了你的函数，我将简要介绍如何确保契约不被你的客户端违反，如何将你的契约传达给客户端，因为在编程中，沟通和技术能力同等重要。最后，当你在一个不仅仅是玩具程序上工作，而是希望将契约检查集成到你的组织和整个工作流程中时，一个大规模契约检查系统需要什么。 好的，在我开始谈论什么是函数契约之前，我们先看看现实世界中的契约是什么。契约是双方之间的一项协议，它产生执行或不执行特定义务的责任。这是一种定义。契约是双方之间产生义务的协议。契约是各方之间产生可由法律强制执行的双向义务的协议。所以，你可能注意到所有这些定义，尽管略有不同，但它们之间至少有一个共同点。...</description></item><item><title>int 还是 uint，这是个问题</title><link>https://uni.bluepuni.com/archives/to-int-or-to-uint-this-is-the-question/</link><guid>https://uni.bluepuni.com/archives/to-int-or-to-uint-this-is-the-question/</guid><description>好的。我们开始吧。首先，我想说谢谢大家能来并选择我的演讲。这次会议有那么多非常棒、非常棒的演讲，你们选择了这个演讲并在这个大房间里，我感到很惊讶。非常感谢大家能来。简单介绍一下我自己。我是 Alex Dotskovsky。我有超过 17 年的系统编程经验。我做过很多不同的系统，从拯救生命的医疗系统到剥夺生命的安全系统。你知道，两者都得做。我现在在一家叫 Speed Data 的公司工作。我们是一家很棒的初创公司，正在开发大数据领域的下一个重大产品。所以，基本上，我们正在做的是创造一种新的 CPU，一种通用 CPU，它将极大地加速你的分析。也许在明年的 CppCon 上，我终于能拿到芯片，并最终做点关于芯片的事情。我有 LinkedIn。在那里我经常谈论 C++、谜题、人们讨厌的东西。如果你想加入，你可以那样做。如果你能关注我，那将是非常棒的。我开了一个博客，因为 LinkedIn 只是发小帖子，我想发布更多内容并更详细地解释，让人们理解。所以，CppNext。这是我创办的一个网站。我还有 YouTube 频道。我已经有七个视频了。所以，在这个演讲之后，去点赞和订阅吧。我会非常感激的。但...</description></item><item><title>memory_order_relaxed 轻松指南</title><link>https://uni.bluepuni.com/archives/a-relaxed-guide-to-memory-order-relaxed/</link><guid>https://uni.bluepuni.com/archives/a-relaxed-guide-to-memory-order-relaxed/</guid><description>所以我们有 C++ 中的原子操作。默认情况下，它们是顺序一致的（sequentially consistent）。这意味着如果你声明一个原子对象，并对其进行加载（load）或存储（store），你会在你拥有的所有原子对象之间获得完整的交错语义。但这仅在使用了默认设置时才成立。这是昂贵的。在弱序架构上尤其如此。在许多情况下，你并不需要这种交错语义。而这是被允许的。你可以通过使用内存序（memory order）枚举值来避免这种情况，特别是我们今天要讨论的 `memory_order_relaxed`。好的。 从多个角度来看，`memory_order_relaxed` 都是极好的。我的意思是，如果你给出一个 `memory_order_relaxed` 加载，你得到的就是一条加载指令。如果你进行 `memory_order_relaxed` 存储，你得到的就是一条存储指令。这简直太棒了。你拥有了控制权。你获得了极高的效率和可扩展性，当然，前提是你的对象大小是硬件可以容纳的。这仅仅是一条加载，仅仅是一条存储，简直太棒了。 不幸的是，存在一些复杂性。你看，我们不仅仅要处理硬件。我们还有这些叫...</description></item><item><title>用性能工具剖析 std::ranges</title><link>https://uni.bluepuni.com/archives/throwing-tools-at-ranges/</link><guid>https://uni.bluepuni.com/archives/throwing-tools-at-ranges/</guid><description>嗨，大家好。欢迎来到我关于在范围（`std::ranges`）上使用分析工具的演讲。我非常感激你们今天在这里听我演讲。自从我上次谈论如何对 fire code 使用范围以来，很多人问我：但这会如何影响运行时性能？范围在运行时表现好吗？我在之前的演讲中做了一些基准测试，但我并没有真正详细分析它。所以我想这次演讲可能会有所帮助，使用一些不同的工具，试图看看范围代码的实际性能表现如何。这只是运行时，不是编译时。 首先，我将开始谈论我的设置以及我是如何生成结果的。接下来，我将解释我们实际上要分析的代码。如果你想将你的范围代码与某些东西进行比较，你需要有其他的东西来比较它。所以我用我称之为“C 风格 C++”（不使用任何标准库）、“C++ 17”（使用算法）和“C++ 23”（主要使用范围（ranges）和范围适配器（range adapters））编写了完全相同的代码。它们都做完全相同的事情。我将使用不同的工具分析这些代码示例：Google Benchmark、Cachegrind 和 Visual Studio Profiler。虽然我以前用过 Visual Studio Profiler，...</description></item><item><title>优化备注：帮助编译器生成更好代码</title><link>https://uni.bluepuni.com/archives/optimization-remarks/</link><guid>https://uni.bluepuni.com/archives/optimization-remarks/</guid><description>好的，我叫 Ofek Shilon，非常欢迎大家来听关于优化备注（optimization remarks）的演讲。接下来的大约一个小时，我们将学习如何帮助我们的编译器生成更好的代码。那么，优化备注是来自 Clang 生态的一个术语，我们演讲的大部分内容将围绕 LLVM 生态展开，但在接近尾声时我们会稍微超出这个范围。这些本质上是一种日志形式。像任何成熟的软件一样，编译器，特别是编译器内部的优化通道（optimization passes），会留下日志。有些日志是调试日志，非常冗长和具体，其含义只有实际编写它们的开发者才能理解。但优化备注更简洁，经过一些解读努力后，可以告诉我们尝试了哪些优化、在何处尝试的、是否成功，以及如果失败了，原因是什么？有时它们会为我们开发者提供可操作的信息。因此，我的目标是，在本次演讲结束时，你们将知道如何解读一些优化备注，解决编译器在其中警示的一些问题，以及同样重要的，如何为你们自己的项目获取这些信息。 现在，我们将在演讲的前半部分，在一个无菌实验室中学习优化备注。我可能有点偏见，但最好的实验室当然还是 Compiler Explorer。那么，如何在 Co...</description></item><item><title>硬件加速页迁移过程</title><link>https://uni.bluepuni.com/archives/accelerating-page-migrations/</link><guid>https://uni.bluepuni.com/archives/accelerating-page-migrations/</guid><description>嗯，过去通过提高ILP（指令级并行）显著提升了性能，但如今那样的时代已经结束了。我认为趋势正在转变为：添加某种功能，然后很好地利用该功能来使用。那么，这个数据流加速器（data streaming accelerator）的想法是，不使用CPU的加载存储（load-store）指令来处理数据复制中产生的问题，而是使用独立的硬件、即芯片内独立的加速器来处理。实际上，这并不是为了操作系统的某个特定功能而出现的。只是说，现在普遍地，这些情况需要大量数据，并且随着内存增大，数据来回移动、比较、清零等操作中产生的CPU周期，我们希望通过减少这些周期，让CPU真正专注于应用程序的周期，而其余那些工作呢，可以说是“由我们（加速器）来单独处理”的方式。是的。所以，我们本着“将数据流加速器中负责数据复制的那个东西，应用到内核中负责移动数据的那个部分上”的意图，开始了这项研究。 原本呢，正如前面郑镇圭教授所说，运行应用程序进行性能分析，从中找出瓶颈，然后一步步解决，这可以说是非常理想的路径。但我们呢，是反其道而行之。啊，既然有这个东西（加速器），那看看用它在哪里能更好呢？这样看就可以了。这里呢，嗯，其实大...</description></item><item><title>异步 I/O 栈</title><link>https://uni.bluepuni.com/archives/asynchronous-io-stack/</link><guid>https://uni.bluepuni.com/archives/asynchronous-io-stack/</guid><description>那么，我们就开始吧。大家好，我是被介绍过的成均馆大学的郑镇圭。得到大家这么多的称赞，我现在有点不知所措。总之，今天要讲的内容，题目是 Asynchronous I/O Stack。这篇论文是在SSD性能呈几何级数发展、变得非常快的状况下，对内核的I/O Stack如何能很好地应对这种高速SSD进行了思考并提出了解决方案。所以这篇论文去年在USENIX ATC上发表了。那么，在说明这篇论文之前，我简要整理了一下在准备发表过程中我迄今为止所做的研究。主要的研究主题大致分为三类。第一个是过去研究过面向云计算的机器虚拟化技术；然后过去也研究过移动系统、像安卓这样的智能设备上的内存管理；最近主要是研究为了更好应对新兴存储技术的I/O软件栈。那么，简要说说最近研究的内容有哪些：首先要说的是，当存在这种高速SSD时，在I/O栈中，像数据库或NoSQL这样的数据密集型应用程序如何能良好运行。为此，跨越整个I/O栈良好地进行I/O处理会非常有帮助。我们曾做过这样的研究。接下来是，随着像三星的Z-SSD或英特尔的Optane SSD这种所谓的超低延迟SSD的出现，I/O栈本身也出现了问题。当这个超低延迟，...</description></item><item><title>Android 里面的 F2FS 特性</title><link>https://uni.bluepuni.com/archives/f2fs-features-in-android/</link><guid>https://uni.bluepuni.com/archives/f2fs-features-in-android/</guid><description>我这就开始。因为我是临时想到的，或者说我匆忙整理资料时想到的，所以会以我们当前使用的 Android 最新内核版本中的挂载选项或某些特性为主进行讲解，并且会介绍我们是如何针对 Android 进行优化的。另外，考虑到在座各位大多是研究生，可能对问题本身比对解决方案更感兴趣，所以我选取了大约十多个围绕具体问题或主题的内容。我会逐一讲解，并分享其中有趣的部分，以及我们在开发产品（我现在正在做 Pixel 手机）时遇到并需要解决的问题。因此，我将按主题分类进行列举。 另外，可以按年代顺序来理解这些主题：我先介绍的主题是早期、按时间顺序演进的。所以，早期的关注点主要是性能方面的重要特性，但从某个时间点之后，趋势转向了如何从稳定性角度强化 QA 等方面，再之后又回到性能，如此反复。因此，主题也大致按性能-&amp;gt;提升稳定性-&amp;gt;再回到性能这样的顺序排列，供大家参考。 在介绍每个特性之前，我觉得有必要先画图说明一下 Android 设备是如何运作的，这需要一点背景知识。所以，我想最好先在这里解释一下这个背景，为此我做了些准备。</description></item><item><title>Yandex 实践中的性能故障排查</title><link>https://uni.bluepuni.com/archives/yandex-performance-troubleshooting-in-practice/</link><guid>https://uni.bluepuni.com/archives/yandex-performance-troubleshooting-in-practice/</guid><description>谢谢。大家好。我是安东·苏沃洛夫（Anton Suvorov）。我在 Yandex 的基础设施服务部门工作，领导系统开发团队。我们的服务负责服务器的整个生命周期，从服务器被安装在数据中心机架上的那一刻起，直到其生命周期结束时提交拆除和回收请求为止。我们负责操作系统、主机上运行的所有守护进程、配置、进程间隔离以及保障此主机生命周期的配套服务。当编排器（Orchestrator）启动并开始承载开发者通过其服务创建的负载时，我们的职责范围就结束了。今天我们将探讨几个我们在生产环境中遇到的、并通过支持工单提交给我们进行实际调试的案例。为了重现这些问题，我们今天将使用一台主机和几台虚拟机。为了限制容器的资源使用，我们将使用我们内部使用的容器运行时 Porto，它已准备好在大型云环境中使用。作为示例，我们将使用用 Go 语言编写的服务，这些服务内部相当简单，只执行一个功能。但要重现实际的生产问题相当困难。需要引入一个大型服务，而如何启动它却不得而知。因此，我们将在这种“温室”环境中审视我们的问题。 为了生成负载，我们将使用 `vegeta` 工具。我们尝试过其他工具，但它是最方便的，并且用它很容易...</description></item><item><title>Yandex 内核调参分享</title><link>https://uni.bluepuni.com/archives/yandex-configuring-kernel-parameters/</link><guid>https://uni.bluepuni.com/archives/yandex-configuring-kernel-parameters/</guid><description>谢谢。大家好！今天由Yandex基础设施团队为大家带来分享，我和Anton Suvorov将为大家讲解如何让你们的项目像我们的一样酷炫且高可用。我叫Aleksandr Kostrikov，在网络基础设施部门工作。我们部门负责将流量高性能地传输到Yandex的所有服务。我们拥有许多数据中心，海量的流量和网络设备。同时，我们也处理大量关于负载均衡和防火墙处理的请求。今天我将讲述如何基于Linux配置所有这些系统，因为Linux是一个已被证明高可用、可靠并允许我们按自己所需配置系统的平台。我直接进入我们正在使用的产品。这是一个高性能流量处理器。它已经在NextHop和其他会议上介绍过。这是一个基于Linux运行的系统。Linux允许运行高性能应用程序来处理大流量。它使用了所有可能的优化技术。包括DPDK(数据平面开发工具包)、NUMA节点、使用大页（huge page）以及为流量单独处理而进行的核心隔离。 那么，为什么我们选择Linux？首先，Linux允许我们根据需要配置任何东西。我们可以重新编译内核，此外，我们还可以通过内核参数选择我们需要的功能。例如，可以查看Linux中可用的命令行参...</description></item><item><title>OOP 已死，DOD 长存</title><link>https://uni.bluepuni.com/archives/oop-is-dead-long-live-data-oriented-design/</link><guid>https://uni.bluepuni.com/archives/oop-is-dead-long-live-data-oriented-design/</guid><description>早上好。我叫 Toyan。首先，感谢大家这么早起床来参加这个演讲。今天我们将聊聊**数据导向设计**（data-oriented design）。我决定做这个演讲是因为，在查阅了所有关于数据导向设计的资源、演讲和博客后，我无法找到一个好的例子，展示人们如何用数据导向设计构建一个真实世界的生产系统，并将其与**面向对象编程**（object-oriented programming）进行比较，而且是**在游戏领域之外**的例子。我在视频游戏行业已经有大约十年了。我一直在做游戏。然而，我主要从事的是游戏技术。我在一家名为 Coherent Labs 的公司工作，我们为游戏创造技术。所以，如果你在玩游戏并且你是个游戏玩家，你的机器很可能已经执行过我们将要看到的一些代码。在过去的六年半里，我们一直在开发基于 Chromium、WebKit 的产品，以及现在我们自有的专有游戏 UI 和浏览器引擎。如果你不熟悉这些术语，Chromium 是开源的，是 Chrome 浏览器、Slack、Skype 以及许多其他很可能正在你机器上运行的应用程序的核心。WebKit 是 Chromium 核心最初分叉出...</description></item><item><title>更快、更少的页错误</title><link>https://uni.bluepuni.com/archives/faster-and-fewer-page-faults/</link><guid>https://uni.bluepuni.com/archives/faster-and-fewer-page-faults/</guid><description>我是个非常幸运的家伙。我几乎可以在我想做的任何东西上工作。我的职责就是做些很酷的事情，用 Linux 做些有趣的事情，让 Oracle 看起来很棒。而这实际上很可怕。因为现在我必须选择值得拥有这种自由度的项目来工作。哦。哦。抱歉。一切都还好吗？好的，很好。谢谢你。是的。所以当我第一次被给予这个机会时，我第一次能够这样做。我能够这样做。我能够这样做。我能够这样做。所以当我第一次被给予这个机会时，我花了很长时间试图决定我应该研究什么。我找到了我在这里底部链接的这个演讲。我会把幻灯片放出来。这是 Richard Hamming 的演讲。汉明码、汉明权重、汉明距离。我们都听说过 Hamming。他曾在贝尔实验室工作。他在贝尔实验室做了这个演讲，讲的是如何做能获得诺贝尔奖的研究。我不是在做能获得诺贝尔奖的研究。但原理是一样的。你必须抛开你的谦虚。你必须说，我能做伟大的事情。你必须了解你工作的领域。你必须了解那些大问题是什么。你不必研究所有的大问题。但你应该知道它们是什么。你应该思考它们。不是一直思考。但当某件事出现时，当你学到新东西时，你应该扪心自问，这对我所在领域、我所从事工作的前十大问题中的...</description></item><item><title>正确实现类型双关</title><link>https://uni.bluepuni.com/archives/type-punning-done-right/</link><guid>https://uni.bluepuni.com/archives/type-punning-done-right/</guid><description>今天我们在这里是为了揭开标准 C++ 中两位新朋友的神秘面纱，即 `std::launder` 和 `std::start_lifetime_as`。但我们也要讨论 `reinterpret_cast` 中的未定义行为。这是一个技术性很强的演讲，但我尽量让它尽可能简单。让我们把它当作一个游戏。 我会问很多问题。首先，在座的各位，请举手，谁以前做过 `reinterpret_cast`？好的。可怕。很可能是未定义行为。我只是说说而已。我只是说说而已。 好的。首先，让我简单介绍一下自己。我是谁？正如 Jose Daniel 所说，是的，我在 2017 年到 2020 年期间在这里攻读博士学位，主要从事……嗯，很多主题，但在编译器方面，我从事 C++ 契约（contracts）的实现工作。嗯，可能不是最终进入 C++26 标准的那一个，而是当时的提案。我也在 `Cling` C++ 解释器上工作过，去年我完全投入其中。最近，从 2024 年开始，我一直在 `Simperium` 担任编译器工程师，我们构建二进制到二进制的混淆解决方案。这听起来也很可怕。好吧。</description></item><item><title>LLVM 对 C++ switch 语句的实现</title><link>https://uni.bluepuni.com/archives/cpp-switch-statements-under-the-hood-in-llvm/</link><guid>https://uni.bluepuni.com/archives/cpp-switch-statements-under-the-hood-in-llvm/</guid><description>好的，您可以看到幻灯片。这是最令人兴奋的部分，将计算机连接到系统。那么，大家好。感谢邀请我。我叫 Hans，我在 Google 从事编译器相关工作，特别是维护我们用于构建 Chromium 的工具链。我也曾担任过一段时间的 LLVM 发布经理，并且在 LLVM 的 Windows 支持、ClangCL 等方面做了大量工作。自从我搬到斯德哥尔摩以来，我想我来这里参加活动已经快两年了。我想我是通过 Bjorn 的 Twitter 发现这里的，所以这很有效。与在座的许多人不同，我对最新的 C++26 特性并不是特别熟悉，所以我来这里是为了学习和享受乐趣。但我确实了解的一个特性是 switch 语句，因为它们很古老，就像我一样，而且我在 LLVM 中对它们做了一些工作。所以，这是一场关于 C++ 底层实现的演讲。不是关于 C++ 的最新特性，而是关于底层实现。所以，请告诉我您是否希望看到更多这类演讲。 那么，我们在这里尝试解析演讲的标题：C++ switch 语句在 LLVM 中的底层实现。内容很多。首先，这个 LLVM 到底是什么？这里有多少人听说过 LLVM？很多手举起来了。非常非常酷。我...</description></item><item><title>Linux 的大页块 I/O</title><link>https://uni.bluepuni.com/archives/large-block-io-for-linux/</link><guid>https://uni.bluepuni.com/archives/large-block-io-for-linux/</guid><description>大家好，我叫 Hannes Reinecke（汉内斯·赖内克）。你们有些人可能认识我，有些人不认识。我在 SUSE 工作，正如你们在那里看到的。嗯，差不多有，呃，大约 20 年了。我参与 Linux 的时间甚至比这还要长。所以，我刚开始接触的第一个 Linux 版本，我想是 1.15 或 1.05 之类的，那是很久很久以前的事了，真的很古老了。总之，从那时起，我就一直活跃在 Linux 相关的各种事务中。 最近我主要参与存储领域，特别是 NVMe。而现在这个，嗯，其实是我的一个个人项目，它终于实现了。那就是，对大页面的追求。 那么，它是什么？我们为什么要做它？当你做 I/O 时，I/O 不可避免地是以更大的块（称为块）来完成的。这些块目前受到 Linux 内核硬件页大小的限制，在 x86 机器上通常是 4K。而且，各种驱动程序和子系统也隐式地假定了这个页大小限制。然而，这并非世界末日。有些系统和/或应用程序实际上可能受益于更大的页面。有些特定的数据库，它们真的希望以 16K 的增量进行通信，因为数据库内部就是这样组织的。此外，如果我们能迁移到更大的页面、更大的尺寸、更大的块大小，一些硬...</description></item><item><title>I/O 模式怎么选，ScyllaDB 教会你</title><link>https://uni.bluepuni.com/archives/different-io-access-methods-for-linux-what-we-chose-for-scylladb-and-why/</link><guid>https://uni.bluepuni.com/archives/different-io-access-methods-for-linux-what-we-chose-for-scylladb-and-why/</guid><description>谢谢你，Marisa。那么我们开始吧。简单介绍一下我自己。我叫 Avi。我是 Linux 虚拟机管理程序 KVM 的最初维护者。我是 CSTAR 的联合维护者，CSTAR 是一个 I/O 和异步编程框架；也是 ScyllaDB 的联合维护者，ScyllaDB 是一个数据库，一个能够管理数 TB 或更大规模数据的大数据数据库。我也是公司的联合创始人。因此，在担任 Linux KVM 和 ScyllaDB 这两个角色期间，以及之前的角色中，我都必须处理大量的 I/O。我想分享一些我在这个主题上的经验。 简单介绍一下 ScyllaDB。它是一个分布式 NoSQL 数据库，适用于拥有海量数据（从 TB 到 PB）且需要每秒数十万或数百万次操作的应用，所有这些操作都要求低延迟。我们有很多用户，他们能够报告延迟的降低（尤其是在 99 百分位）、吞吐量的提升以及节点数量的减少，这直接转化为成本的降低。它提供开源版本、企业版和云附加组件。它与 Apache Cassandra 协议和 Amazon DynamoDB 兼容。因此，从现有数据库迁移过来相当容易，并且它加入了一个庞大的生态系统。 我们的一些...</description></item><item><title>LLVM 优化备注</title><link>https://uni.bluepuni.com/archives/llvm-optimization-remarks/</link><guid>https://uni.bluepuni.com/archives/llvm-optimization-remarks/</guid><description>大家好，非常感谢大家前来。我的名字是 Ofeq Shilon。我在一家名为 Istra Research 的高频交易（HFT）公司担任开发人员，公司位于以色列。我可以通过 Ofeq Shilon 这个用户名在所有主要平台上联系到我。今天我将向大家介绍一个在 LLVM 领域内鲜为人知的工具，称为**优化备注**（optimization remarks）。 那么，什么是 Clang 优化备注？优化器通常会留下一些日志。诚然，这些日志是由编译器作者编写的，并且面向编译器作者。因此，理解它们往往需要相当大的破译功夫。但一旦付出这份努力，它们有时对于关注优化的开发人员来说可能是一座金矿。我的意思是，这不再是一些关于陷阱的模糊警告，比如“小心**别名**（aliasing），它可能会降低你的优化效果”。这些备注会明确指出哪些优化被别名问题（例如）阻止了，以及发生在哪里。 因此，我期望在这次演讲结束时，你们都能知道如何获取优化备注，如何解读其中的一部分，以及如何利用这种理解在遇到错失的优化机会时采取行动。演讲的前 60% 将仅限于 Clang 领域，稍后我们会拓宽范围。</description></item><item><title>std::find() 是坏的</title><link>https://uni.bluepuni.com/archives/std-find-is-broken/</link><guid>https://uni.bluepuni.com/archives/std-find-is-broken/</guid><description>好的，非常欢迎大家来到 CppCon 2021 的最后一场会议。我没有什么要宣布的，但我有一件重要的事情要做，那就是我要感谢 Sean，他成为了我们这套摇头娃娃中第四个的模型。 谢谢你。非常感谢。 让我看看，我的麦克风开了吗？你们能听到我吗？</description></item><item><title>快速小巧 C++</title><link>https://uni.bluepuni.com/archives/fast-and-small-cpp/</link><guid>https://uni.bluepuni.com/archives/fast-and-small-cpp/</guid><description>好的。欢迎大家来到我的 CppCon 演讲：快速且小巧的 C++。看着这里的大屏幕，我本应该把它命名为“庞大的 C++”之类的。我是 [Triosphatic](https://www.cppinsights.io/) 的 Andreas Fertig。我是 C++ 培训师，在全球范围内提供远程或现场服务。如果你感兴趣，请联系我。我还是一个叫做 C++ Insights 的工具的作者。如果你还没听说过它，在这次演讲中你至少会看到一次。我是德国人。你们中的一些人可能从我的姓氏就能看出来。我的姓氏是一个非常常见的德语单词。在德语中是一个形容词。它翻译成英语是 finished, ready, complete 或 completed（完成、就绪、完整或已完成）。所以总的来说，我会说这是一个积极、美好的名字，对吧？通常在积极的句子中使用它。你也可以用它表示稍微不同的意思，比如“我累了，我筋疲力尽了”，这就是我今天的意思，因为我的身体还在和时差作斗争，所以此刻我感觉有点 fertig（精疲力尽）。而且因为我经常做演讲，我开始更多地研究我的姓氏，并收集相关的故事。我注意到的是，我们最近在巴黎举办...</description></item><item><title>快速的 uprobe</title><link>https://uni.bluepuni.com/archives/fast-uprobes/</link><guid>https://uni.bluepuni.com/archives/fast-uprobes/</guid><description>好的，是的，还是我，还在思科（Cisco）。所以这个演讲是关于更新uprobe加速情况的，包括加速的目标是什么以及实际的加速效果看起来如何。我将首先从高层描述uprobe实际上是什么样子，安装过程是怎样的，然后我会实际展示我正在尝试做些什么来加速它。 所以uprobe，用户空间探针（user space probe），基本上你有一个文件，接口是你拥有一个inode和一个文件偏移量，你把探针放在那里，当应用程序实际运行并经过那个点时，它会命中探针，并执行任何附加到探针上的东西，在我们的例子中是BPF程序。这也是实现用户空间跟踪点（USDTs）的方式。当你附加到USDT时，你实际上也是在用uprobe。这都非常依赖于架构。本次演讲只涉及x86。特此声明。 那么，当你想要安装uprobe时，实际情况是怎样的呢？正如我所说，你有inode和偏移量。所以你实际上需要用断点指令覆盖该指令。当然，你不是在文件本身中替换它，而是当你安装uprobe时，你会在所有进程中查找该地址被映射的所有实例。然后你进行安装，就在内存中。uprobe也有回调机制，当你实际为文件进行内存映射时。当你映射文件中实际包含断...</description></item><item><title>EROFS：过去、现在和未来</title><link>https://uni.bluepuni.com/archives/erofs-past-present-and-future/</link><guid>https://uni.bluepuni.com/archives/erofs-past-present-and-future/</guid><description>大家好。感谢大家来听我们的主题。我是来自阿里云的高翔。今天我将与我的同事汤天一一起详细讲解EROFS。我们之前可能在LSF和其他一些内核峰会上做过一些分享，但我想在开源峰会上也对EROFS做一个概括性的简述，抱歉，是详细的回顾。 首先，对于从未听说过EROFS的人，让我再次简要介绍一下EROFS文件系统。那么，什么是EROFS？EROFS代表**增强型只读文件系统 (Enhanced Read Only File System)**。它始于2017年下半年，自Linux内核4.4版本起正式可用。它的目标是一个现代化的、灵活的、高性能的、基于块的、内部不可变的文件系统，并且得到了高度的维护。它是基于块的，但又不完全是基于块设备的，因为我们有其他的访问方式，比如FS缓存。并且其上的数据是严格块对齐的，没有额外的数据移动和I/O放大。对于未压缩的数据，我们支持FS-DAX和直接I/O。虽然它很简单，但它不仅仅是一种格式。我们从内核开发者的角度，尽可能地利用了内核中的许多可能性。 因此，一个最小的核心用途具有以下特性，例如未编码的数据、内置的UUID和卷标、直接I/O、一些块重复、扩展属性、A...</description></item><item><title>函数 API 的隐藏开销</title><link>https://uni.bluepuni.com/archives/hidden-overhead-of-a-function-api/</link><guid>https://uni.bluepuni.com/archives/hidden-overhead-of-a-function-api/</guid><description>我在 Snap 从事增强现实工作。涉及各种领域，比如计算机视觉、机器学习、图形和移动设备上的实时渲染，全部使用 C++。所以如果你感兴趣，请来找我聊聊。正如你所想象的，为此我们非常关心性能。我还要向 Sergi Huralnik 和 Eduardo Madrid 表示衷心的感谢，我在 Snap 与他们共事非常愉快，他们在准备这次演讲时给了我极大的帮助，并且在这些主题上比我经验丰富得多。所以如果你有任何问题，我请你记住幻灯片编号。方便的是，这张幻灯片没有编号，但你会找到它的。请在演讲后提问，因为我们有很多内容要讲。但如果你想有时间，演讲结束后随时可以来找我，会议期间或是在 Discord 上都行。 正如 Tony Van Eerd 在 C++ Now 2023 上那句名言所说，人们写的函数还不够多。在那之前，在 Cpp North 2022、C++ Now 2021，还有这里的 CppCon 2017 上他也说过。你知道吗？人们仍然没有写足够多的函数。所以值得重复这一点。但当人们终于开始写函数时，我们更希望只得到那些设计良好的，对吧？否则 Tony 会不高兴的。本次演讲将聚焦于这部分，特...</description></item><item><title>并发计数，简单如一二三！</title><link>https://uni.bluepuni.com/archives/concurrent-counting-as-easy-as-1-2-3/</link><guid>https://uni.bluepuni.com/archives/concurrent-counting-as-easy-as-1-2-3/</guid><description>早上好。那么这次我们讲计数。上次我们讲的是硬件。如果我能把鼠标移到幻灯片上，我可能会……现在如果我能到这里。好了。这是去年的配方。去年我们按对了按钮，而不是像那次一样按错了。去年我们做了蓝色的前两行。今年我们要做一点绿色的部分。对于那些更喜欢英制单位的人，这就是了。现在，我们要快速回顾一下。快速回顾一下那些内容。我不会试图慢慢来，硬着头皮讲完。如果感到困惑或有疑问，我鼓励你们去看去年的录像。当然，随时提问。因为讨论更重要。然后我们会试着慢慢来，硬着头皮讲完。因为讨论比我讲完一堆固定的幻灯片更重要。好的。分发。谢谢，安妮，你的妙语（法语：merci, Anne, pour le bon mot）。我们要把这些发下去。分发的原因是，我们需要在结束时了解你们是否真的从这次演示中学到了东西。好的。想吃的话你们可以吃掉它们。那可能会对评估造成误差。当然，你们也可以留着包装纸那样做。但我会让你们自己判断。总之，这些伙计们会分发下去。我会在他们分发时继续讲，因为这或多或少是回顾。 那么，物理定律是什么？我小时候可不会相信这个。但事实是，对于计算而言，**原子特么太大了**。我的意思是，它们大得不方便...</description></item><item><title>追捕海森堡错误</title><link>https://uni.bluepuni.com/archives/hunting-heisenbugs/</link><guid>https://uni.bluepuni.com/archives/hunting-heisenbugs/</guid><description>我们今天来谈谈如何捕猎海森堡 bug (Heisenbugs)。这有点像是软件工程领域的印象派画派，因为无论是印象派画作还是海森堡 bug，你靠得越近，反而看得越不清楚。对于印象派画作来说，这或许是其创作意图；但对于海森堡 bug 而言，这通常被认为是一个问题。所以，今天我们将来探讨解决这个问题的方法。现在，这仍然更像是一门艺术而非科学，但我们至少可以掌握一些可能对你有帮助的技巧。 好了，我们将讨论几个主题。当然，最后有一个非常重要的话题：捕猎海森堡 bug 固然很棒，但能避免它们则更胜一筹。在我人生的某个阶段，大约 30 年前，海森堡 bug 曾是那种可怕的、足以改变人生的经历。但过了一段时间，你也就习惯了，心态变成了：“好吧，今天是星期二，我们又遇上什么海森堡 bug 了？” ### 大规模集群的优势</description></item><item><title>Linux 是如何使用我的内存的？</title><link>https://uni.bluepuni.com/archives/how-is-linux-using-my-ram/</link><guid>https://uni.bluepuni.com/archives/how-is-linux-using-my-ram/</guid><description>这是我去年为 Kernel Recipes 会议（一个面向更多新手的会议）最初创建的演讲。所以我猜我解释的一些事情你们可能已经熟悉了，但我希望其中会有很多关于一些我之前从未检查过的晦涩事物的内容，了解它们的历史，然后变得沮丧为什么它是这样的以及为什么它不能再被改变了。我们今天也会看到一些这样的例子。而且这个主题也契合我们早上讨论的可观测性主题，我们还会看到一些例子，说明为什么可观测性会很好，但（实现更好的可观测性）在性能上会变得不可接受（prohibitive）。 所以，我们将讨论在 Linux 中，内存是在内核层面和进程层面是如何被使用的。我们将从每个人都知道的非常基础的概览命令开始，那就是 `free`。如今，它会显示这些类型的值。我认为它们之前被扩展过，有些列以前是不存在的。嗯，我们可能会尝试思考这些值背后是什么，即使我们没有检查源代码，只是尝试做一些简单的数学运算，看看是否都合理。然后我们突然发现，如果我们尝试将 `used` 加上 `free`，我们得到的值大约是 1900，但总内存几乎是 32 GB。所以，即使是这么简单的比较看起来也不合理。是的，所以 `used` 加 `...</description></item><item><title>你以为你会哈希？</title><link>https://uni.bluepuni.com/archives/so-you-think-you-can-hash/</link><guid>https://uni.bluepuni.com/archives/so-you-think-you-can-hash/</guid><description>我们要讨论哈希（hashing），哈希一切。 哦，必讲的幻灯片。这是我过去“造成过一些破坏”的地方。如果你认出其中一些Logo，我很抱歉。还有联系我、关注我的方式等等。就是那些常规的东西。好的。那么，一点背景和动机。哈希，我认为大家都会同意，尤其是如果你走进了这个房间，它是我们使用数据结构进行存储、检索、查询、搜索等等工作的重要组成部分。用于自定义类型的索引，以及我们构建的各种聚合、索引、数据库、查找表等等。所以它是我们日常活动的重要组成部分。哦，来了？好的。那么，我们将尝试探讨我们希望从这些东西、从哈希函数中获得的一些属性。我们寻找哪些保证？一些良好的特性。我们如何定制这些东西？我们如何提高构建此类设施的易用性（ergonomics）？当然，还要保持一切高性能和良好。所以我将提到过去七年，也许更久，现在八年了，在C++委员会中涌现的一些正在进行中的论文和提案。我会提到一大堆。当然，今天演讲的大部分内容是由其中一些研究工作推动的。但我不打算深入那些提案更复杂方面的“雷区”，那些棘手的部分。我确实有所有这些提案的链接，所以你们可以随意浏览查看。如果你过来找我并想讨论具体细节，我会非常感激...</description></item><item><title>应用程序能从 fsync 故障中恢复吗？</title><link>https://uni.bluepuni.com/archives/can-applications-recover-from-fsync-failures/</link><guid>https://uni.bluepuni.com/archives/can-applications-recover-from-fsync-failures/</guid><description>**摘要** 我们分析了文件系统和现代数据密集型应用程序如何应对 fsync 故障。首先，我们描述了三种 Linux 文件系统（ext4、XFS、Btrfs）在出现故障时的行为。我们发现文件系统之间存在共性（页面总是被标记为干净，某些块写入总是导致不可用），也存在差异（页面内容和故障报告方式各异）。接着，我们研究了五种广泛使用的应用程序（PostgreSQL、LMDB、LevelDB、SQLite、Redis）如何处理 fsync 故障。我们的研究结果表明，尽管应用程序使用了许多故障处理策略，但没有一个是充分的：fsync 故障可能导致灾难性后果，如数据丢失和损坏。我们的发现对旨在提供强持久性保证的文件系统和应用程序的设计具有重要影响。 ## 1 引言</description></item><item><title>C++ 调度技术深度解析</title><link>https://uni.bluepuni.com/archives/a-deep-dive-into-dispatching-techniques-in-cpp/</link><guid>https://uni.bluepuni.com/archives/a-deep-dive-into-dispatching-techniques-in-cpp/</guid><description>好的，太好了。那么，欢迎来到我的演讲。我希望大家享受这次大会。能再次回到阿斯彭（Aspen）真的非常棒。 这是一场关于性能的演讲。因此，我需要先做一个免责声明。**在没有先运行你自己的基准测试之前，永远不要进行任何优化。** 特别是，你不应该仅仅因为某人告诉你某个方法很快就去实现它。我所有的基准测试都是在一台 2020 年的 Apple Mac Mini 上运行的，操作系统是 Asahi Linux，编译器是 Clang 14，这很可能不是你所针对的目标平台。所以，不要直接复制我的任何基准测试结果。 在演讲期间，随时可以提问，但如果你有任何评论，请留到最后。我为了营造一些戏剧性效果，会做一些有点奇怪的事情，所以请把评论留到最后，到时候问题可能会自行解决。</description></item><item><title>程序员应该了解的内存分配知识</title><link>https://uni.bluepuni.com/archives/what-programmers-should-know-about-memory-allocation/</link><guid>https://uni.bluepuni.com/archives/what-programmers-should-know-about-memory-allocation/</guid><description>大家好。今天我们要讨论内存分配，以及我们认为每个程序员都应该了解的内容。特别是，我们将分享过去15年使用通用分配器（如 `malloc`）的经验教训，设计自定义分配器的经验，以及我们帮助修复的内存管理错误。我是 Sami Albahra，一家名为 Bactris 的公司的联合创始人，我们致力于构建调试技术。但除此之外，我职业生涯的大部分时间都在不同地方从事性能和可靠性工作，并作为乔治华盛顿大学高性能计算实验室的一部分在学术界工作。和我一起的是 Hannes 和 Paul。 大家好，我是 Hannes。我和 Sami 一起在 Bactrace 从事调试工具链的工作。我在网络方面有很多背景，之前从事过 Linux 内核栈的工作，过去一段时间也在不同语言之间切换了很多。 嗨，我是 Paul Kwong。我曾在 Google 和 Nexus 工作。现在我在其他地方工作。在我的业余时间，我也参与 Steel Bank Common Lisp（SBCL）的开发。我实际上是个 Lisp 程序员。在 Concur 和 Cicad 工作时，我就是这样认识 Sami 的。</description></item><item><title>解开 RCU 使用之谜（额外用例）</title><link>https://uni.bluepuni.com/archives/unraveling-rcu-usage-mysteries-additional-use-cases/</link><guid>https://uni.bluepuni.com/archives/unraveling-rcu-usage-mysteries-additional-use-cases/</guid><description>所以我们今天要讨论的是... 所以今天我们要讨论的是用额外的用例来解开RCU使用之谜。这是对去年12月7日那次演讲的后续。这就是我们今天要做的内容。我们会非常快速地回顾上次的演讲内容。我们会查看用例，并深入探讨其中一些。快速回顾一下，页面底部的URL是上次演讲的链接，如果你想回去再看一遍的话。 但首先，从核心问题说起，这导致了RCU以及那里提到的风险指针（hazard pointers），核心问题是全局达成一致的成本高昂。让所有CPU、所有线程、所有东西就某事达成一致需要时间。这是由于光速的有限性。另一个事实是，虽然项目非常小，但它们的尺寸并非为零。正如我去年12月说的，如果50年前有人告诉我，我会说光速太慢，原子太大——不是为了太空旅行，而是为了计算——我不知道我当时会说什么，但我保证我不会相信你。但今天，我就站在这里这么说。 所以解决这个问题的方法是，我们同时使用空间同步和时间同步。读-写锁严格使用时间同步。我们要在此基础上加入空间同步。RCU是实现这一点的一种方式。同样，风险指针是另一种方式。所以这里我们快速过一下它是如何工作的。</description></item><item><title>在 Linux 系统中查找延迟来源</title><link>https://uni.bluepuni.com/archives/finding-sources-of-latency-on-your-linux-system/</link><guid>https://uni.bluepuni.com/archives/finding-sources-of-latency-on-your-linux-system/</guid><description>大家好，我是 Steve Rostedt。我是 VMware 的一名开源工程师。我也是 Linux 内核开发者，并且是 Linux 内核中跟踪子系统（即 Ftrace）的维护者。我也是稳定实时树（stable real-time tree）的维护者。今天，我将讨论如何在您的 Linux 系统上查找延迟的来源。那么，我们开始吧。再次说明一下，我是 VMware 的员工，如果您想了解更多关于我们的信息，可以在 Twitter 上查看 @vmw.opensource，以及在 VMware.com 和开源博客上查看我们。 首先，我要问的是，什么是延迟？既然我要谈论查找延迟的来源，让我们先给它一个定义。如果您在维基百科上查找，它会告诉您延迟是“刺激与末端响应之间的时间间隔”，或者从更一般的角度来看，是“所观察系统中某个物理变化的原因与其效应之间的时间延迟”。好吧。可能很多人还在挠头，想知道延迟的确切定义到底是什么。所以简单来说，我将其简单地称为“事件预期发生的时间与实际发生的时间之间的间隔”。举个简单的例子：每天早上您醒来时，比如说闹钟响了，这很烦人，但那是您预期醒来的时间。然后，到您按下闹钟的...</description></item><item><title>不完美世界中的完美哈希</title><link>https://uni.bluepuni.com/archives/perfect-hashing-in-an-imperfect-world/</link><guid>https://uni.bluepuni.com/archives/perfect-hashing-in-an-imperfect-world/</guid><description>在开场时我说过这是我们的第八届会议。现在，有一个人参加了每一届会议并做了演讲，这个人就是Joaquin。所以他是Boost的长期贡献者，对我来说，他也是包括数据结构在内的许多领域的专家。所以Joaquin今天要讲的是哈希。完美哈希。完美！做到完美很重要。那么我就把时间交给Joaquin。Joaquin，非常感谢你再次为会议和C++社区做出贡献。谢谢。谢谢。 我们将要讨论完美哈希（perfect hashing）。首先，你们中有多少人知道常规哈希表是如何工作的？是的。大多数人都知道。所以你有一定数量的元素要插入到表中，还有一个哈希函数将每个元素映射成一个哈希值。通常是一个很大的整数，比如64位宽之类的。然后，你以某种方式将这些哈希值投影或缩减到一个所谓的桶数组（bucket array）的索引中。好的。元素数量除以桶数组的数量，我们称之为负载因子（load factor）。就是这样。这就是哈希表的工作原理。如果哈希函数表现相当好，那么元素将在桶数组中均匀分布。但很多时候。实际上我们会看到，大多数时候你会遇到冲突，即两个或更多元素被映射到同一个桶中。在示例中你可以看到。哦，抱歉。我该怎么切...</description></item><item><title>不仅仅是 rehash</title><link>https://uni.bluepuni.com/archives/more-than-a-rehash/</link><guid>https://uni.bluepuni.com/archives/more-than-a-rehash/</guid><description>下一位演讲者是华金·洛佩斯（Joaquín López）。我想经过七届会议，唯一一位在这里演讲过七次的演讲者就是华金。所以，华金，再次感谢你来到这里。同时，也感谢你今年在 Boost 中的工作，尝试为容器提供新的解决方案并努力让它们更快。所以，嗯，我非常感兴趣。 好的，谢谢邀请我。好的，你们能听清楚我吗？我喜欢在讲台上走动，但我们麦克风有点问题，所以我会尽量待在讲台后面。但我倾向于走开，等等。所以如果你们听不清楚，请告诉我，好吗？ 那么，我想和你们一起探索我们在 Boost 中开发的一个全新的 HashMap。名字叫 Boost Unordered FlatMap。这个容器使用了一些最先进的技术，这些技术并非由我们首创，但它也引入了一些新的概念、一些新的创新，我认为你们可能会觉得了解这些很有趣。所以，它不仅仅是现有技术的简单重做（rehash），好吗？</description></item><item><title>Zoned NameSpaces：将区域引入 NVMe SSD</title><link>https://uni.bluepuni.com/archives/zoned-namespaces-bringing-zones-to-nvme-ssds/</link><guid>https://uni.bluepuni.com/archives/zoned-namespaces-bringing-zones-to-nvme-ssds/</guid><description>大家好，欢迎参加本次演讲，“**Zone Namespaces**：为NVMe SSD引入分区”。我是Arvind Ramesh，西部数据研究院的首席工程师。那么，今天我将涵盖**NVMe ZNS概述**、**分区设备（Zoned Devices）简介**、什么是**分区命名空间（Zoned Namespace）**和**NVMe ZNS规范**、**TP4053概述**、**分区存储语义（Zoned Storage Semantics）**和**分区命名空间命令集（Zone Namespace Command Set）**的简要特性、**ZNS优势**、**挑战**、**用例**、**F2FS用例**和**软件栈当前状态**、**软件栈未来预期工作**。这是议程。 是的，那么先简要介绍一下，**ZNS设备是分区块设备（zoned block devices）的一个子集**。而**分区块设备**通常指的是那些将介质以**分区（zones）**形式暴露出来的设备。**分区**不过是该介质内的逻辑实体。我们有**SMR设备**，它们是分区设备，但它们是硬盘，是**单磁记录设备**。因此这些...</description></item><item><title>适用于小型固件的 C++ 异常处理</title><link>https://uni.bluepuni.com/archives/cpp-exceptions-for-smaller-firmware/</link><guid>https://uni.bluepuni.com/archives/cpp-exceptions-for-smaller-firmware/</guid><description>所以，各位，我想教大家如何通过使用 C++ 异常来使你的二进制文件更小。首先，简单介绍一下我自己。如果你在某个地方看到过 Campsy 这个名字，那很可能就是我。我几乎在所有地方都使用这个用户名。关于我自己，我 2017 年毕业于圣何塞州立大学。我是前谷歌员工。我参与过几个你可能听说过的产品。初代 Google Pixel Watch。我是触觉反馈、引导加载程序、扬声器和麦克风的直接责任工程师。最终，当我厌倦了那个工作后，我转到了 Google Pixel Buds 团队，从事代码优化工作，以便我们能在设备中塞进更多功能和错误修复。我也是圣何塞州立大学的志愿者，主要帮助那里的机器人团队。从去年开始，我还是 ISO C++ 的成员。 在我们深入之前，我想先谈谈这次演讲的动机，以及我是如何走到这一步的。大约六年前，我在教授一门叫“计算机工程 146”的课程。这是嵌入式系统导论。在这门课上，我为我的学生开发了一个固件框架。它是用 C++ 写的。我们尽可能地遵循 C++ 核心准则。顺便提一下，这是我为我的学生设计和使用的开发板。 我教给我的学生的第一件事是，当你为微控制器开发并进行裸机开发时，...</description></item></channel></rss>