阅读视图

发现新文章,点击刷新页面。
🔲 ☆

下半年的每一场消费电子发布会,都是坏消息

2026 年才过去四分之一,消费电子行业就已经被地震给震麻了。

原因也很简单:AI 狂潮导致的涨价——还不是单纯的内存涨价,而是全领域、全行业、全链路的「电子零部件」涨价。

别看你现在 AI 用得欢,今天消耗的每千个词元(token),都是射向半年后你买手机或者电脑时钱包的子弹。

内存显卡涨,CPU 也要涨

对于 PC 玩家来说,「9950X3D」是个相当让人兴奋的名字,它代表了目前市面上最强悍的游戏 CPU。

就在昨夜,AMD 为这个原本就闪着金光的招牌又添了一把柴,为我们带来了最新的 Ryzen 9 9950X3D2 Dual Edition:

▲ 图|AMD

字如其名,R9 9950X3D2 带来了期盼已久的双 3D V-Cache 堆栈技术

在保持原本多核心、多线程、高频率、全解锁的优点的同时,一举将 L2+L3 缓存推高到了 208MB。

从规格上看,R9 9950X3D2 是颗字面意义上的「鸡血版」CPU,在原本的游戏优势场景之外,也为内容创作和软件开发带来了不小的提升。

▲ 图|AMD

问题是,AMD 打算收多少钱?

上一代 R9 9950X3D 的官方价为 699 美元(约合 4830 元人民币),9950X3D2 尽管尚未公布价格,但普遍预估价格会来到 799 美元(约合 5520 元人民币)——

甚至都够买 48GB 的内存条了。

更惨的是,这种价格趋势不只限于新 CPU,现有货架产品也逃不了。

根据《日经亚洲》的报道,英特尔已经在上周通知客户,将会对现有 CPU 产品进行提价,业内指出 AMD 也会跟进提价,整体涨幅在 15% 左右。

▲ 图|Intel

原因自然是老生常谈:英特尔和 AMD 将产能转移到利润更高的企业级服务器 CPU 上,消费级 CPU 只能一边减产一边涨价。

这还只是 x86 领域,在 ARM 架构这边,2026 年中和下半年的状况同样不容乐观。

开年以来 ARM 架构最重要的新闻,莫过于原本只进行设计授权业务的 ARM 公司,也要进军实业、开始自己造 CPU 了。

作为成立 36 年以来最重大的转型,ARM 前两天推出了其首款自研芯片「ARM AGI CPU」。

这是一款专门为 AI 数据中心设计的处理器,核心目标是支持「代理式 AI」(agentic AI)应用:

▲ 图|ARM

根据 ARM 介绍,这款处理器是与 Meta 深度合作设计的,由子公司 Ampere 开发,基于台积电 3nm 工艺制造,计划在今年下半年进入量产阶段。

虽然这个消息对于 ARM 来说很好,对于消费者来说却算不上什么好消息——

此举标志着 ARM 不再仅仅是「设计局」,而是正式下场与英特尔、AMD 甚至它自己的授权客户(英伟达、亚马逊等等)争夺 AI 数据中心硬件市场的蛋糕。

▲ 图|ARM Newsroom

一旦 ARM 尝过癫狂的 2B 业务红利之后,未来是否会将业务重心全部转移到设计服务器 CPU 上、放弃公版消费级产品设计?

这些都是说不好的。

至于 ARM 的最大用户高通,2026 年的日子也不太平稳。

近日,有关高通下一代旗舰 SoC 骁龙 8 Elite Gen 6 的爆料频出,各家信源达成了两个共识:

  • 骁龙 8 Elite Gen 6 预计会分为标准版(SM8950)和 Pro 版(SM8975)
  • 两者均采用台积电 2nm 工艺制造,Pro 版 GPU 稍强,并且涨价幅度更狠

▲ 图|Wccftech

是的,坏消息还没有结束。

业内人士预估:上述骁龙 8 Elite Gen 6 系列两款 SoC 都将迎来一波大涨。

相比 8 Elite Gen 5 的 280 美元(约合 1934 元人民币)采购单价,Gen 6 的采购价预计会上涨 30% – 50% 。

这还只是手机厂商的采购单价,相同的涨幅传递到消费者身上,再叠加一些其他成本,下半年的手机平均涨幅可能会来到 1500 甚至 2000 元左右——

这么比较下来,前两天被大家口诛笔伐的一加 15T 的涨价幅度似乎也没有那么离谱了。

根据最新的研报数据,截至 2026 年第一季度,同规格的内存同比涨价幅度已经来到了约 400% ,16+512GB 存储组合的采购报价接近 200 美元。

在一些非旗舰机型上,稍不留意就会出现「内存比处理器还贵」的情况。

从前量大管饱、薄利多销的模式如今已经彻底走不通了。

同时,类似的全行业价格震荡也传递到了电脑和手机之外的领域——

彭博社日前报道:任天堂已经决定将 2026 年第一季度的 Switch 2 产量从原本规划的 600 万台下调至 400 万台,且减产可能会延续到第二季度。

▲ 图|彭博社

Switch 2 减产的原因除了 2025 年底购物季的销量表现不达预期之外,生产成本也是原因之一。

就拿最近的《耀西与不可思议图鉴》来说,在任天堂 eShop 购买的价格为 59.99 美元(约合 414 元人民币),但想要实体卡带,则必须再加 10 美元:

▲ 图|IGN

所以别说蚊子腿上不算肉了,在这个慢速 TF 卡都在涨价的时候,Switch 2 的卡带也是要算钱的。

好巧不巧的是,就在本文撰稿期间,索尼也宣布了对 PS5 系列产品的涨价。

这是继去年 8 月 PS5 普涨 50 美元之后的又一次抬价。本轮调整之后,PS5 标准版和数字版涨价 100 美元:

▲ 图|IGN

号称「买 SSD 送主机」的 PS5 Pro 则涨价 150 美元,来到了 900 美元起——

是啊,原因依然是「全球经济形势」。

涨价危机真的有尽头吗

坏消息是,似乎没有。

如果你关注了前几天的股市,就肯定不会错过这么一条消息:

3 月 24 日,谷歌公布了一篇关于全新量化算法 TurboQuant 的技术博客,引得包括闪迪、美光在内的存储股迎来了一波闪跌。

作为一项突破性的「低比特量化」算法方案,TurboQuant 旨在优化解决矢量量化中存在的「内存开销」难题,在不损失精度的前提下减小模型的体积。

用人话说就是:TurboQuant 算法将原本 AI 模型存储信息的「向量」(vectors)从三维坐标表示换成了极坐标表示,让存储上下文的 KV cache 体积急剧缩小,内存占用也大大减少。

▲ 图|Google Research

TurboQuant 之后,算法进步、模型变小、内存降价、生活回归正常……听着多么顺耳。

但现实世界不是这样运行的。

尽管 TurboQuant 的压缩率和精度经过了实验验证,它解决的依然只是推理(Inference)阶段的显存瓶颈,模型训练阶段的显存消耗依然是一座大山。

恰恰是厂商需要天量的内存来训练模型,才导致普通人买不到内存的,TurboQuant 在这一层面上无能为力。

▲ 图|Keymakr

另一方面,即使 TurboQuant 真的把内存价格替家人们打下来了,我们也会面临新一轮的杰文斯悖论(Jevon’s paradox):

内存利用率变高,内存降价,更多人可以买得到内存,大家都开始买内存,导致整体内存需求量不减反增。

最后的最后,TurboQuant 不仅距离正式发布还有一段时间,它本身的热度也来得很突兀——

相关基础论文早在去年 4 月就已经发表,却直到 2026 年才引起波澜。

这就让 TurboQuant 导致的股市波动更像是带着「天下苦内存厂商久矣」的市场情绪爆发,而不是真的技术投产,很难真的让存储价格下降。

▲ 图|ComputerBase

换言之:这不是结束,甚至不是结束的开始(Now this is not the end, it is not even the beginning of the end)。

对于最普遍的广大消费者们,无论是 ARM 造 CPU,还是谷歌发布新算法,都很难和我们直接产生关联。

▲ 图|澎湃新闻

反之,爱范儿从某头部国产手机厂商负责人处获悉:

行业期待 Q3 内存价格会回归理性,但如今存储采购周期急剧缩短,价格一天一变,最新的情况是,上涨将会持续到 Q3 Q4 甚至明年,不用担心会降下来

我们在 2026 年需要做的,就是明确自己的需求,该等就等、该买就买,千万不能过度纠结。

「等等党」们距离真正重见天日的距离,或许比我们想象的都要远。

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

🔲 ⭐

Intel Redwood Cove 微架构评测

Intel Redwood Cove 微架构评测

背景

之前我们测试了 Intel 的微架构 Redwood Cove,这次就来测一下 Redwood Cove,它被用到了 Meteor Lake 以及 Granite Rapids 上。这次就以阿里云 g9i 实例的 Granite Rapids 机器来测试一下 Redwood Cove 微架构的各项指标。

官方信息

Intel 关于 Redwood Cove 微架构有这些官方的信息:

现有评测

网上已经有较多针对 Redwood Cove 微架构的评测和分析,建议阅读:

下面分各个模块分别记录官方提供的信息,以及实测的结果。读者可以对照已有的第三方评测理解。官方信息与实测结果一致的数据会加粗。

Benchmark

Intel Redwood Cove 的性能测试结果见 SPEC

前端

L1 ICache

官方信息:

  • Larger instruction cache: 32K→64K.

为了测试 L1 ICache 容量,构造一个具有巨大指令 footprint 的循环,由大量的 4 字节 nop 和最后的分支指令组成。观察在不同 footprint 大小下的 IPC:

可以看到 footprint 在 64 KB 之前时可以达到 6 IPC,之后则降到 3.2 IPC,这里的 64 KB 就对应了 L1 ICache 的容量。容量相比 Golden Cove 翻倍,终于和 ARM 看齐。

L1 ITLB

构造一系列的 jmp 指令,使得 jmp 指令分布在不同的 page 上,使得 ITLB 成为瓶颈:

可以看到 256 个 Page 出现了明显的拐点,对应的就是 256 的 L1 ITLB 容量。注意要避免 ICache 和 BTB 的容量成为瓶颈,把 jmp 指令分布在不同的 Cache Line 和 BTB entry 上。

超过 256 个 Page 以后,如图有周期数突然下降后缓慢上升的情况(例如横坐标 288->289、320->321、352->353、384->385 等,以 32 为周期),背后的原理需要进一步分析,猜测和 Linux 的 Huge Page 机制相关。

Redwood Cove 的 L1 ITLB 容量和 Golden Cove 是一样的。

Instruction Decode Queue (IDQ) + Loop Stream Detector (LSD)

官方信息:

  • Improved LSD coverage: the IDQ can hold 192 μops per logical processor in single-thread mode or 96 μops per thread when SMT is active.

为了测试 Instruction Decode Queue 的大小,构造不同大小的循环,循环体是复制若干份的 inc %rsi 指令,最后是 dec + jnz 作为循环结尾,通过 LSD.UOPS 性能计数器统计每次循环有多少个 UOP 来自于 Loop Stream Detector 机制,发现其最大值为 191,说明 Redwood Cove 的 Loop Stream Detector 可以识别最多 191 个 uop 的循环。此时每个循环要执行 192 条指令,最后的 dec + jnz 被融合成了一个 uop。相比 Golden Cove 的 144 uops IDQ 容量有所增加。

循环体中,如果用 nop 指令来填充,会得到 39 左右的比 192 小得多的容量,猜测是进入了低功耗模式。

Instruction Prefetch Instruction

官方信息:

  • Code Software Prefetch x86 architecture extension (Granite Rapids only).
  • PREFETCHIT0: (temporal code)—prefetch code into all levels of the cache hierarchy.
  • PREFETCHIT1: (temporal code with respect to first level cache misses)—prefetch code into all but the first-level of the cache hierarchy.

Conditional Branch Predictor

参考 Half&Half: Demystifying Intel’s Directional Branch Predictors for Fast, Secure Partitioned Execution 论文的方法,可以测出 Redwood Cove 的分支预测器采用的历史更新方式为:

  1. 使用 388 位的 Path History Register,每次执行 taken branch 时更新
  2. 更新方式为:PHRnew = (PHRold << 2) xor footprint
  3. footprint 共有 16 位,其中 B 代表分支指令的地址,T 代表分支跳转的目的地址:
    • footprint[0] = B[3] xor T[0]
    • footprint[1] = B[4] xor T[1]
    • footprint[2] = B[5]
    • footprint[3] = B[6]
    • footprint[4] = B[7]
    • footprint[5] = B[8]
    • footprint[6] = B[9]
    • footprint[7] = B[10]
    • footprint[8] = B[0] xor T[2]
    • footprint[9] = B[1] xor T[3]
    • footprint[10] = B[2] xor T[4]
    • footprint[11] = B[11] xor T[5]
    • footprint[12] = B[12]
    • footprint[13] = B[13]
    • footprint[14] = B[14]
    • footprint[15] = B[15]

Golden Cove 是一样的。各厂商处理器的 PHR 更新规则见 jiegec/cpu

后端

L1 DCache

构造不同大小 footprint 的 pointer chasing 链,测试不同 footprint 下每条 load 指令耗费的时间:

  • 0KB-48KB: 5 cycle,对应 L1 DCache
  • 48KB-384KB: 16 cycle,对应 L2 Cache,且命中了 L1 DTLB;说明 L1 miss L2 hit 带来了 11 cycle 的损失

L1 DCache 大小和 Golden Cove 相同。

L1 DTLB

用类似测 L1 DCache 的方法测试 L1 DTLB 容量,只不过这次 pointer chasing 链的指针分布在不同的 page 上,使得 DTLB 成为瓶颈:

可以看到 96 Page 出现了明显的拐点,对应的就是 96 的 L1 DTLB 容量。没有超出 L1 DTLB 容量前,Load to use latency 是 5 cycle;超出 L1 DTLB 容量后,Load to use latency 是 12 cycle,说明 L1 DTLB miss 带来了 7 cycle 的损失。

L1 DTLB 大小和 Golden Cove 相同。

执行单元

官方信息:

  • EXE: 3-cycle Floating Point multiplication.

LSU

Load Store 带宽

针对 Load Store 带宽,实测每个周期可以完成:

  • 3x 256b Load
  • 2x 256b Load + 2x 256b Store
  • 1x 256b Load + 2x 256b Store
  • 2x 256b Store
  • 2x 512b Load
  • 1x 512b Load + 1x 512b Store
  • 1x 512b Store

Store to Load Forwarding

经过实际测试,Redwood Cove 上如下的情况可以成功转发,对地址 x 的 Store 转发到对地址 y 的 Load 成功时 y-x 的取值范围:

Store\Load 8b Load 16b Load 32b Load 64b Load
8b Store {0} {} {} {}
16b Store [0,1] {0} {} {}
32b Store [0,3] [0,2] {0} {}
64b Store [0,7] [0,6] [0,4] {0}

可以看到,Redwood Cove 在 Store 完全包含 Load 的情况下都可以转发,没有额外的对齐要求。但当 Load 和 Store 只有部分重合时,就无法转发。两个连续的 32 位的 Store 和一个 64 位的 Load 重合也不能转发。

特别地,在 y=x 且不跨越缓存行边界且满足下列要求的情况下,Store Forwarding 不会或只带来很小的性能损失:

  • 8b Store -> 8b Load
  • 32b Store -> 8b Load
  • 64b Store -> 8b Load
  • 32b Store -> 32b Load
  • 64b Store -> 32b Load
  • 64b Store -> 64b Load

考虑到 y 必须等于 x,也就是地址要一样,猜测 Redwood Cove 使用了类似 Memory Renaming 的技术来实现这个效果。如果是连续两个对同一个地址的 Store 对一个 Load 的转发,效果和只有一个 Store 是一样的。

除了上述情况以外,Store Forwarding 成功时的延迟在 5 个周期,失败则要 19 个周期。

Golden Cove 是一样的。

小结:Redwood Cove 的 Store to Load Forwarding:

  • 1 ld + 1 st: 要求 st 包含 ld,特别地,地址相同时,性能最好
  • 1 ld + 2+ st: 不支持

Prefetcher

官方信息:

  • New HW data prefetcher to recognize and prefetch the “Array of Pointers” pattern.

Intel Redwood Cove 的处理器通过 MSR 1A4H 可以配置各个预取器(来源:Software Developers Manual,Additional MSRs Supported by the Intel® Core™ Ultra 7 Processors Supporting Performance Hybrid Architecture):

  • MSR_1A4H[0]: the L2 hardware prefetcher, which fetches additional lines of code or data into the L2 cache.
  • MSR_1A4H[1]: the L2 adjacent cache line prefetcher, which fetches the cache line that comprises a cache line pair (128 bytes). 这和 AMD 的 Up/Down Prefetcher 应该是一个意思
  • MSR_1A4H[2]: the L1 data cache prefetcher, which fetches the next cache line into L1 data cache. 这个应该属于 Next Line Prefetcher
  • MSR_1A4H[3]: the L1 data cache IP prefetcher, which uses sequential load history (based on instruction pointer of previous loads) to determine whether to prefetch additional lines.
  • MSR_1A4H[4]: Next page prefetcher,当访问快走到一个页的结尾的时候,从下一个页的开头开始 prefetch,提前进行可能的 TLB refill
  • MSR_1A4H[5]: the L2 Adaptive Multipath Probability (AMP) prefetcher. 这个应该属于 Spatial Prefetcher
  • MSR_1A4H[6]: LLC page prefetcher,类似 Next page prefetcher 的思路,但是把虚拟地址上连续的两个 4KB 的页,一共 8KB 的数据预取到 LLC 缓存上
  • MSR_1A4H[7]: Array of pointers prefetcher,针对指针数组 T *arr[] 的场景进行预取
  • MSR_1A4H[8]: Stream prefetch code fetch

ReOrder Buffer

为了测试 ROB 的大小,设计了一个循环,循环开始和结束是长延迟的 long latency load。中间是若干条 NOP 指令,当 NOP 指令比较少时,循环的时候取决于 load 指令的时间;当 NOP 指令数量过多,填满了 ROB 以后,就会导致 ROB 无法保存循环末尾的 load 指令,性能出现下降。测试结果如下:

当 NOP 数量达到 512 时,性能开始急剧下滑,说明 Redwood Cove 的 ROB 大小是 512。这和 Golden Cove 是一样的。

总结

Redwood Cove 相比 Golden Cove 是比较小的一个迭代,更新的部分主要有:

  1. 扩大了 L1 ICache 容量
  2. 扩大了分支预测器的容量(通过 MPKI 看出)
  3. 增加了更多预取器

因此性能提升也比较小,希望 Intel 可以更加给力一些,给 AMD 一些竞争压力。

🔲 ☆

Intel Golden Cove 微架构评测

Intel Golden Cove 微架构评测

背景

前段时间测试了 AMD/Apple/Qualcomm/ARM 的处理器的微架构,自然不能漏了 Intel。虽然 Intel 已经出了 Redwood Cove 和 Lion Cove,但手上没有设备,而且 Golden Cove 也是“相对比较成功”(“缩缸的是 Raptor Cove,和我 Golden Cove 有什么关系,虽然其实 Raptor Cove 是 Golden Cove Refresh”)的一代微架构,用在了 Alder Lake 和 Sapphire Rapids 上,因此就来分析它,后续有机会也会分析一下对应的 E 核架构 Gracemont。

官方信息

Intel 关于 Golden Cove 微架构有这些官方的信息:

现有评测

网上已经有较多针对 Golden Cove 微架构的评测和分析,建议阅读:

下面分各个模块分别记录官方提供的信息,以及实测的结果。读者可以对照已有的第三方评测理解。官方信息与实测结果一致的数据会加粗。

Benchmark

Intel Golden Cove 的性能测试结果见 SPEC

前端

Fetch

官方信息:

  • Legacy decode pipeline fetch bandwidth is increased from 16 to 32 bytes/cycle

Decode

官方信息:

  • The number of decoders is increased from 4 to 6

DSB/uOP Cache

官方信息:

  • The micro-op cache size is increased to hold 4,000 (注:应该是 4096) micro-ops,
  • and its bandwidth is increased to deliver up to 8 micro-ops per cycle.

Intel 的 uOP(Micro-OP) Cache 称为 Decode Stream Buffer (DSB): Decode Stream Buffer (DSB) is a Uop-cache that holds translations of previously fetched instructions that were decoded by the legacy x86 decode pipeline (MITE).

uOP Cache 的组织方式通常是组相连,每个 entry 保存了几条 uOP,这些 uOP 对应了原来指令流中连续的几条指令。

为了测试 uOP Cache 的大小,构造不同大小的循环,循环体是复制若干份的 add %%rsi, %%rdx 指令,最后是 dec + jnz 作为循环结尾,通过 IDQ.DSB_UOPS 性能计数器统计每次循环有多少个 uOP 来自于 DSB 也就是 uOP Cache,发现其最大值为 2800 左右,距离 4K 还有一定的距离。目前还没有找到一个可以稳定跑出 4K uOP 的指令模式,不知道遇到了什么瓶颈。

考虑到 taken branch 在典型的 uOP Cache 设计中会结束一个 entry,把循环体改成若干条 jmp 指令,并且每个 64B 缓存行只有一条 jmp 指令,此时每个 uOP entry 只记录一条 jmp 指令。观察到每次循环最多 512 个 uOP 来自 uOP Cache,那么 Golden Cove 的 uOP Cache 大概就是 512 个 entry。如果改成每 128B 缓存行只有一条 jmp 指令,uOP Cache 容量减少到 256 个 entry;继续增加间距,256B 间距对应 128 个 entry,512B 间距对应 64 个 entry,1024B 间距对应 32 个 entry,2048B 间距对应 16 个 entry,4096B 间距对应 8 个 entry,继续增大间距后,entry 数维持中 8 不再减少,意味着 Golden Cove 的 uOP Cache 是 8 Way 64 Set 一共 512 Entry,Index 是 PC[11:6]。

那么按照官方信息所说的 4K 容量,一共 512 个 Entry,那么每个 Entry 应该能够记录最多 8 个 uOP,这正好也对应上了 8 uOP 的吞吐。

根据前人在 Intel 比较老的微架构上的测试结果(见 The microarchitecture of Intel, AMD, and VIA CPUs)以及 Intel 的官方文档 Software Optimization Manual(这个文档把 uOP Cache 叫做 Decoded ICache),Intel 之前很多代微架构的 uOP Cache Entry 的构造条件是:

  1. 每个 Entry 能记录的 uOP 个数有上限,最多 6 uOP/Entry
  2. Entry 不能跨越 32B 边界,反过来,一个对齐的 32B 区间只能对应最多 3 个 Entry,结合第一条,就是对齐的 32B 块中不能超过 3*6=18 个 uOP(The Decoded ICache can hold only up to 18 micro-ops per each 32 byte aligned memory chunk);如果指令跨了 32B 边界,它被算在后面那个 32B 里面
  3. 指令需要完整地出现在一个 Entry 中:如果一条指令需要的空间太多,在当前 Entry 的剩余空间内放不下,就需要另起一个 Entry
  4. 无条件跳转(或者被预测为要跳转)的指令会结束一个 Entry(each unconditional branch is the last micro-op occupying a Decoded ICache Way
  5. 比较大的立即数也会占用 uOP 空间,减少了实际能存放的 uOP 数量
  6. 比较复杂的需要微码(Microcoded uops)的指令会占用一整个 Entry

下面来分析 Golden Cove 上这些构造条件是否有变化。参考 I See Dead µops: Leaking Secrets via Intel/AMD Micro-Op Caches 的方法,构造了一个循环,循环体由 4x 15-byte-nop + 1x 4-byte-nop 组成,这样的 5 条指令填满了对齐的 64B。在 Golden Cove 上测试,发现依然可以用满 512 个 Entry,假如 Entry 不能跨越 32B 边界,那么这 5 条指令至少就要 2 个 Entry,但实际上只用了 1 个 Entry。这说明 Golden Cove 上 uOP Cache Entry 的第一条限制中,Entry 不能跨越的边界,从 32B 扩大到了 64B,毕竟每个 Entry 能存的 uOP 数量也增多了,如果继续限制 32B,每个 Entry 就很难存满 8 个 uOP 了。接下来测试对齐的 64B 内可以最多有多少个 entry。

把循环体改成每对齐的 64B 就有四条 jmp 指令,前一条 jmp 指令跳转到后一条 jmp 指令,模拟每 64B 有四个 Entry 的情况:

  1. 第 1 个 jmp 放在 64B 内的 0B 偏移处,跳转到 64B 内 16B 偏移处
  2. 第 2 个 jmp 放在 64B 内的 16B 偏移处,跳转到 64B 内 32B 偏移处
  3. 第 3 个 jmp 放在 64B 内的 32B 偏移处,跳转到 64B 内 48B 偏移处
  4. 第 4 个 jmp 放在 64B 内的 48B 偏移处,跳转到下一个 64B 的开头

测试发现这个情况下能达到 512 个 Entry。说明对齐的 64B 内至少可以存 4 个 Entry。

进一步测试,如果每对齐的 64B 有五条 jmp 指令,模拟每 64B 有五个 Entry 的情况:

  1. 第 1 个 jmp 放在 64B 内的 0B 偏移处,跳转到 64B 内 8B 偏移处
  2. 第 2 个 jmp 放在 64B 内的 8B 偏移处,跳转到 64B 内 16B 偏移处
  3. 第 3 个 jmp 放在 64B 内的 16B 偏移处,跳转到 64B 内 24B 偏移处
  4. 第 4 个 jmp 放在 64B 内的 24B 偏移处,跳转到 64B 内 32B 偏移处
  5. 第 5 个 jmp 放在 64B 内的 32B 偏移处,跳转到下一个 64B 的开头

发现最高的 Entry 数只有 480 左右,不确定是遇到了什么限制,如果对齐的 64B 内不能存 5 个 Entry,也不应该得到 480 这个结果。

如果单独去测试每个对齐的 64B 能缓存多少个 uOP,比如每个对齐的 64B 里由若干条 nop 加最后一条跳到下一个 64B 开头的 jmp 指令组成,会发现当对齐的 64B 内的 uOP 个数从 36 个变成 37 个时,uOP Cache 命中率急剧下降。这意味着,每对齐的 64B 内依然不能存超过 36 个 uOP。这类似于原来的每对齐的 32B 内不能存超过 18 个 uOP,但粒度更粗,实际上更加宽松,比如对齐的 64B 内的前 32B 可以全是 NOP 指令,只要 64B 内总数不超过 36 就可以。但比较奇怪的是,36 uOP per 64B 不能整除 8 uOP/Entry,不像原来的 18 per 32B 可以整除 6 uOP/Entry。

L1 ITLB

官方信息:

  • the iTLBs is doubled to hold 256 entries for 4-KB pages and 32 entries for 2/4 million pages

构造一系列的 jmp 指令,使得 jmp 指令分布在不同的 page 上,使得 ITLB 成为瓶颈:

可以看到 256 个 Page 出现了明显的拐点,对应的就是 256 的 L1 ITLB 容量。注意要避免 ICache 和 BTB 的容量成为瓶颈,把 jmp 指令分布在不同的 Cache Line 和 BTB entry 上。

超过 256 个 Page 以后,如图有周期数突然下降后缓慢上升的情况(例如横坐标 288->289、320->321、352->353、384->385 等,以 32 为周期),背后的原理需要进一步分析。

扩大 jmp 指令的距离再测试:

  • 如果每 2/4 个 page 放一条 jmp 指令,容量不变还是 256 个 Page
  • 如果改成每 8 个 page 一条 jmp 指令,容量下降到 32 个 Page
  • 每 16 个 page 一条 jmp,容量下降到 16 个 Page
  • 每 32/64/128 个 page 一条 jmp 指令,容量是 8 个 Page

从这个结果来看,L1 ITLB 对于 4K 页应该是 32 Set 8 Way。

L1 ICache

官方信息:

  • 32KB

为了测试 L1 ICache 容量,构造一个具有巨大指令 footprint 的循环,由大量的 4 字节 nop 和最后的分支指令组成。观察在不同 footprint 大小下的 IPC:

可以看到 footprint 在 32 KB 之前时可以达到 6 IPC,之后则降到 4 IPC,这里的 32 KB 就对应了 L1 ICache 的容量。

Return Stack

构造不同深度的调用链,测试每次调用花费的平均时间,得到下面的图:

可以看到调用链深度为 20 时性能突然变差,因此 Return Stack 深度为 20。

Instruction Decode Queue (IDQ) + Loop Stream Detector (LSD)

官方信息:

  • The IDQ can hold 144 uops per logical processor in single thread mode, or 72 uops per thread when SMT is active.

Golden Cove 架构针对循环做了优化,Loop Stream Detector(简称 LSD)会检测当前指令流是否在一个循环当中,并且循环的 uop 不超出 Instruction Decode Queue(IDQ) 的容量,那么 LSD 会把 Legacy decode pipeline(MITE) 和 Decode stream buffer(DSB) 关掉,不再让 IDQ 的指令出队,而是直接在 IDQ 的内部循环提供指令,这个时候就节省了很多处理器前端的功耗。

为了测试 Instruction Decode Queue 的大小,构造不同大小的循环,循环体是复制若干份的 inc %rsi 指令,最后是 dec + jnz 作为循环结尾,通过 LSD.UOPS 性能计数器统计每次循环有多少个 UOP 来自于 Loop Stream Detector 机制,发现其最大值为 144,说明 Golden Cove 的 Loop Stream Detector 可以识别最多 144 个 uop 的循环。此时每个循环要执行 145 条指令,最后的 dec + jnz 被融合成了一个 uop。

循环体中,如果用 nop 指令来填充,会得到 40 左右的比 144 小得多的容量,猜测是进入了低功耗模式。

Conditional Branch Predictor

参考 Half&Half: Demystifying Intel’s Directional Branch Predictors for Fast, Secure Partitioned Execution 论文的方法,可以测出 Golden Cove 的分支预测器采用的历史更新方式为:

  1. 使用 388 位的 Path History Register,每次执行 taken branch 时更新
  2. 更新方式为:PHRnew = (PHRold << 2) xor footprint
  3. footprint 共有 16 位,其中 B 代表分支指令的地址,T 代表分支跳转的目的地址:
    • footprint[0] = B[3] xor T[0]
    • footprint[1] = B[4] xor T[1]
    • footprint[2] = B[5]
    • footprint[3] = B[6]
    • footprint[4] = B[7]
    • footprint[5] = B[8]
    • footprint[6] = B[9]
    • footprint[7] = B[10]
    • footprint[8] = B[0] xor T[2]
    • footprint[9] = B[1] xor T[3]
    • footprint[10] = B[2] xor T[4]
    • footprint[11] = B[11] xor T[5]
    • footprint[12] = B[12]
    • footprint[13] = B[13]
    • footprint[14] = B[14]
    • footprint[15] = B[15]

这个结果和论文是一致的。各厂商处理器的 PHR 更新规则见 jiegec/cpu

后端

Rename

官方信息:

  • Rename/allocation width grows from 5 to 6 wide

Execution Units

官方信息:

  • The number of execution ports goes from 10 to 12
  • five LEA units as well as five integer ALUs
  • three-cycle fast adders, with two cycles bypass between back-to-back floating-point ADD operations
  • five alu/simd ports: 0/1/5/6/10
    • P0: ALU/LEA/Shift/JMP/FMA/ALU/Shift/fpDIV
    • P1: ALU/LEA/Mul/iDIV/FMA/ALU/Shift/Shuffle/FADD
    • P5: ALU/LEA/MulHi/FMA512/ALU/AMX/Shuffle/FADD
    • P6: ALU/LEA/Shift/JMP
    • P10: ALU/LEA
  • 3 load ports: 2/3/11
  • 2 store address ports: 7/8
  • 2 store data ports: 4/9

LSU

官方信息:

  • Port 11 provides a third load port with a dedicated address-generation unit
  • Load 64Bx2 or 32Bx3 per cycle
  • Store 64Bx2 or 32Bx3 per cycle
  • The L1 load to use latency is 5 cycles

Load Store 带宽

针对 Load Store 带宽,实测每个周期可以完成:

  • 3x 256b Load
  • 2x 256b Load + 2x 256b Store
  • 1x 256b Load + 2x 256b Store
  • 2x 256b Store

因为测试环境是 Client 而非 Server,所以 AVX512 被屏蔽了,无法测试 AVX512 的读写带宽。此时最大的读带宽是 96B/cyc,最大的写带宽是 64B/cyc,二者不能同时达到。

Store to Load Forwarding

官方信息:

  • Partial store forwarding allowing forwarding data from store to load also when only part of the load was covered by the store (in case the load's offset matches the store's offset)

经过实际测试,Golden Cove 上如下的情况可以成功转发,对地址 x 的 Store 转发到对地址 y 的 Load 成功时 y-x 的取值范围:

Store\Load8b Load16b Load32b Load64b Load
8b Store{0}{}{}{}
16b Store[0,1]{0}{}{}
32b Store[0,3][0,2]{0}{}
64b Store[0,7][0,6][0,4]{0}

可以看到,Golden Cove 在 Store 完全包含 Load 的情况下都可以转发,没有额外的对齐要求。但当 Load 和 Store 只有部分重合时,就无法转发,这和官方信息有所冲突。两个连续的 32 位的 Store 和一个 64 位的 Load 重合也不能转发。

比较有意思的是,在 y=x 且不跨越缓存行边界且满足下列要求的情况下,Store Forwarding 不会或只带来很小的性能损失:

  • 8b Store -> 8b Load
  • 32b Store -> 8b Load
  • 64b Store -> 8b Load
  • 32b Store -> 32b Load
  • 64b Store -> 32b Load
  • 64b Store -> 64b Load

考虑到 y 必须等于 x,也就是地址要一样,猜测 Golden Cove 使用了类似 Memory Renaming 的技术来实现这个效果。如果是连续两个对同一个地址的 Store 对一个 Load 的转发,效果和只有一个 Store 是一样的。

除了上述情况以外,Store Forwarding 成功时的延迟在 5 个周期,失败则要 19 个周期。

小结:Golden Cove 的 Store to Load Forwarding:

  • 1 ld + 1 st: 要求 st 包含 ld,特别地,地址相同时,性能最好
  • 1 ld + 2+ st: 不支持

L1 DCache

官方信息:

  • 48KB

构造不同大小 footprint 的 pointer chasing 链,测试不同 footprint 下每条 load 指令耗费的时间:

可以看到 48KB 出现了明显的拐点,对应的就是 48KB 的 L1 DCache 容量。第二个拐点在 384KB,对应的是 L1 DTLB 的容量。

L1 DTLB

官方信息:

  • 96-entry 6-way 4-KB-page TLB
  • 32-entry 4-way 2-MB/4-MB-page TLB
  • 8-entry 1-GB-page TLB for loads
  • A 16-entry TLB for stores serves all page sizes

用类似测 L1 DCache 的方法测试 L1 DTLB 容量,只不过这次 pointer chasing 链的指针分布在不同的 page 上,使得 DTLB 成为瓶颈:

可以看到 96 Page 出现了明显的拐点,对应的就是 96 的 L1 DTLB 容量。没有超出 L1 DTLB 容量前,Load to use latency 是 5 cycle;超出 L1 DTLB 容量后,Load to use latency 是 12 cycle,说明 L1 DTLB miss 带来了 7 cycle 的损失。

L2 TLB

官方信息:

  • 2,048-entry second level TLB (STLB)
  • 4 page table walkers

沿用之前测试 L1 DTLB 的方法,把规模扩大到 L2 Unified TLB 的范围,就可以测出来 L2 Unified TLB 的容量,下面是 Golden Cove 上的测试结果:

第一个拐点是 96 个 Page,对应 L1 DTLB,此时 CPI 从 5 提升到 12;第二个拐点是 768,对应 L1 DCache,此时 CPI 从 12 提升到 23;第三个拐点是 1600 左右,而没有到 2048,猜测有 QoS 限制了数据对 L2 TLB 的占用。

L2 Cache

官方信息:

  • 1.25MB(Client)/2MB(Server)
  • 64 bytes/cycle
  • 15 cycle latency

构造不同大小 footprint 的 pointer chasing 链,测试不同 footprint 下每条 load 指令耗费的时间:

  • 第一个拐点在 48KB,对应 L1 DCache 的容量,CPI 从 5 提升到 16
  • 第二个拐点在 384KB,对应 L1 DTLB 的容量,CPI 从 16 提升到 23
  • 第三个拐点在 1280KB,对应 L2 Cache 的容量

Prefetcher

官方信息

Intel Golden Cove 的处理器通过 MSR 1A4H 可以配置各个预取器(来源:Software Developers Manual,MSRs Supported by 12th and 13th Generation Intel® Core™ Processor P-core):

  • MSR_1A4H[0]: the L2 hardware prefetcher, which fetches additional lines of code or data into the L2 cache.
  • MSR_1A4H[1]: the L2 adjacent cache line prefetcher, which fetches the cache line that comprises a cache line pair (128 bytes). 这和 AMD 的 Up/Down Prefetcher 应该是一个意思
  • MSR_1A4H[5]: the L2 Adaptive Multipath Probability (AMP) prefetcher. 这个应该属于 Spatial Prefetcher
  • MSR_1A4H[2]: the L1 data cache prefetcher, which fetches the next cache line into L1 data cache. 这个应该属于 Next Line Prefetcher
  • MSR_1A4H[3]: the L1 data cache IP prefetcher, which uses sequential load history (based on instruction pointer of previous loads) to determine whether to prefetch additional lines.

预取延迟

在 Golden Cove 上按 64B 的跳步进行访存,测量每次访存的延迟,得到如下结果:

可以观察到在 48KB 之内是 5 cycle latency,在 L2 Cache 范围内是 5-8 cycle latency。

如果通过 wrmsr -p 0 0x1a4 0x8DCU_IP_PREFETCHER_DISABLE 设为 1,即关闭 L1 data cache IP prefetcher,再在 0 号核心上重新跑上面的测试,得到如下结果:

就可以看到 L2 Cache 的范围内的性能退化到了 16 Cycle,和随机 pointer chasing 一样。关闭其他的 prefetcher 则没有这个现象,说明正是 L1 data cache IP prefetcher 实现了针对 L1 的 Stride Prefetcher。

预取距离

更进一步,参考 Battling the Prefetcher: Exploring Coffee Lake (Part 1) 的方式,研究 Stride 预取器的行为:分配一片内存,把数据从缓存中 flush 掉,再按照特定的访存模式访问,触发预取器,最后测量访问每个缓存行的时间,从而得到预取器预取了哪些缓存行的信息。

首先是只访问一个 cache line 的时候,可以看到,除了已经访问过的 cache line,其他 cache line 都出现了缓存缺失,说明此时预取器没有在工作:

接下来,按照固定的 stride 访问各个缓存行,发现当访问了五个 cache line 时,预取器会比较稳定地预取第六个 cache line:

继续增加访问次数,可以看到预取器总是会预取将要访问的下一个 cache line:

如果通过 wrmsr -p 0 0x1a4 0x8DCU_IP_PREFETCHER_DISABLE 设为 1,即关闭 L1 data cache IP prefetcher,就会观察到上述 Stride 预取的行为消失,不会预取将要访问的下一个 cache line。

把相同的代码放到 Gracemont 上运行,会看到它的预取器会预取将要访问的未来两个 cache line:

可见不同微架构的预取器的策略是不同的。

ReOrder Buffer

官方信息:

  • 512-entry reorder buffer
  • 8 wide retirement

为了测试 ROB 的大小,设计了一个循环,循环开始和结束是长延迟的 long latency load。中间是若干条 NOP 指令,当 NOP 指令比较少时,循环的时候取决于 load 指令的时间;当 NOP 指令数量过多,填满了 ROB 以后,就会导致 ROB 无法保存循环末尾的 load 指令,性能出现下降。测试结果如下:

当 NOP 数量达到 512 时,性能开始急剧下滑,说明 Golden Cove 的 ROB 大小是 512。

🔲 ☆

Intel Redwood Cove 微架构评测

Intel Redwood Cove 微架构评测

背景

之前我们测试了 Intel 的微架构 Redwood Cove,这次就来测一下 Redwood Cove,它被用到了 Meteor Lake 以及 Granite Rapids 上。这次就以阿里云 g9i 实例的 Granite Rapids 机器来测试一下 Redwood Cove 微架构的各项指标。

官方信息

Intel 关于 Redwood Cove 微架构有这些官方的信息:

现有评测

网上已经有较多针对 Redwood Cove 微架构的评测和分析,建议阅读:

下面分各个模块分别记录官方提供的信息,以及实测的结果。读者可以对照已有的第三方评测理解。官方信息与实测结果一致的数据会加粗。

Benchmark

Intel Redwood Cove 的性能测试结果见 SPEC

前端

L1 ICache

官方信息:

  • Larger instruction cache: 32K→64K.

为了测试 L1 ICache 容量,构造一个具有巨大指令 footprint 的循环,由大量的 4 字节 nop 和最后的分支指令组成。观察在不同 footprint 大小下的 IPC:

可以看到 footprint 在 64 KB 之前时可以达到 6 IPC,之后则降到 3.2 IPC,这里的 64 KB 就对应了 L1 ICache 的容量。

L1 ITLB

构造一系列的 jmp 指令,使得 jmp 指令分布在不同的 page 上,使得 ITLB 成为瓶颈:

可以看到 256 个 Page 出现了明显的拐点,对应的就是 256 的 L1 ITLB 容量。注意要避免 ICache 和 BTB 的容量成为瓶颈,把 jmp 指令分布在不同的 Cache Line 和 BTB entry 上。

超过 256 个 Page 以后,如图有周期数突然下降后缓慢上升的情况(例如横坐标 288->289、320->321、352->353、384->385 等,以 32 为周期),背后的原理需要进一步分析。

Golden Cove 是一样的。

Instruction Decode Queue (IDQ) + Loop Stream Detector (LSD)

官方信息:

  • Improved LSD coverage: the IDQ can hold 192 μops per logical processor in single-thread mode or 96 μops per thread when SMT is active.

为了测试 Instruction Decode Queue 的大小,构造不同大小的循环,循环体是复制若干份的 inc %rsi 指令,最后是 dec + jnz 作为循环结尾,通过 LSD.UOPS 性能计数器统计每次循环有多少个 UOP 来自于 Loop Stream Detector 机制,发现其最大值为 191,说明 Redwood Cove 的 Loop Stream Detector 可以识别最多 191 个 uop 的循环。此时每个循环要执行 192 条指令,最后的 dec + jnz 被融合成了一个 uop。

循环体中,如果用 nop 指令来填充,会得到 39 左右的比 192 小得多的容量,猜测是进入了低功耗模式。

Instruction Prefetch Instruction

官方信息:

  • Code Software Prefetch x86 architecture extension (Granite Rapids only).
  • PREFETCHIT0: (temporal code)—prefetch code into all levels of the cache hierarchy.
  • PREFETCHIT1: (temporal code with respect to first level cache misses)—prefetch code into all but the first-level of the cache hierarchy.

Conditional Branch Predictor

参考 Half&Half: Demystifying Intel’s Directional Branch Predictors for Fast, Secure Partitioned Execution 论文的方法,可以测出 Redwood Cove 的分支预测器采用的历史更新方式为:

  1. 使用 388 位的 Path History Register,每次执行 taken branch 时更新
  2. 更新方式为:PHRnew = (PHRold << 2) xor footprint
  3. footprint 共有 16 位,其中 B 代表分支指令的地址,T 代表分支跳转的目的地址:
    • footprint[0] = B[3] xor T[0]
    • footprint[1] = B[4] xor T[1]
    • footprint[2] = B[5]
    • footprint[3] = B[6]
    • footprint[4] = B[7]
    • footprint[5] = B[8]
    • footprint[6] = B[9]
    • footprint[7] = B[10]
    • footprint[8] = B[0] xor T[2]
    • footprint[9] = B[1] xor T[3]
    • footprint[10] = B[2] xor T[4]
    • footprint[11] = B[11] xor T[5]
    • footprint[12] = B[12]
    • footprint[13] = B[13]
    • footprint[14] = B[14]
    • footprint[15] = B[15]

Golden Cove 是一样的。各厂商处理器的 PHR 更新规则见 jiegec/cpu

后端

L1 DCache

构造不同大小 footprint 的 pointer chasing 链,测试不同 footprint 下每条 load 指令耗费的时间:

  • 0KB-48KB: 5 cycle,对应 L1 DCache
  • 48KB-384KB: 16 cycle,对应 L2 Cache,且命中了 L1 DTLB;说明 L1 miss L2 hit 带来了 11 cycle 的损失

L1 DTLB

用类似测 L1 DCache 的方法测试 L1 DTLB 容量,只不过这次 pointer chasing 链的指针分布在不同的 page 上,使得 DTLB 成为瓶颈:

可以看到 96 Page 出现了明显的拐点,对应的就是 96 的 L1 DTLB 容量。没有超出 L1 DTLB 容量前,Load to use latency 是 5 cycle;超出 L1 DTLB 容量后,Load to use latency 是 12 cycle,说明 L1 DTLB miss 带来了 7 cycle 的损失。

执行单元

官方信息:

  • EXE: 3-cycle Floating Point multiplication.

LSU

Load Store 带宽

针对 Load Store 带宽,实测每个周期可以完成:

  • 3x 256b Load
  • 2x 256b Load + 2x 256b Store
  • 1x 256b Load + 2x 256b Store
  • 2x 256b Store
  • 2x 512b Load
  • 1x 512b Load + 1x 512b Store
  • 1x 512b Store

Store to Load Forwarding

经过实际测试,Redwood Cove 上如下的情况可以成功转发,对地址 x 的 Store 转发到对地址 y 的 Load 成功时 y-x 的取值范围:

Store\Load8b Load16b Load32b Load64b Load
8b Store{0}{}{}{}
16b Store[0,1]{0}{}{}
32b Store[0,3][0,2]{0}{}
64b Store[0,7][0,6][0,4]{0}

可以看到,Redwood Cove 在 Store 完全包含 Load 的情况下都可以转发,没有额外的对齐要求。但当 Load 和 Store 只有部分重合时,就无法转发。两个连续的 32 位的 Store 和一个 64 位的 Load 重合也不能转发。

特别地,在 y=x 且不跨越缓存行边界且满足下列要求的情况下,Store Forwarding 不会或只带来很小的性能损失:

  • 8b Store -> 8b Load
  • 32b Store -> 8b Load
  • 64b Store -> 8b Load
  • 32b Store -> 32b Load
  • 64b Store -> 32b Load
  • 64b Store -> 64b Load

考虑到 y 必须等于 x,也就是地址要一样,猜测 Redwood Cove 使用了类似 Memory Renaming 的技术来实现这个效果。如果是连续两个对同一个地址的 Store 对一个 Load 的转发,效果和只有一个 Store 是一样的。

除了上述情况以外,Store Forwarding 成功时的延迟在 5 个周期,失败则要 19 个周期。

Golden Cove 是一样的。

小结:Redwood Cove 的 Store to Load Forwarding:

  • 1 ld + 1 st: 要求 st 包含 ld,特别地,地址相同时,性能最好
  • 1 ld + 2+ st: 不支持

Prefetcher

官方信息:

  • New HW data prefetcher to recognize and prefetch the “Array of Pointers” pattern.

Intel Redwood Cove 的处理器通过 MSR 1A4H 可以配置各个预取器(来源:Software Developers Manual,Additional MSRs Supported by the Intel® Core™ Ultra 7 Processors Supporting Performance Hybrid Architecture):

  • MSR_1A4H[0]: the L2 hardware prefetcher, which fetches additional lines of code or data into the L2 cache.
  • MSR_1A4H[1]: the L2 adjacent cache line prefetcher, which fetches the cache line that comprises a cache line pair (128 bytes). 这和 AMD 的 Up/Down Prefetcher 应该是一个意思
  • MSR_1A4H[2]: the L1 data cache prefetcher, which fetches the next cache line into L1 data cache. 这个应该属于 Next Line Prefetcher
  • MSR_1A4H[3]: the L1 data cache IP prefetcher, which uses sequential load history (based on instruction pointer of previous loads) to determine whether to prefetch additional lines.
  • MSR_1A4H[4]: Next page prefetcher,当访问快走到一个页的结尾的时候,从下一个页的开头开始 prefetch,提前进行可能的 TLB refill
  • MSR_1A4H[5]: the L2 Adaptive Multipath Probability (AMP) prefetcher. 这个应该属于 Spatial Prefetcher
  • MSR_1A4H[6]: LLC page prefetcher,类似 Next page prefetcher 的思路,但是把虚拟地址上连续的两个 4KB 的页,一共 8KB 的数据预取到 LLC 缓存上
  • MSR_1A4H[7]: Array of pointers prefetcher,针对指针数组 T *arr[] 的场景进行预取
  • MSR_1A4H[8]: Stream prefetch code fetch

ReOrder Buffer

为了测试 ROB 的大小,设计了一个循环,循环开始和结束是长延迟的 long latency load。中间是若干条 NOP 指令,当 NOP 指令比较少时,循环的时候取决于 load 指令的时间;当 NOP 指令数量过多,填满了 ROB 以后,就会导致 ROB 无法保存循环末尾的 load 指令,性能出现下降。测试结果如下:

当 NOP 数量达到 512 时,性能开始急剧下滑,说明 Redwood Cove 的 ROB 大小是 512。

🔲 ☆

Linux 大小核的调度算法探究

Linux 大小核的调度算法探究

背景

最近看到一些关于 Linux 大小核调度算法的一些博客,考虑到大小核目前已经比较常见了,因此做一些现状的探究。

现象

Intel

首先可以做一下实验,用 stress --cpu N 启动 N 个计算负载,看看这些线程都会被分配到哪些核上。在 Intel Core i9-14900K 上实验,这个 CPU 是 8P+16E,8P 对应 0-15 核,超线程的核的 ID 是连号的,16E 对应 16-31 核,观察到下面的结果:

  • N=1 时,主要调度到 12-15 核里其中一个,这对应的是 8P 中的最后 2P
  • N=2 时,主要调度到 12-13 核里其中一个,以及 14-15 核里其中一个,同样也是 8P 中的最后 2P,每个 P 上分配一个任务
  • N=3 时,在 N=2 的基础上,在 0-11 核里再调度一个
  • N=4..=8 时,在 N=2 的基础上,在 0-11 核里调度剩下的任务,但不会分配到一个 P 核的两个逻辑核上
  • N=9..=24 时,在 N=8 的基础上,在 16-31 核里调度剩下的任务
  • N=25..=32 时,在 N=24 的基础上,把任务分配到 P 核的第二个逻辑核上

可见在调度时,按照如下的优先级:

  1. 最后 2 个 P 核
  2. 其余 6 个 P 核
  3. E 核
  4. P 核的超线程

可见 P 核内部也有优先级不同,最后 2 个 P 核具有更高的优先级,而它们的 Boost 频率确实也更高:

$ cat /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq5700000$ cat /sys/devices/system/cpu/cpufreq/policy12/scaling_max_freq6000000

6 个 P 核的最大频率设定为 5.7 GHz,2 个 P 核的最大频率设定为 6.0 GHz。因此这两个 6.0 GHz 的 P 核会被优先调度。此时再来看 Intel® Core™ i9 processor 14900K Spec:

  • Max Turbo Frequency: 6 GHz
  • Intel® Thermal Velocity Boost Frequency: 6 GHz
  • Intel® Turbo Boost Max Technology 3.0 Frequency: 5.8 GHz
  • Performance-core Max Turbo Frequency: 5.6 GHz
  • Performance-core Base Frequency: 3.2 GHz

可以看到,官方宣传的最高 Turbo 频率是 6 GHz,但实际上只有两个 P 核可以达到。

但并非所有平台在默认情况下都能达到宣称的最高频率的。例如在 Dell R730 上,Xeon E5-2680 v4 默认情况下只能达到 2.9 GHz 的 Boost 频率,但按照 Intel 官网,这个 CPU 的 Boost 最高可以达到 3.3 GHz。当然了,2.9 GHz 是全核能够达到的 Boost,3.3 GHz 只能少数的核达到,而服务器场景下,大多时间是跑多核负载,限制到 2.9 GHz 也可以理解。如果想要 3.3 GHz,就需要进 BIOS 设置,把调频交给 OS,C-State 也全部放开,这样就可以实现 3.3 GHz 了。这里比较重要的是要打开 C6,因为把空闲的核放到 C6 以后,才能把单核跑到最高的频率。

AMD

在 AMD Ryzen 9 9950X 上进行类似的实验,这个 CPU 有 16 个核,0 核和 16 核对应一个物理核,其他依此类推,0-7 是一个 CCD,8-15 是另一个 CCD,得到的结果如下:

  • N=1 时,主要调度到 4,9 和 20 核里其中一个
  • N=2 时,主要调度到 0 和 16 核里其中一个,9 和 25 核里其中一个
  • N=3 时,在 N=2 的基础上,调度到 4 和 20 核里其中一个
  • N=4 时,在 N=3 的基础上,调度到 11 和 27 核里其中一个
  • N=5 时,在 N=4 的基础上,调度到 5 和 21 核里其中一个
  • N=6 时,在 N=5 的基础上,调度到 8 和 24 核里其中一个
  • N=7 时,在 N=6 的基础上,调度到 3 和 19 核里其中一个
  • N=8 时,在 N=7 的基础上,调度到 10 和 26 核里其中一个

查看它们的 scaling_max_freq,会发现都是相同的 5.752 GHz。查看它们的 amd_pstate_prefcore_ranking,发现取值和逻辑核的映射关系:

  • 236: 0,4,16,20
  • 231: 5,21
  • 226: 3,19
  • 221: 1,17
  • 216: 2,18
  • 211: 7,23
  • 206: 6,22
  • 201: 9,25
  • 196: 11,27
  • 191: 8,24
  • 186: 10,26
  • 181: 12,28
  • 176: 13,29
  • 171: 15,31
  • 166: 14,30

按理说值越大的,越应该先被调度,应该按 0->4->5->3 的顺序分配,但实际上观察的结果并不是这样。寻找规律,发现它先从第一个 CCD 找到分数最高的,再从第二个 CCD 找,再回到第一个 CCD 找分数第二高的,依此类推:

  1. 找第一个 CCD 分数最高的核:0
  2. 找第二个 CCD 分数最高的核:9
  3. 找第一个 CCD 分数第二高的核:4
  4. 找第二个 CCD 分数第二高的核:11
  5. 找第一个 CCD 分数第三高的核:5
  6. 找第二个 CCD 分数第三高的核:8
  7. 找第一个 CCD 分数第四高的核:3
  8. 找第二个 CCD 分数第四高的核:10

说明它的逻辑是,轮流从两个 CCD 中取出一个分数尽量高的核去分配负载。实际测下来,分数高的核也确实能够 Boost 到更高的频率:

$ for i in $(seq 0 15); do echo -n "$i:" && numactl -C $i perf stat -e cycles,task-clock stress --cpu 1 --timeout 1s 2>&1 | grep GHz && sleep 1; done0: 5,700,258,748 cycles:u # 5.717 GHz1: 5,642,814,521 cycles:u # 5.659 GHz2: 5,648,004,395 cycles:u # 5.665 GHz3: 5,663,175,321 cycles:u # 5.680 GHz4: 5,687,251,660 cycles:u # 5.704 GHz5: 5,667,947,179 cycles:u # 5.685 GHz6: 5,595,919,881 cycles:u # 5.613 GHz7: 5,599,885,078 cycles:u # 5.617 GHz8: 5,424,861,894 cycles:u # 5.441 GHz9: 5,427,318,403 cycles:u # 5.443 GHz10: 5,422,689,654 cycles:u # 5.439 GHz11: 5,425,760,950 cycles:u # 5.442 GHz12: 5,418,583,254 cycles:u # 5.435 GHz13: 5,425,842,189 cycles:u # 5.442 GHz14: 5,375,985,781 cycles:u # 5.392 GHz15: 5,377,887,646 cycles:u # 5.394 GHz

分数高的可以冲到 5.7 GHz,分数低一些的就只能到 5.4 GHz 了。

注:根据 David Huang 提供的信息,AMD 的 Linux 内核维护者已经提交 Patch 来修改这个行为,使得进程尽量调度到分数更高的核,无论它在哪个 CCD。这样一来,即使不绑核,也可以保证单核负载会稳定跑在频率最高的核上。

Qualcomm

最后再看一下 Qualcomm X1E80100 平台,这个平台有三个 Cluster:0-3,4-7 和 8-11 是三个 Cluster。其中后两个 Cluster 的每个 Cluster 可以支持其中一个核心从 3.4 GHz Boost 到 4.0 GHz,加起来就是最多两个核心 Boost 到 4.0 GHz。打上 cpufreq 的补丁后,内核通过 scmi 接口得到了这些信息:

$ cat /sys/devices/system/cpu/cpufreq/policy*/scaling_max_freq341760040128004012800

但实际调度起来,各个核心乱跑,而 3.4 GHz 距离 4.0 GHz 差距不小,性能差接近 15%,可见目前 Linux 内核并没有很好地适配,目前还是需要手动绑核。高通目前还提交了 memlat govenor 补丁来对 LLC/DDR 来进行 DVFS,但对这个问题应该没有改进。

分析

接下来就要进入到 Linux 源码,找到 Linux 是如何处理这些调度优先级的,这些优先级是谁确定的,又是怎么传递到 Linux 内核,又是怎么参与到调度的呢?

Intel ITMT

首先来看一下 Intel 的补丁:Support Intel Turbo Boost Max Technology 3.0,这个 patch 做了这些事情:

  1. PATCH v8 8/8: 读取 ACPI 的 CPPC 信息,得到每个核心的 highest_perf,根据 highest_perf,设置逻辑核的调度优先级:sched_set_itmt_core_prio(cppc_perf.highest_perf, cpu);
  2. PATCH v8 1/8: 修改调度器,让它尊重 arch_asym_cpu_priority 函数计算出来的优先级,而不是按照核心编号从小到大
  3. PATCH v8 3/8: 实现 arch_asym_cpu_priority,如果一个物理核对应 n 个逻辑核,那么第一个逻辑核的优先级乘以 n/1,第二个逻辑核的优先级乘以 n/2,依次类推。

简而言之,从 ACPI 中获取 CPPC 信息,把 CPPC 的 Highest Perf 设置为对应物理核的优先级,再根据物理核的优先级计算每个逻辑核的优先级,如果是 2-SMT,那就是第一个逻辑核的优先级翻倍,第二个逻辑核的优先级不变。但这个方法有局限性,就是要求 E 核的优先级介于 P 核的两个优先级之间,设置起来比较别扭。后来针对 SMT 的处理被集成到了调度器当中,因此从 itmt 的视角来看,不需要针对 SMT 进行特殊处理,SMT 的核设置为同一个优先级即可:x86/sched/itmt: Give all SMT siblings of a core the same priority

在 Intel i9-14900K 平台上,无论大小核,Highest Perf 都等于 255,此时无法通过 Highest Perf 来区分核心的体质,此时会触发下面的代码

/* * If CPPC is not available, fall back to MSR_HWP_CAPABILITIES bits [8:0]. * * Also, on some systems with overclocking enabled, CPPC.highest_perf is * hardcoded to 0xff, so CPPC.highest_perf cannot be used to enable ITMT. * Fall back to MSR_HWP_CAPABILITIES then too. */if (ret || cppc_perf.highest_perf == CPPC_MAX_PERF) cppc_perf.highest_perf = HWP_HIGHEST_PERF(READ_ONCE(all_cpu_data[cpu]->hwp_cap_cached));

查看各个核心上 MSR_HWP_CAPABILITIES MSR 记录的 Highest Perf 值:

for i in $(seq 0 31); do sudo turbostat -c $i -n 1 2 --interval 1 2>&1 | grep MSR_HWP_CAPABILITIES; done

发现后两个 P 核的 highest perf 是 77,其他 P 核的 highest perf 是 73,E 核的 highest perf 是 44。因此 Linux 的调度策略就出来了:先是后两个 P 核,再是其他 P 核,然后是 E 核,最后是 SMT 出来的逻辑核。

ACPI CPPC

接下来,查看 ACPI 的 CPPC 信息保存了什么。CPPC 全称是 Collaborative Processor Performance Control,是对已有的 P State 的改进,原来的 P State 是分立的几个配置,可选项比较少,CPPC 对性能做了抽象,每个核心可以有 Highest Performance,Nominal Performance,Lowest Nonlinear Performance 和 Lowest Performance 这几个值,性能可以在这些值之间浮动。简单来说,Highest 对应单核 Boost 到的最高性能,Nominal 对应全核能达到的性能,Lowest 对应最低频下的性能,Lowest Nonlinear 代表性能功耗比线性的界限,往下性能核功耗是线性的,往上性能功耗比会下降。OS 可以设定想要的性能范围:Minimum 和 Maximum Perf,也可以指定一个想要的性能 Desired Performance。当然了,硬件也不一定能够达到 Highest Perf,当前能保证达到的最高性能叫做 Guaranteed Perf。此外还有 Energy Performance Preference (EPP),OS 告诉硬件,我想要能效还是性能,最小的 0 表示性能,最大的 255 表示能效。

简单来说,硬件告诉 OS 五个值:Highest Perf,Nominal Perf,Lowest Nonlinear Perf,Lowest Perf 和 Guaranteed Perf,OS 通过三个值告诉硬件,我想要什么样的性能:Min Perf,Max Perf,Desired Perf,以及性能和功耗哪个更看重:EPP。

AMD CPPC

在 AMD 平台上,CPPC 的这些性能值既可以通过 ACPI 获取,又可以通过 MSR 来读写(来源:Processor Programming Reference (PPR) for AMD Family 1Ah Model 24h, Revision B0 Processors):

在更早的 AMD 处理器中,没有这些 MSR,而是通过 MMIO 来控制,这些信息记录在 ACPI CPPC 当中。

通过比对 /sys/devices/system/cpu/cpu*/acpi_cppc/highest_perf/sys/devices/system/cpu/cpu*/cpufreq/amd_pstate_prefcore_ranking,我们会发现它们是一样的,说明 amd-pstate 驱动做的事情和 itmt 类似,根据 ACPI 的 Highest Perf 信息(或者从 MSR 0xC001_02B0 读出 Highest Perf),设置 Preferred Core Ranking 以及调度器的优先级。阅读代码,可以看到它确实是这么做的:

  1. 初始化中,设置优先级为 highest_perfsched_set_itmt_core_prio((int)READ_ONCE(cpudata->highest_perf), cpudata->cpu);
  2. 设置 prefcore_rankinghighest_perf: WRITE_ONCE(cpudata->prefcore_ranking, cppc_perf.highest_perf)
  3. 运行过程中,如果发现 highest_perf 出现变化,也更新到调度器的优先级当中:sched_set_itmt_core_prio((int)cur_high, cpu);

剩下的就和 Intel 一样了。至于为什么调度器轮流从两个 CCD 取优先级最高的核心调度,应该是调度器考虑了这些核心的拓扑,进行了负载均衡,尽量保证每个 CCD 上的负载相当。这样的设计在 9950X 这种对称的架构上没啥问题,但如果是 Strix Point 这种混合 Zen5 和 Zen5c 的情况,如果还像这样,就会在 Zen5 和 Zen5c 之间来回调度,这样就不太合适了:应该先调度 Zen5,再调度 Zen5c。完整的讨论见 谈谈 Linux 与 ITMT 调度器与多簇处理器。最近 Linux 也上游化了相关的 Patch,使得 P 核优先被调度:AMD Heterogeneous CPU Design Topology Patches Coming For Linux 6.13

而我们知道 Linux 的 cpufreq 设置了不同的 governor,例如 performance 和 powersave。那么它们是怎么映射到 Min/Max/Desired Perf 的呢?通过阅读代码,可以发现:

  1. powersave 对应的配置是:Min Perf 设置为 Lowest/Lowest Nonlinear Perf,Max Perf 设置为 Highest/Nominal Perf
  2. performance 对应的配置是:Min Perf 和 Max Perf 都设置为 Highest/Nominal Perf

如果启用 boost(echo 1 > /sys/devices/system/cpu/cpufreq/policy0/boost),那就把 Max Perf 设置到 Highest Perf;如果不启用 Boost,就设置到 Nominal Perf。

下面给出几个例子,其中 Highest Perf 为 166,Nominal Perf 为 124,Lowest Perf 为 18:

  1. performance + boost=1: Min = 166, Max = 166
  2. performance + boost=0: Min = 124, Max = 124
  3. powersave + boost=1: Min = 18, Max = 166
  4. powersave + boost=0: Min = 18, Max = 124

而其他由 Linux 实现变频的 governor:schedutil 和 ondemand,会通过 Desired Perf 来实现。

amd-pstate 支持三个运行模式

  1. active(默认): 软件就设置一下要性能还是能耗(通过 performance/powersave governor 和 EPP /sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference),其他的都交给硬件自动调整
  2. guided:软件设置一个最低和最高的性能,其他都交给硬件
  3. passive:软件来负责调频,结果通过 Desired Perf 告诉硬件

这里说的 active 和 passive 是从硬件的角度出发的,而不是 OS。

注:虽然这里说是硬件调整,实际上大概率是由在一个片上的小 CPU 运行的固件(PMFW,Power Management Firmware)负责调整。

Qualcomm

arm64 架构没有实现 arch_asym_cpu_priority 函数,因此用的不是上述 Intel/AMD 的机制,而是在 Device Tree 中用 capacity-dmips-mhz 标记每个核心的性能,但是 X Elite 的 DTS 没有记录这个信息,因此 Linux 内核也就无法合理地调度了。因此一个可能的解决办法是,给后两个 Cluster 的一个核设置更高的 capacity-dmips-mhz,其他的核心都设置成一样。但其实通常来说,对于同一个核来说,提高频率以后,DMIPS/MHz 反而是下降的,内核用 DMIPS/MHz 这个指标,主要是用来区分大小核,而不是用来判断有没有 Boost。

实际尝试了一下,给 4 和 8 这两个核标记更高的 capacity-dmips-mhz,现在跑单核或双核负载可以自动跑到 4.0 GHz 上了。表现在 Geekbench 6 上,就是单核性能 2452 分到 2892 分的区别。修改的内容已经提交:[PATCH] arm64: dts: qcom: x1e80100: Add performance hint for boost clock,不过合并的概率不大,毕竟不是什么优雅的解决办法。

小结

针对不同核心的不同性能以及 SMT,Linux 的调度器需要知道各个逻辑核心的调度优先级。在 Intel/AMD 平台上,这个信息目前主要是通过 CPPC 的 Highest Perf 来获取,也可能 Fallback 到 MSR_HWP_CAPABILITIES 上。在 ARM64 平台上,则需要 DTS 标记各核心的性能。

参考

🔲 ☆

RichVision未来视野 RV100 5K 果粉屏

RichVision未来视野 RV100 5K 果粉屏

在市面上,5K显示器的选择并不多,苹果、三星、LG等品牌拥有的产品价格昂贵,使得大部分数码爱好者望而却步。然而,来自国内新势力品牌RichVision未来视野的RV100 5K果粉屏却以出众的性价比横扫全场,仅售2999元,让一般人也能负担得起

RV100 5K果粉屏通过其独特的卖点,为苹果用户提供了一款完美的显示器选择。接下来,我们将重点介绍RV100的主要亮点。

矢量智能对象2

一、外观设计

RichVision 未来视野 RV100显示器的底座跟支架采用了全铝合金的外观设计,展现了高质感和耐用性。其精致的工艺和简约的线条让人印象深刻。

RichVision 未来视野 RV100显示器的包装以经典的牛皮纸为主,外盒采用了蓝色的超大R logo设计。简洁大气的风格给人留下深刻的印象。打开盒子后,可以看到27寸显示器主机和底座是分离的,需要进行简单的安装。此外,还附带有电源适配器 / TYPE-C数据线 / DP线 以及三张不同色域的校准报告(分别对应sRGB、AdobeRGB和DCI-P3)。

正1

此外,RV100还提供了四种颜色机身供用户选择,包括冰河银、晴山灰、柏林蓝和松石绿,总有一款适合个人的审美偏好。

top

top

top

top

二、接口

RV100配备了多种接口,满足了不同用户的需求。其中最值得一提的是TYPE-C接口,支持65W PD反向供电。这款新发货的显示器采用了氮化镓电源适配器,它具有许多引人注目的特点。首先,它采用了氮化镓技术,这意味着它能够提供充足的功率供应并保持稳定,确保显示器的正常运行。其次,它的体积小巧,不浪费任何一个插排接口,可以有效节省空间。这意味着你可以在使用该显示器时更加便捷,并充分利用插排接口实现多种其他设备的连接。这项改进确保了显示器的品质和性能,为用户带来更好的使用体验。

接口

RV100可以用作外部电源为其他设备充电,例如连接迷你电脑后可以为其供电。除了TYPE-C,RV100还配备了DP 1.4和HDMI 2.0接口,以实现高质量的图像传输。

PD反向供电

三、参数介绍

RV100得益于它采用了京东方最新IGZO技术的显示面板(ME270L7B-N20)搭载了IGZO技术,具有出色的画质表现。它的亮度为500NIT,静态对比度为2000:1,充分满足了日常使用的要求。

正1绿

它采用了真正的5K专业级视网膜屏,符合苹果的标准。与常见的4K屏幕相比,RV100的像素数量提升了77%,PPI也提升了33%,像素点距离提升了25%。这意味着RV100可以提供更高的分辨率和像素密度,让您享受更清晰、更细腻的视觉体验。

分辨率像素PPI像素点距
5K5120x28802180.11655(H)x0.11655(V)
4K3840x21601630.1554(H)x0.1554(V)

5Kvs4K

与苹果Studio Display比较,RV100达到了98%的色域表现,确保色彩的准确性和饱和度。

色域RV100苹果 Studio Display
DCI-P398%98%
sRGB100%100%
Adobe RGB98%89%
Rec.202073%-

RGB

显卡要求

要驱动一台5K分辨率(5120x2880)的显示器,您通常需要一张支持5K分辨率的显卡。以下是一些常见的显卡型号,它们可以适用于5K显示器:

  1. NVIDIA GeForce RTX 30/40 系列
  2. AMD Radeon RX 6000 系列
  3. NVIDIA Quadro RTX 5000、RTX 6000 或 RTX 8000
  4. AMD Radeon Pro W5700、W6700 或 W6800
  5. 带雷电接口的Intel UHD 核显,例如:Intel NUC9
  6. 带 USB4 接口的 AMD 6000系列CPU带 680m/780m核显

请注意,驱动显示器的能力还取决于您计算机系统的其他因素,例如处理器、内存和操作系统。在购买显卡之前,建议您查看显示器和显卡的技术规格,确保它们的兼容性和性能满足您的需求。

实景4

带宽要求

要驱动5K分辨率(5120x2880)以60Hz的刷新率,至少需要以下带宽:

  • 对于每秒传输的数据量:5120 × 2880 × 60 × 每个像素的色彩深度

常见的色彩深度为 8位 ,因此:

  • 带宽 = 5120 × 2880 × 60 × 8

将结果转换为常见的单位,即兆字节(MB)或千兆字节(GB):

  • 带宽 = (5120 × 2880 × 60 × 8) / (8 × 1024 × 1024) MB

  • 带宽 = (5120 × 2880 × 60) / (1024 × 1024) GB

计算结果约为 16.58 GB。因此,在理论上,您需要至少 16.58 GBps 的带宽才能驱动 5K@60Hz 的显示器。

实拍_背部

对于HDMI和DisplayPort来说,具体需要的版本如下:

  • HDMI:要支持5K@60Hz的显示,需要至少 HDMI 2.0 版本以上。然而,HDMI 2.1是更理想的选择,因为它提供了更高的带宽和更多的功能。
  • DisplayPort:要支持5K@60Hz,至少需要 DisplayPort 1.2 版本以上。相比之下,DisplayPort 1.4 版本提供了更高的带宽和更多的特性,因此也是一个更好的选择。

HDMI 2.1DisplayPort 1.4 是目前常用的高带宽视频接口标准,它们能够支持的最大带宽如下:

  1. HDMI 2.1 : HDMI 2.1 标准能够提供最高达到 48 Gbps 的带宽。这足以支持8K分辨率(7680x4320)和60Hz的刷新率,或者5K分辨率(5120x2880)和120Hz的刷新率。此外,HDMI 2.1还支持更高的色彩深度、动态HDR和其他视频功能。
  2. DisplayPort 1.4 : DisplayPort 1.4 标准能够提供最高达到 32.4 Gbps 的带宽。这可以支持8K分辨率(7680x4320)和60Hz的刷新率,或者5K分辨率(5120x2880)和120Hz的刷新率,同时使用全色彩深度。DisplayPort 1.4 还支持 DSC(Display Stream Compression)压缩技术,可以通过无损压缩来提供更高的分辨率和刷新率。

需要注意的是,这些是标准规定的最大带宽,实际能够达到的带宽可能会受到具体设备、电缆质量、驱动程序和配置的影响。如果您要使用5K分辨率的显示器,确保您的设备及所选接口支持足够的带宽以充分发挥显示器的性能。

请确保您的计算机的显卡和显示器的接口符合所需的版本要求,以实现5K@60Hz的驱动。

四、体验

  1. 完全适配macOS:RV100完全适配macOS系统,与苹果设备无缝连接,提供更流畅的使用体验。

    UI

    玩显示器菜单,从没有这么爽过。

    • RV100 UI菜单专为果粉定制
    • 界面简洁,易用,好用
    • 你的各种使用场景,我们专程优化,一键直达
    • 让你每天从内由外地感到愉悦

    Logic Pro

  2. 分辨率和像素密度:RV100 27寸5K显示器拥有5120x2880的超高分辨率,以及较高的像素密度。这意味着显示器上的图像非常清晰和细腻,细节丰富。相比较低分辨率的显示器,RV100能够展示更多的细节,使图像更加真实和逼真。

    PHOTOSHOP

  3. 视觉体验和舒适度:由于RV100 27寸5K显示器具有适中的尺寸,当以适当的观看距离使用时,它能够提供较好的视觉体验和舒适度。观看距离是指您与显示器之间的距离,与显示器的大小和分辨率相互关联。恰当的观看距离可以避免过于靠近或过于远离显示器,从而减轻眼睛的疲劳和不适感。

    FCPX

  4. 工作效率和多任务处理:RV100 27寸5K显示器的尺寸和分辨率可提高工作效率和多任务处理能力。它拥有较大的屏幕空间,方便同时打开多个应用程序、编辑文档,或进行其他工作任务。通过多任务处理,您可以更高效地在屏幕上操作并访问所需的信息。

    多任务

  5. 影音娱乐体验:RV100 27寸5K显示器的高分辨率和较大的屏幕尺寸非常适合观看高清影片、玩游戏或享受多媒体娱乐。高分辨率提供更清晰、更生动的图像,而大屏幕则创造更沉浸式和震撼的观影体验。

    娱乐

  6. 4K/5K比较:相较于4K显示器,RV100在分辨率和像素密度上都有明显的优势。5120*2880的5K分辨率提供更为细腻的图像细节和更高的清晰度,能够满足专业用户对画面细节的要求。尤其在剪片、调色、平面设计和编曲等专业领域,RV100能够提供更准确和逼真的色彩表现,让用户能够更好地展现自己的创作。
    配图20
    RV100 5K视网膜显示屏,在27英寸的屏幕尺寸下,每英寸具有218像素密度,实现了令人惊叹的清晰度和细腻度。无论你是在30cm的视距下编辑照片、撰写文稿,还是在60cm的视距下观看电影,这块屏幕都能够带给你清晰、逼真的画质,让你如同身临其境。每个字和每颗像素都呈现出细腻的细节和鲜明的色彩,让你在创作和生产力方面得到极大的提升。这块5 K视网膜显示屏是你可靠的伙伴,无论你是在工作中还是在娱乐中,它都能够为你提供出色的画质和无与伦比的使用体验。

五、使用场景

  1. macOS:RV100完全适配macOS系统,特别适合用于剪辑、调色、平面设计和编曲等专业工作。macOS用户可以充分发挥RV100的色彩表现能力,提升工作效率和创作质量。

    macOS

  2. Windows和Linux:虽然RV100的适配性以macOS系统为主,但RV100在Windows和Linux系统上同样具备良好的兼容性和使用体验。无论是日常办公还是娱乐使用,都能得到高质量的图像显示。

    Linux and Windows

六、售后及服务

用户可以通过指定的购买链接购买RV100显示器,并享受七天无理由退货服务。需要注意的是,如果退货原因不是由于机器本身故障,只能退运费险,超出部分退款需要由买家承担。这种售后政策为用户提供了一定的保障,让用户在购买之后更加放心使用。

配图15

配图14

七、总结

综上所述,未来视野RichVision RV100 5K显示器在多个方面具备优异的表现。除了引人注目的外观设计和多种机身颜色选择外,它还具备出色的接口支持,适配多种操作系统,和京东方屏幕及IGZO技术的加持,为用户呈现出高质量的图像表现和色彩细腻度。尽管RV100的支架高度不可调节,但综合来看,它是一款功能齐全且性能卓越的5K显示器选择,能够满足不同用户的需求,提供流畅、准确的图像显示和舒适的使用体验。

配图

配图9

配图13

配图12

配图8

配图7

配图6

配图5

配图4

配图3

配图2

购买链接

🔲 ⭐

Intel NUC9黑苹果兼Sonoma安装教程

Intel NUC9黑苹果兼Sonoma安装教程

不知不觉间,小兵接触黑苹果也过去将近十年的时间了,感谢黑果粉的一路相随;2023年可能是 交替的一年,黑苹果已经慢慢步入迟暮,苹果已经逐渐停止对Intel 架构的全面支持,未来一段时间内,可能 macOS 将只支持 arm 平台。

安装前准备

现在都已经是2023年了,全新的 Sonoma 也即将发布,无论是硬件还是macOS系统本身,已经有了翻天覆地的变化。

硬件准备:

在使用macOS之前,需要先了解下硬件都有哪些限制,也就是哪些硬件是被支持的,哪些是不被支持的。

目前 Intel NUC9 所有的硬件都是可以兼容使用 macOS

电脑配置

规格详细信息
电脑型号Intel NUC9
操作系统macOS Sonoma / Ventura / Monterey
处理器Intel i5-9300/i9-9980HK
内存64 GB DDR4 2666-3200MHz
硬盘1/2/3支持多至三个 m.2 NVMe
显卡Intel UHD 630
显示接口雷电3 x2 + HDMI 2.0a x1(4K@60Hz)
声卡USB Audio Device
无线网卡m.2 NGFF插槽,默认出厂为 Intel® Wi-Fi 6 AX200
有线网卡Intel® Ethernet Connectioni219-LM / i210-AT
读卡器SDXC

固态硬盘

在大多数情况下,所有基于SATA的驱动器均受支持,大多数NVMe驱动器也受支持。只有少数例外:

  • 三星PM981(a) / PM991和美光2200S NVMe SSD
    • 这些固态硬盘不兼容(导致内核崩溃),因此需要NVMeFix.kext来修复这些内核崩溃。请注意,即使使用NVMeFix.kext,这些驱动器仍可能会导致启动问题。
    • 与此相关的是,三星970 EVO Plus NVMe SSD也有同样的问题,但已在固件更新中得到修复。可在此处获取固件更新(通过Samsung Magician或可启动ISO的Windows)。
    • 还要注意,macOS不支持使用Intel傲腾(Optane Memory)Micron 3D XPoint进行HDD加速的笔记本电脑。一些用户报告说在Catalina取得了成功,甚至具有读写支持,但我们强烈建议您卸下驱动器以防止任何潜在的启动问题。

无线网卡

支持的m.2 NGFF无线网卡:

  • 博通:

    由于空间受限,所以可以使用的型号包括:BCM94360Z3 / DW1820A / DW1560 / BCM94352Z / BCM94360Z4,由于网卡空间的原因v也不支持白果拆机卡等;

    由于 Sonoma 中暂时移除了对博通无线网卡的支持,所以请暂时使用 Intel 无线网卡或者有线网卡

  • INTEL:

    感谢@zxystd团队开发的OpenIntelWireless

软件准备

操作系统:

一个可以制作安装U盘的操作系统,包括但不限于macOS / Windows / Linux

比如:

  • 运行macOS的苹果电脑;
  • 运行Windows或者PE的电脑;
  • 基于Live CD模式运行的Linux系统等等;

软件或者用到的工具:

md5检查器:
  • Windows:
  • macOS或者Linux自带:
    • md5 for macOS
    • md5sum for linux
磁盘分区工具
U盘制作工具

创建USB安装盘

下载安装镜像
校验md5
  • Windows环境:

    利用刚才下载的WinMD5检查md5值是否正确,如果md5值不相同必须重新下载安装镜像,不要心存侥幸

  • macOS环境:

    1
    # md5 macOS\ Sonoma\ 14.0
将安装镜像写到USB上(制作安装镜像)
  • 镜像制作:

    • 下载balenaEtcher,选择安装镜像,选择需要制作的U盘,点击 Flash 即可。Windows10需要以管理员权限运行

查找适合自己的EFI

替换USB安装盘里的EFI

如果USB安装盘自带的EFI无法完成安装或者安装后不完美,那么就需要执行替换EFI的操作

  • 操作过程:(略)

安装Sonoma

BIOS 设置

Intel NUC9 为例图解

  • 打开电源,开机出现LOGO

NUC9-LOGO

  • 进入 BIOS

    • 按键盘的 F2 键进入 BIOS

    NUC_BIOS_SETUP_2

禁用 Secure Boot

  • 进入 Boot - Secure Boot 选单

    NUC_BIOS_SETUP_8

    • Secire Boot 的状态由 Enabled 修改为 Disabled

      NUC_BIOS_SETUP_9

F10 保存退出 BIOS导选项果单 mscOS 使用,该选项为非必须调整选项

NUC_BIOS_SETUP_10

安装macOS Sonoma

开机,按F10选择U盘引导,光标移动到EFI USB Device选择OpenCore分区启动:

Sonoma_Installer_0002

进入OpenCore主引导界面,选择Install macOS Sonoma,直接回车进入OpenCore引导,这期间会显示引导日志,也就是常见的-v(啰嗦模式),如果不幸卡住了,请拍照发到QQ群里寻求帮助,也可以移步:macOS BigSur 11.0安装中常见的问题及解决方法;不会操作OpenCore的请事先补课:精解OpenCore

Sonoma_Installer_03

很多的机友都是会在这个地方翻车。出现问题请进群反馈,请提供翻车照片及机器配置图。不提供任何信息直接发问就是耍流氓

Sonoma_Installer_05

这个过程需要1-2分钟,耐心等待,进入安装程序

出现安装界面,选择磁盘工具,点击继续

Sonoma_Installer_06

进入磁盘工具,点击下图所示,选择显示所有设备

Sonoma_Installer_09

磁盘工具里面所做的操作涉及到你的数据安全,请认真仔细确认后再操作,否则由此造成的一切后果本站概不负责。

Sonoma_Installer_10

图示中为在安装过 Hackintosher 的磁盘分区中安装macOS Sonoma本例中 容器disk1 为将要安装的容器名称,也可以点击 容器disk1 下面一行的 Hackintosher 宗卷,再点击右上角的 抹掉;请根据你的设备选择相应的磁盘

Sonoma_Installer_12

点击抹掉,在弹出的窗口中输入:名称:Sonoma;格式:APFS

假设您的磁盘是空的或者数据是已经备份过的,别怪我没提醒你!!!

Sonoma_Installer_14

点击抹除,然后等待操作结束,点击完成,通过菜单选择退出磁盘工具或者按窗口左上角红色按钮离开磁盘工具

Sonoma_Installer_16

返回到安装界面,选择安装macOS Sonoma,点击继续

Sonoma_Installer_17

点击同意,继续

Sonoma_Installer_19

阅读许可协议的条款,点击 同意

Sonoma_Installer_20

选择将要安装的磁盘卷标Sonoma,点击继续

Sonoma_Installer_21

它会把USB安装盘上的安装文件预复制到要安装的系统分区里,这个过程通常会持续1-2分钟,在剩余大约12分钟系统会自动重启,进入第二阶段的安装

Sonoma_Installer_25

重启后继续安装,在安装期间,通常会自动重启3-4遍

Sonoma_Installer_18

Sonoma_Installer_19

Sonoma_Installer_20

Sonoma_Installer_41

安装Sonoma的时间通常是安装Catalina的2倍,这也取决于固态硬盘的读写速度,请务必耐心等待;安装完成后,会进入设置向导

选择国家和地区中国大陆,点击 继续 按钮

Sonoma_Installer_31

设置键盘,使用默认值,点击 继续 按钮

Sonoma_Installer_32

进入辅助功能设置,默认不设置,选择 以后 继续

Sonoma_Installer_33

进入网络连接设置,点击其它网络选项

【截图略】

特别需要提醒的是:黑苹果运行向导的时候不要联网,也不要去登录Apple ID,可以在进入桌面后再登录Aple ID

弹出提示信息:我的电脑不接入互联网,点击 继续 按钮

出现 辅助功能,点击 以后 继续

Sonoma_Installer_33

出现 数据与隐私,阅读后点击 继续 按钮

Sonoma_Installer_34

出现 迁移助理,如果全新安装而不使用Time Machine恢复数据,请点击以后继续

Sonoma_Installer_36

出现 使用您的Apple ID登录,请选择 稍后设置

Sonoma_Installer_37

在弹窗提示选择 跳过

Sonoma_Installer_38

出现 条款与条件,请阅读后,点击同意继续

Sonoma_Installer_39

在弹窗提示上再次点击同意,继续

Sonoma_Installer_40

出现创建用户账号窗口,输入用户名和密码,点击 继续 按钮

Sonoma_Installer_41

出现 启用定位服务窗口,点击 继续 按钮

Sonoma_Installer_46

在弹窗提示上再次点击不使用,继续

出现分析窗口,取消勾选 与Apple共享Mac分析 点击 继续 按钮

Sonoma_Installer_48

出现屏幕使用时间窗口,点击稍后设置继续

Sonoma_Installer_49

出现Siri设置界面,点击 继续 按钮

Sonoma_Installer_50

选择Siri语言,点击 继续 按钮

Sonoma_Installer_51

进入 选择Siri声音 界面,选择 声音1,点击 继续 按钮

Sonoma_Installer_52

进入Siri改善和听写界面,选择以后,点击 继续 按钮

Sonoma_Installer_54

弹出界面,让你选择外观

Sonoma_Installer_56

您可以根据个人的喜好选择浅色主题或者深色主题,点击 继续 按钮

设置向导完成,根据选择主题的不同,分别进入不同的界面

出现桌面后,可能会弹出 键盘设置助理,直接点击 退出 按钮,这样 整个的安装向导就完成了。

Sonoma_Installer_57

安装后的系统设置

系统安装后,你可以先喝杯咖啡兴奋会儿,马上还有更艰巨的任务在等着你呢

先打开终端,输入命令:

1
sudo spctl --master-disable# 启用macOS安装应用允许任何来源

输入用户密码注意:密码不会显示在屏幕上

目的是允许安装第三方下载的macOS应用程序

继续输入命令:

1
sudo rm -rf /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist*

目的是清空网络设备,重新排序为:en0 / en1 / en2,以便可以顺利登录app store

继续输入命令:

1
2
sudo pmset -b hibernatemode 0# 内存供电,内存镜像不写入硬盘
sudo pmset -b acwake 0# 关闭被同一 iCloud 下的设备唤醒

目的是优化电源管理,解决休眠无法唤醒

继续输入命令:

1
sudo reboot

重启系统

小兵将上面的命令做了一键执行脚本,如果网络连接顺利的情况下,可以直接执行它:

打开终端,输入命令:

1
$ sh -c "$(curl -fsSL https://mirror.ghproxy.com/https://raw.githubusercontent.com/daliansky/morefine-S500-Hackintosh/main/Tools/morefine-s500.sh)"

执行结果:

1
2
3
4
5
正在执行Hackintosh一键优化脚本,该脚本包括:
启用macOS安装应用允许任何来源 / 修复睡眠唤醒 / 修复 无法登录App Store;
请输入当前用户的密码,然后回车
Password:
Hackintosh一键优化脚本执行完毕,请重启机器!

将U盘中的EFI复制进硬盘

工具篇

目的是脱离U盘引导使用macOS,所以它是最优先需要执行的动作

最简单的方法:使用工具HackintoolHackintool工具下载 如图所示:

  1. 打开Hackintool工具,点击磁盘图标
    Hackintool_Disk

  2. 点击挂载图标,输入用户密码
    Hackintool_Disk

  3. 分别点击挂载固态硬盘和安装U盘的EFI分区,并打开文件夹
    Hackintool_Disk

  4. 将U盘的EFI分区中的EFI目录复制到固态硬盘的EFI分区里即可
    EFI Copy

命令行篇

查看磁盘分区表
1
diskutil list

/dev/disk0(internal, physical):

#:TYPENAMESIZEIDENTIFIER
0:GUID_partition_scheme2.0 TBdisk0
1:EFIB550200 MBdisk0s1
2:Apple_APFSContainer disk12.0 TBdisk0s2

/dev/disk3(external, physical):

#:TYPENAMESIZEIDENTIFIER
0:GUID_partition_scheme15.5 GBDisk3
1:EFIEFI200 MBdisk3s1
2:Apple_HFSInstall macOS Ventura14.1 GBDisk3s2
3:Microsoft Basic DataCLOVER299.9MBDisk3s3
4:Microsoft Basic DataPE798.0MBDisk3s4
挂载固态硬盘EFI分区
1
sudo diskutil mount disk0s1
挂载U盘EFI分区
1
sudo diskutil mount disk3s1

打开Finder,注意后面有个.

1
open .

左侧会显示挂载了两个EFI分区,将U盘EFI目录全部复制到磁盘的EFI分区即可。

EFI Copy

如何更新 EFI

新的 EFI 在更新 OpenCore 版本时,也会修复出现的问题,同时也会持续提供对未来 macOS 版本的支持

更新 EFI

使用工具HackintoolHackintool工具下载 如图所示:

  1. 下载 Intel NUC9 EFI
  2. 打开Hackintool工具,点击磁盘图标

Hackintool_Disk

  1. 移除旧的 EFI 目录

    Delete EFI

  2. 将下载的 EFI 目录复制到固态硬盘的 EFI 分区里即可

    EFI Copy

截屏

NUC9_1

NUC9_2

NUC9_3

NUC9_4

NUC9_5

其它信息

Intel NUC9购买链接:黑果小兵的部落阁

感谢名单

参考及引用:

❌