<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ChipsAndCheese 翻译 | Easton Man's Blog</title>
	<atom:link href="https://blog.eastonman.com/blog/category/tech/chipsandcheese-%E7%BF%BB%E8%AF%91/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.eastonman.com</link>
	<description>临渊羡鱼，不如退而结网</description>
	<lastBuildDate>Tue, 19 Mar 2024 12:47:06 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>

<image>
	<url>https://blog.eastonman.com/wp-content/uploads/2021/02/cropped-Logo-e1613298891313-32x32.png</url>
	<title>ChipsAndCheese 翻译 | Easton Man's Blog</title>
	<link>https://blog.eastonman.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>龙芯3A6000：国产CPU中的一颗明星</title>
		<link>https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/</link>
					<comments>https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Tue, 19 Mar 2024 12:45:48 +0000</pubDate>
				<category><![CDATA[ChipsAndCheese 翻译]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[CPU]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/?p=1592</guid>

					<description><![CDATA[<p>计算能力已成为全球经济体至关重要的资源，对中国来说也不例外。中国正在大力投资于国产 CPU 的开发，龙芯就处于国产 CPU 的前沿。我们之前已经介绍过该公司的 3A5000 CPU：这是一个四核处理器，提供了还算可以的 IPC，但是由于时钟频率过低，与竞争对手相比而言并不具有竞争力。</p>
The post <a href="https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/">龙芯3A6000：国产CPU中的一颗明星</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 37 分钟</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文翻译自 <a href="https://chipsandcheese.com/" target="_blank" rel="noopener" title="">ChipsAndCheese</a>，原文为英文，原文链接：<a href="https://chipsandcheese.com/2024/03/13/loongson-3a6000-a-star-among-chinese-cpus/" target="_blank" rel="noopener" title="">https://chipsandcheese.com/2024/03/13/loongson-3a6000-a-star-among-chinese-cpus/</a> 原作者：clamchowder</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文中文翻译首发自我的博客 <a href="https://blog.eastonman.com/blog/2024/03/oongson-3a6000-a-star-among-chinese-cpus/" target="_blank" rel="noopener" title=""></a><a href="https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/" target="_blank" rel="noopener" title="">https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/</a> ，翻译已取得 ChipsAndCheese 编辑/原作者授权。因英文原文无公开的授权协议，本译文也禁止转载，如需转载请先联系我或 ChipsAndCheese。</p>
</blockquote>



<figure class="wp-block-image aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="575" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-1024x575.jpg" alt="" class="wp-image-1596" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-1024x575.jpg 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-300x169.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-768x431.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image.jpg 1376w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">龙芯视频的截图，视频位于&nbsp;<a href="https://www.loongson.cn/news/show?id=638" target="_blank" rel="noopener" title="">https://www.loongson.cn/news/show?id=638</a></figcaption></figure>



<p>现在，我们将看看龙芯新一代的 3A6000 CPU。3A6000 同样是一个四核的 CPU，时钟频率在 2.5GHz，但使用了新的 LA664 核心。相较于 3A5000 的 LA464 核心，LA664 是一个巨大且雄心勃勃的改进。尽管龙芯保持了相同的总体架构，但 LA664 拥有更宽、更深的流水线和更多的执行单元。让事情看起来更好的是，LA664 支持了 SMT（同时多线程）。如果正确实现的话，SMT 可以在很小的面积开销下增加多线程的性能。然而，要把 SMT 做好并不容易。</p>



<h2 class="wp-block-heading">3A6000的性能测试</h2>



<p>7-Zip 是一个文件压缩程序，它有很高的压缩率，但对CPU的要求也很高。7-Zip 几乎完全使用标量整数指令，因此 SIMD 扩展并不提供什么加速。这里，我们通过压缩一个大型的 ETL 性能追踪文件来对比性能。</p>



<p>3A6000 相比它的前身 3A5000 有 38% 的巨大性能提升。如果考虑 SMT 的话，这个提升还更大。在这个 workload 中每个核心只使用一个线程时，四核 LA664 与四核 Zen1 差不多。因此，LA664 的 IPC 性能非常好，因为它只运行在 2.5GHz 的频率上，但低频阻止了它超越 AMD 更新的产品。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="585" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-1024x585.png" alt="" class="wp-image-1599" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-1024x585.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-300x171.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-768x438.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image.png 1228w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>当使用所有线程时，SMT 为 3A6000 提供了 20% 的性能提升。与此同时 AMD 的 SMT 在 Zen1 和 Zen2 上有 40% 以上的收益。SMT 的作用是提供了更多的显式并行性，帮助 CPU 隐藏延迟并更好地填满流水线。一方面，高 SMT 收益表明核心的 SMT 实现是经过精心调整的。另一方面，这又意味着核心在运行单线程时没有很好地隐藏延迟。</p>



<p>与 7-Zip 不同，libx264 视频编码大量使用 SIMD 指令。在 x86 CPU 上，编码器将使用 SSE、AVX、AVX2 这些扩展来加速，甚至是使用 AVX-512。在龙芯的 CPU 上，libx264 会使用 LSX 和 LASX 这两种 SIMD 扩展。在这里，我转码一个4K的《守望先锋》游戏剪辑来对比性能。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="591" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-1-1024x591.png" alt="" class="wp-image-1601" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-1-1024x591.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-1-300x173.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-1-768x443.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-1.png 1230w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>3A6000 和 Zen1 性能大概差不多，在使用所有线程和每个核心只运行一个线程的情况下互有胜负。Zen1 较高的 SMT 收益可能受到其弱的 AVX2 实现的限制。Zen2 和 3A6000 都有 30% 以上的 SMT 收益。因为架构经过了全面改进和有坚实的 AVX-512 实现，AMD 最新的 Zen4 架构在这些测试中遥遥领先。和之前一样，对于一个 2.5GHz 的 CPU 来说，3A6000 的表现还是非常令人钦佩的。</p>



<p>LA664 核心将龙芯从低性能的区域带入了能够与 AMD 和 Intel 的旧型号竞争的行列。Zen1 也和 Haswell 性能差不多，而这两种架构即使在今天也是仍能一战的。接下来让我们来看看是什么样的架构能让龙芯与那些高时钟频率的设计竞争。</p>



<h2 class="wp-block-heading">核心架构</h2>



<p>LA664 是一个 6 发射的乱序核心，拥有丰富的核内资源和较大的乱序窗口。它在这些方面已经可以与较新的 Intel 和 AMD 核心相媲美。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="624" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-2.jpg" alt="" class="wp-image-1613" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-2.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-2-300x244.jpg 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>LA664 在 LA464 的基础上进行了改进。龙芯 3A5000 中的 LA464 核心是一个四发射设计，但在所有方面都相对保守。LA464 总体上是一个经得起考验的核心，没有明显的弱点，并为龙芯在 LA664 的改进提供了坚实的基础。毫不意外地，LA664 继承了 LA464 的总体架构。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="706" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-2-1.jpg" alt="" class="wp-image-1614" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-2-1.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-2-1-300x276.jpg 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>当然，架构图不能覆盖全部的细节。类似分支预测、执行单元延迟和访存性能等因素可能会对性能产生巨大的影响。</p>



<h2 class="wp-block-heading">龙芯3A6000的前端</h2>



<h3 class="wp-block-heading">分支预测</h3>



<p>CPU 分支预测器的责任是指导前端取指，告诉 CPU 分支将会走向哪个方向。这非常重要，因为如果分支预测器预测错误，CPU 的后端将会在错误路径上浪费大量的性能、功耗和时间。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="517" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-2.png" alt="" class="wp-image-1615" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-2.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-2-300x202.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>3A6000 的分支预测器拥有令人印象深刻的模式识别能力，在我们迄今为止看到的中国 CPU 中显然是最优秀的。它与我们在 3A5000 中所见到的大相径庭，并且几乎能够与最新的 Intel 和 AMD 的 CPU 相媲美。但是 AMD 一直在分支预测器能力上投入了大量精力，这使他们的 Zen3 架构仍然领先一些。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="450" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-3.png" alt="" class="wp-image-1620" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-3.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-3-300x176.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>Zen3 通过使用覆盖重定向的预测器来实现这一点：大多数分支行为简单，可被一级预测器迅速处理；仅对具有长期历史依赖的分支，能力更强但速度较慢的二级预测器才需要介入。这种方案使 Zen3 的分支预测器能在不牺牲预测速度的前提下跟踪非常长的分支历史。</p>



<p>即使 3A6000 无法与 AMD 最新的核心匹敌，龙芯在这一领域取得的进步仍值得赞扬。3A5000 的预测器看起来更适合 2000 年代中期到 2010 年代初的高性能核心，而不是近十年的产品。龙芯在分支预测器的改进无疑是 3A6000 改善性能的一大因素。</p>



<h3 class="wp-block-heading">分支预测器速度</h3>



<p>分支预测器要快速且准确，以避免出现供指问题。分支目标缓冲（BTB）缓存分支的目标，让预测器在实际分支指令被从 ICache 中取出并译码之前就能提供一个推测的指令流。LA664 拥有 64 项的 L1 BTB，能够连续（或者说Zero-Bubble地）处理 taken 的分支。BTB 缺失的情况很可能简单地等待 64KB 的 L1i 中的指令被取出和译码，然后才计算分支目标。这在实际效果上相当于 L1i 充当一个 1K-4K 项的 L2 BTB。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="403" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-4.png" alt="" class="wp-image-1623" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-4.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-4-300x157.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>相比之下，AMD 和 Intel 最近的架构都使用解耦的大型 L2 甚至 L3 BTB。只要分支 footprint 能被 BTB 覆盖，从下级 BTB 获取地址可以比从 ICache 获取更快，AMD 的 Zen4 就利用这一点来做到非常低延迟的分支处理。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="406" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-5.png" alt="" class="wp-image-1627" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-5.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-5-300x159.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>此外，从指令缓存解耦 BTB 有助于维护高 IPC，因为预测器得以免受 L1i 缺失延迟的影响。但龙芯决定放弃一个大的、解耦的 BTB 并非独一无二。Tachyum Prodigy 也做出了同样的决定，因为他们发现用标准库达到他们的目标频率将会太贵。如同 Tachyum 的 Prodigy，3A6000 通过使用一个大的 64KB 指令缓存来补偿这一点。如果 L1i 缺失变少，那这种做法弱点就不那么明显了。</p>



<p>3A6000 似乎还有更加积极的 nextline 指令预取。上面的测试中，分支仅仅跳到到下一个 16B 对齐的块，因此 nextline 指令预取器可以很好地工作。相比之下，AMD 的预取完全由分支预测器驱动。一旦超过了 BTB 容量，就无法隐藏 L2 延迟。</p>



<h3 class="wp-block-heading">间接分支预测</h3>



<p>与直接分支相比，间接分支更难预测。间接分支并不是直接编码跳转目标，而是跳转到寄存器中的地址。3A6000 在间接分支预测方面做得非常好。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="542" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-6.png" alt="" class="wp-image-1631" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-6.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-6-300x212.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>3A6000 可以跟踪总共 1024 个间接跳转目标，是 3A5000 的两倍。3A5000 只能跟踪大约 24 个间接分支，而 3A6000 可以轻易跟踪超过 128 个间接分支。相比之下，Zen2 也可以跟踪 1024 个间接跳转目标，因此 3A6000 在这一点上与较新的 x86 CPU 非常接近。</p>



<h3 class="wp-block-heading">返回地址预测</h3>



<p>返回指令作为一种特殊类型的间接分支，经常是以 call-return pair 的形式出现。许多处理器倾向于使用一个专用的返回地址栈。当分支预测器遇到一个调用指令时，它会将一个地址压入这个栈中。当它遇到一个返回指令时，它会从栈中弹出一个地址。有趣的是，3A6000 将返回地址栈的容量从 3A5000 的 32 项减少到了仅仅 16 项。如果核心的两个 SMT 线程都在运行，有效容量甚至可能进一步降低到 8 项。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="346" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-7.png" alt="" class="wp-image-1633" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-7.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-7-300x135.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>将返回栈容量降低到 16 项在某种程度上是有道理的，因为即使是一个较小的返回栈也能覆盖到大多数调用/返回情况。龙芯可能是在返回地址栈溢出示回落到间接分支预测器，因为溢出时 3A6000 只会遭受轻微的性能损失。Intel 采用同样的这种策略。在这种情况下，返回栈地址可以被视为一个功耗和性能优化的措施，而不是性能关键路径上的一部分。</p>



<h3 class="wp-block-heading">分支预测准确率</h3>



<p>7-Zip 和其他压缩程序通常对 CPU 的分支预测器构成巨大的挑战。3A6000 的分支预测器表现出色，与 Zen1 在 MPKI 上持平。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="688" height="798" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-8.png" alt="" class="wp-image-1635" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-8.png 688w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-8-259x300.png 259w" sizes="(max-width: 688px) 100vw, 688px" /></figure>



<p>在准确率方面，3A6000 与 Zen2 不相上下。在跨 ISA 对比时，准确率是一个更好的衡量标准，因为 3A6000 能够以更少的执行指令完成工作负载。MPKI 较高可能是因为龙芯的指令流中分支的比例更大。AMD 最新的 Zen4 架构仍然领先，但龙芯在分支预测器方面取得了值得赞扬的进步，它远远优于3A5000。</p>



<p>libx264 拥有较少并且更好预测的分支，但我们仍然可以看到测试 CPU 之间的差异。在这个测试中，ISA 差异对龙芯不利。3A6000 的 MPKI 较低，但这仅是因为它完成工作负载执行了更多的指令。当有更多的非分支指令要处理时，误预测的影响就变得不那么重要了。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="878" height="1024" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-9-878x1024.png" alt="" class="wp-image-1643" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-9-878x1024.png 878w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-9-257x300.png 257w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-9-768x896.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-9.png 1109w" sizes="(max-width: 878px) 100vw, 878px" /></figure>



<p>3A6000 的分支预测器表现可以与 AMD 的 Zen2 相媲美。龙芯再次显示出他们在设计分支预测器能力上的竞争力。</p>



<h3 class="wp-block-heading">指令获取</h3>



<p>一旦分支预测器决定了指令流，就轮到指令缓存来为核心提供指令。与它的前辈一样，3A6000 拥有一个大型的 64KB 4 路 L1i。Intel 和 AMD 的 CPU 只有 32KB 的 L1i，相比来说 3A6000 有一个相当大的L1i。64KB 的 L1i 向一个 6 宽的译码器供指，这使 3A6000 有比它的前任宽 50% 的前端。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="503" height="1024" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-10-503x1024.png" alt="" class="wp-image-1644" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-10-503x1024.png 503w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-10-147x300.png 147w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-10.png 527w" sizes="(max-width: 503px) 100vw, 503px" /></figure>



<p>AMD 和Intel 的高性能 CPU 使用 uOp Cache，这可以让它们在提供更高吞吐量的同时避免指令译码开销。自 Zen 架构以来，AMD 的 uOp Cache 理论上可以在每周期提供一整行的 8 个 uOp，但是下游的重命名宽度限制了核心的吞吐量。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="509" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-11-1024x509.png" alt="" class="wp-image-1645" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-11-1024x509.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-11-300x149.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-11-768x382.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-11.png 1374w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>当代码溢出 L1i 时，龙芯 3A6000 保持了良好的吞吐量。3A5000 在运行 L2 中的代码时出现了不明原因的指令带宽不足。龙芯在 3A6000 中解决了这个问题，它可以在代码被 L2 覆盖时维持每周期 3 条指令的吞吐。</p>



<p>不幸的是，在指令 footprint 增大到 L3 以后，情况并没有那么乐观。看起来龙芯在 3A6000 上并没有改进他们从 L3 获取指令的能力。这是有些遗憾，因为 Golden Cove 和 Zen3 都可以每周期获取超过三个 4 字节指令，而龙芯的 CPU 连每周期两个都不行。</p>



<h2 class="wp-block-heading">重命名和分配</h2>



<p>指令被解码成 uOp 后，CPU 需要分配后端资源。这些资源追踪指令状态，允许 CPU 尽快执行指令，同时确保正确的程序行为和异常处理。这个阶段还通过寄存器重命名机制打破假依赖，并在执行引擎中实现了其他技巧，以暴露更多的指令级并行性。</p>



<p>LA664 的重命名阶段有 move elimination，对寄存器置零有特殊处理，类似于 x86 CPU 识别原地 XOR 的行为。重命名完全消除了这样的操作，意味着它们不会消耗更下游的执行资源。</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td>测试项目</td><td>3A6000 IPC</td><td>Zen 4 IPC</td></tr><tr><td>有依赖的move</td><td>2.00</td><td>5.71</td></tr><tr><td>无依赖的move</td><td>3.64</td><td>5.73</td></tr><tr><td>寄存器置零</td><td>5.35 (li.d)</td><td>5.73 (XOR)</td></tr></tbody></table></figure>



<p>龙芯针对寄存器 move 进行了一些优化。有依赖的 move r,r 指令可以每周期执行两条，所以 LA664 有时可以在重命名表中通过指针操作以打破这种依赖。然而，它不能以全速执行move，寄存器 move 仍然需要通过 ALU。</p>



<p>Intel 和 AMD 都有更激进的消除，能够全速消除寄存器 move，无论是否存在依赖。Intel 的 Golden Cove 还可以在重命名阶段消除带小立即数的加法，进一步减轻执行阶段流水的负担。</p>



<h2 class="wp-block-heading">乱序执行</h2>



<p>为了实现乱序执行，重命名和分配阶段需要在必要的队列和缓冲区中找到空位才可以继续。更大的结构允许核心有更大的乱序执行窗口，使其更能隐藏延迟并利用指令级并行性。龙芯 3A6000 拥有非常大型的乱序引擎，这是在 3A5000 基础上的巨大进步。</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td>结构</td><td>何时需要占用</td><td>LA664 （龙芯 3A6000）</td><td>LA464（龙芯 3A5000）</td><td>Zen3</td><td>Golden Cove</td></tr><tr><td>Reorder Buffer</td><td>&#8211;</td><td>256 项</td><td>128 项</td><td>256 项</td><td>512 项</td></tr><tr><td>整数寄存器堆</td><td>目的寄存器为整数寄存器</td><td>192 项</td><td>128 项</td><td>192 项</td><td>280 项</td></tr><tr><td>向量/浮点寄存器堆</td><td>目的寄存器为向量/浮点寄存器</td><td>256bit 192 项 ，6KB 总容量</td><td>256bit 128 项 ，4KB 总容量</td><td>256bit 160 项 ，5KB 总容量</td><td>512bit 228 项 + 256bit 104 项，16.875KB 总容量</td></tr><tr><td>调度队列</td><td>等待执行</td><td>48 项整数, 48 项浮点, 48 项访存</td><td>32 项整数, 32 项浮点, 32 项访存</td><td>4×24 项整数 ( 其中3个与AGU共享)<br>2×32 项浮点+ 64 项顺序队列</td><td>97 项运算，70 项Load，38 项Store</td></tr><tr><td>Load Queue</td><td>读内存</td><td>80 项</td><td>64 项</td><td>116 项*</td><td>192 项</td></tr><tr><td>Store Queue</td><td>写内存</td><td>64 项</td><td>44 项</td><td>64 项</td><td>114 项</td></tr><tr><td>分支缓冲</td><td>控制流指令</td><td>64 项</td><td>26 项</td><td>48 项 Taken, 117 项 Not Taken</td><td>128 项</td></tr></tbody></table><figcaption class="wp-element-caption">*Zen优化手册显示，Load队列有72项，但核心可以同时处理116个Load。为了与其他架构保持一致，使用了实测的116这一数据。</figcaption></figure>



<p>与 3A5000 相比，诸如寄存器堆和 LSQ 等主要结构至少增加了 25% 的大小。LA464 的分支缓冲看起来太小了，而 LA664 解决了这个问题。LA664 最终拥有与 AMD 的 Zen3 相当的乱序能力。但 Zen3 和 LA664 与 Intel 的 Golden Cove 相比起来仍然小，Golden Cove 有着巨大的 512 项 ROB 和其他更大的结构。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="432" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-12.jpg" alt="" class="wp-image-1659" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-12.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-12-300x169.jpg 300w" sizes="(max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption">来自龙芯视频的另一个截图，右侧展示了微结构参数。它们与微基准测试结果一致。</figcaption></figure>



<h3 class="wp-block-heading">SMT实现</h3>



<p>更大的乱序缓冲区对于提高单线程性能至关重要，但会遇到收益边际效应。SMT 通过向操作系统暴露多个逻辑线程，并在这些线程之间分配资源来对抗这种收益递减。因此，一个启用了 SMT 的 CPU 可以保持单线程的高性能，与此同时如果有多个线程活跃，它就像几个较小的核心一样工作。AMD、Intel 和龙芯都决定为每个核心设计两个 SMT 线程。</p>



<p>虽然 SMT 的好处很明显，但实现难度很大。CPU 必须能够动态地在多个线程之间切换。工程师必须决定在两个线程的模式下如何管理各种核心结构。具体来说这种情况下，一个结构的处理方式可以是：</p>



<ul class="wp-block-list">
<li>复制。每个线程获得一份完整的资源。在单线程模式下，第二份资源不使用。这不是一个面积高效的方式，但可能更容易 tuning 和验证。不需要担心线程饥饿，如果第二个线程变得活跃，也不需要清空部分资源。</li>



<li>静态分区。每个线程获得一半的资源。当一个线程处于停止状态时，另一个线程可以使用所有资源，所以这种方法是面积上更高效的。它更难验证，因为当两个线程都工作时，资源需要清空一半并重新配置。但由于将结构切分为两半确保了线程之间某种程度的公平性，所以 tuning 仍然不是太难。</li>



<li>使用 water-mark。在 2T 模式下，一个线程可以占用资源直至 high water-mark。这种做法更灵活、有更多潜在的性能，但 tuning 更难。较高的 water-mark 可能会提高一个线程的性能，但对另一个（饥饿的）线程有严重的影响。</li>



<li>竞争性共享。这就是自由竞争：即使另一个线程活跃，一个线程也可以使用所有的资源。这种情况灵活性和潜在的性能都可以达到最大。例如，如果一个线程运行浮点代码，另一个运行纯整数代码，竞争性共享调度器将允许两个线程用满他们最需要的资源。但 tuning 和验证变得更难。线程饿死可能会更加常见，工程师必须小心避免这种情况。</li>
</ul>



<p>龙芯选择了一个保守的 SMT 实现，其中大多数资源都是静态分区的，包括 ROB、寄存器堆和 LSQ。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="311" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-12.png" alt="" class="wp-image-1662" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-12.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-12-300x121.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>3A6000 的调度器是用 water-mark 的。运算单元调度器的高水位标记似乎在 30 项左右，所以在 3A6000 上运行的线程即使在其 SMT 兄弟线程活跃时也几乎可以使用与在 3A5000 上一样多的调度器大小。</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td>结构</td><td>3A6000</td><td>Zen 2</td></tr><tr><td>Reorder Buffer</td><td>静态分区<br>每线程约 122 项</td><td>静态分区</td></tr><tr><td>整数寄存器堆</td><td>静态分区<br>每线程约 69 项</td><td>竞争共享（可通过 QoS 等调整）</td></tr><tr><td>向量/浮点寄存器堆</td><td>静态分区<br>每线程约 64 项</td><td>竞争共享（可通过 QoS 等调整）</td></tr><tr><td>Load Queue</td><td>静态分区<br>每线程约 38 项</td><td>竞争共享</td></tr><tr><td>Store Queue</td><td>静态分区<br>每线程约 30 项</td><td>静态分区</td></tr><tr><td>整数调度队列</td><td>Watermarked<br>每线程最大 30 项</td><td>竞争共享</td></tr><tr><td>访存调度队列</td><td>Watermarked<br>每线程最大 36 项</td><td>竞争共享</td></tr><tr><td>浮点调度队列</td><td>Watermarked<br>每线程最大 30 项</td><td>Watermarked<br>每线程最多 64 项 SQ + NSQ （总共 100 项）</td></tr></tbody></table></figure>



<p>AMD Zen2 的重排序缓冲使用静态分区，并对浮点调度队列和非调度队列采用某种水位标记方案。但在其他方面，AMD 采取了非常激进的 SMT 策略。寄存器堆、LSQ 和整数调度队列是竞争性共享的。这可以部分解释Zen2 令人印象深刻的 SMT 收益。</p>



<p>对于龙芯来说，采取一个不那么激进和更容易验证的方法是合理的。3A6000 是他们首个支持 SMT 的 CPU，过于雄心勃勃总是容易导致失败。</p>



<h3 class="wp-block-heading">整数执行</h3>



<p>3A6000 的整数执行单元看起来相比前代变化最少，但调度器容量增加 50% 应该会有更好的 ALU 端口利用率。与 3A5000 一样，3A6000 有四个端口的 ALU 能够执行常见操作。两个端口可以处理分支，两个用于整数乘法。这个配置与 Zen2 大致相似，但龙芯有两个整数乘法单元，而 Zen2 只有一个。Zen2 有更大的总调度容量，但 Zen2 是分布式调度器，与龙芯的统一调度器并不能直接比较。Zen2 上可能会出现其中一个 16 项的队列提前填满，这在重命名阶段将会由于资源不足发生阻塞。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="593" height="404" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-13.png" alt="" class="wp-image-1669" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-13.png 593w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-13-300x204.png 300w" sizes="(max-width: 593px) 100vw, 593px" /></figure>



<p>龙芯在整数除法的吞吐量和延迟上进行了改进，从 3A5000 的每周期 0.11 个指令和 9 个周期的延迟提高到每周期 0.25 个指令和 4 个周期的延迟。除法器的改进是一个奇怪的选择，因为大多数代码会避免使用 DIV 指令，因为它在历史上就非常慢。也许是因为龙芯需要从头开始构建他们的软件生态系统，加速除法操作可能是一个值得的投资。</p>



<h3 class="wp-block-heading">向量和浮点执行</h3>



<p>龙芯的 3A5000 拥有 256 位的向量能力和 LASX 扩展，但实现较为保守，只有两个 256 位执行单元。3A6000 彻底改进了FPU，它现在有四个执行单元。所有四个管道都可以处理 256 位向量加法，这给 3A6000 提供了非常强大的浮点性能。竞品的 x86 CPU 只能每个周期执行两个 256 位向量加法。256 位向量乘法和基础向量整数操作性能与 Zen2 相似。</p>



<p>奇怪的是，标量浮点操作没有得到同样的增强。只有两个单元可以处理标量浮点加法。更奇怪的是，标量浮点乘法似乎和向量乘法使用不同的流水线。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="577" height="526" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-14.png" alt="" class="wp-image-1673" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-14.png 577w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-14-300x273.png 300w" sizes="(max-width: 577px) 100vw, 577px" /></figure>



<p>即使龙芯增加了额外的浮点单元，融合乘加（FMA）的峰值吞吐量还是保持不变。LA464 和 LA664 都可以每个周期执行一个 FMA 操作，它们的 FMA 吞吐量是 AMD 的 Zen2 或 Intel 的 Skylake 的一半。</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td>指令</td><td>LA664</td><td>LA464</td><td>Zen3</td><td>Golden Cove</td></tr><tr><td>256bit FP64 向量加法吞吐量</td><td>4 per cycle</td><td>2 per cycle</td><td>2 per cycle</td><td>2 per cycle</td></tr><tr><td>256bit FP64 向量加法延迟</td><td>3 cycle latency</td><td>5 cycle latency</td><td>3 cycle latency</td><td>3 cycle latency</td></tr><tr><td>256bit FP64 向量乘法吞吐量</td><td>2 per cycle</td><td>2 per cycle</td><td>2 per cycle</td><td>2 per cycle</td></tr><tr><td>256bit FP64 向量乘法延迟</td><td>5 cycle latency</td><td>5 cycle latency</td><td>3 cycle latency</td><td>4 cycle latency</td></tr><tr><td>256bit FP64 向量 FMA 吞吐量</td><td>1 per cycle</td><td>1 per cycle</td><td>2 per cycle</td><td>2 per cycle</td></tr><tr><td>256bit FP64 向量 FMA 延迟</td><td>5 cycle latency</td><td>5 cycle latency</td><td>4 cycle latency</td><td>4 cycle latency</td></tr></tbody></table></figure>



<p>除了吞吐量外，龙芯改善了执行延迟。浮点加法的延迟为 3 个周期，与 Zen3 相等。然而，AMD 的 Zen3 和 Intel 的 Golden Cove 仍然有更低的浮点执行延迟。特别是 Intel，它可以在 2 个周期延迟内完成浮点加法，而且还是以更高的时钟频率运行。</p>



<p>和整数调度队列一样，浮点调度队列容量增加了 50% 至 48 项。单独就这一点来说可能就已经提供了比增加执行单元更多的浮点性能提升，两者结合使 3A6000 在向量和浮点工作负载中表现强大。</p>



<p>AMD 的 Zen2 也有一个四流水线 FPU，并且也在所有四个单元处理基础向量整数操作。然而，它使用一个聪明的非调度队列，即使它的 36 项调度队列填满，也能让后端保持更多的inflight浮点或向量操作，尽管它不能利用这些指令来找到额外的指令级并行性。</p>



<h3 class="wp-block-heading">地址生成</h3>



<p>龙芯在 LA664 中相比于 LA464 显著强化了地址生成功能。LA464 拥有两个通用的 Load/Store 单元。LA664 将这分为两个 Load 和两个 Store 单元。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="640" height="308" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-15.png" alt="" class="wp-image-1680" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-15.png 640w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-15-300x144.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>这意味着，LA664 每周期可以处理比 Zen2 更多的标量内存操作，与 Golden Cove 处理的内存操作量相同。Zen3 和 Golden Cove 在灵活性方面稍微领先于 LA664，可以每周期发出 3 个 Load。但 LA664 的 2 Load 每周期已经是从 LA464 的 1 Load 每周期的大幅升级。在 Store 方面，LA664、Zen3 和 Golden Cove 都是每周期 2 次标量 Store，而 LA464 只能每周期处理一个 Store。</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td></td><td>LA664</td><td>LA464</td><td>Zen3</td><td>Golden Cove</td></tr><tr><td>每周期标量 Load</td><td>2</td><td>1</td><td>3</td><td>3</td></tr><tr><td>每周期标量 Store</td><td>2</td><td>1</td><td>2</td><td>2</td></tr><tr><td>AGU 数量（标量内存操作发射宽度）</td><td>4</td><td>2</td><td>3</td><td>4</td></tr></tbody></table></figure>



<p>LA664 可以每周期处理两个 256 位向量访存，这些访存可以是任意 Load/Store 组合。</p>



<h3 class="wp-block-heading">内存序</h3>



<p>一旦地址计算完毕，Load/Store 单元必须确保内存访问符合 ISA 的内存模型。Load 可能需要从之前的 Store 中获取结果。与之前的 3A5000 一样，3A6000 可以在大约 7 个周期的延迟中处理 Load 被包含于之前的 Store 的情况。只有部分是重叠的情况会产生 14 个周期的惩罚，可能是因为 Load 被阻塞直到 Store 退休并写回到 L1d。</p>



<p>Zen2 具有相同的 7 周期转发延迟和 14 周期的部分重叠惩罚。但 Zen2 可以以一个额外周期的惩罚处理 64B 缓存行间转发，而龙芯在这种情况下表现不佳。由于 Zen2 的时钟频率更高，所以龙芯 7 周期的转发延迟感觉有些长。Goldmont Plus 的目标频率也是 2.xGHz 接近 3GHz 的范围，它就是 5 周期的 Store-Load 转发延迟以及转发不能处理时的 10 周期延迟。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1024x493.jpg" alt="" class="wp-image-1684" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1024x493.jpg 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-300x145.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-768x370.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16.jpg 1376w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">使用 Henry Wong 的方法测量的 Store-Load 转发延迟，代码由 Clam 编写。</figcaption></figure>



<p>LA664 的 Store-Load 转发行为看起来与其前代相似。但 LA664 消除了非对齐 Store 的 10 周期惩罚，将其降低到仅 3 周期。这比 Zen2 稍好，Zen2 对于非对齐的 Store 需要 2 到 5 个周期的处理时间。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="496" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1-1024x496.jpg" alt="" class="wp-image-1688" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1-1024x496.jpg 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1-300x145.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1-768x372.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1.jpg 1376w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>跨越 64B 边界的 Store-Load 转发仍然处理不佳，但惩罚从 31 周期降低到了可以接受的 21 周期。</p>



<h2 class="wp-block-heading">缓存和内存访问</h2>



<p>良好的缓存和内存层次结构对于任何现代高性能 CPU 的数据供给至关重要。3A6000 保留了类似的缓存层次结构，但在各个点上有细微的改进。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="250" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1024x250.png" alt="" class="wp-image-1691" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-1024x250.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-300x73.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16-768x188.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-16.png 1146w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>由于龙芯未能提高时钟速度，他们通过减少缓存访问路径中的流水线长度来降低延迟。</p>



<h3 class="wp-block-heading">延迟</h3>



<p>L1d 延迟从四个周期降低到三个周期。我认为低频 CPU 的设计目标应该是 3 周期 L1d 延迟，很高兴看到3A6000 实现了这一点。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="571" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-17-1024x571.png" alt="" class="wp-image-1692" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-17-1024x571.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-17-300x167.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-17-768x428.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-17.png 1093w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>许多现代 CPU 使用 L2 作为中级缓存，使 L1 缺失不需要到相对高延迟的 L3 中查询。3A6000 继续使用256KB L2 缓存，类似于较早的 Intel 架构。最近的 AMD 和 Intel CPU 趋向于使用更大的 L2 缓存。Zen4 已经转向使用 1MB L2 缓存，而 Intel 的 Raptor Lake 选择了巨大的 2MB L2。尽管龙芯未能实现更大的 L2，但他们将延迟从 14 个周期降低到 12 个周期。假设 L1 以同样的速度处理命中和缺失的话，L1 到 L2 的路径上可能只减了一拍。</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td>内存层级</td><td>3A6000</td><td>3A5000</td><td>Zen 2 (3950X)</td></tr><tr><td>L1d</td><td>64 KB<br>3 周期延迟</td><td>64 KB<br>4 周期延迟</td><td>32 KB<br>4 周期延迟</td></tr><tr><td>L2</td><td>256 KB<br>12 周期延迟</td><td>256 KB<br>14 周期延迟</td><td>512 KB<br>12 周期延迟</td></tr><tr><td>L3</td><td>16 MB<br>38 周期延迟</td><td>16 MB<br>40 周期延迟</td><td>16 MB<br>37 周期延迟</td></tr><tr><td>DRAM</td><td>104.19 ns<br>~263 周期延迟</td><td>144.52 ns<br>~361 周期延迟</td><td>77.25 ns<br>~341 周期延迟</td></tr></tbody></table></figure>



<p>Zen2、3A6000 和 3A5000 都有一个四核共享的大型 16MB L3 缓存。3A6000 减少了几个周期的 L3 延迟，尽管这可能是因为查询 L2 加快了两个周期。</p>



<p>最后，DRAM 延迟从 144ns 改进到了 104ns。3A5000 的 DDR4 控制器很糟糕。它只是恰好被较低的时钟频率“拯救”了，使得它对 IPC 的影响没那么大。3A6000 获得了大大改善后的内存控制器。104ns 还是不够好，但以周期数计的话，它的延迟降低到了比高时钟频率的 3950X 要低。因此 3A6000 至少通过减少 DRAM 访问延迟的周期数来缓解了它的低时钟频率劣势。然而，104ns 对于一个单片 DDR4-2666 的配置来说并不是很好。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="571" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-18-1024x571.png" alt="" class="wp-image-1695" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-18-1024x571.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-18-300x167.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-18-768x428.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-18.png 1093w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>尽管 3A6000 在延迟的周期数上具有竞争力，我们必须考虑实际的延迟，因为龙芯无法将其 CPU 的时钟频率提升到现代 AMD 和 Intel CPU 运行的水平。这并不是对 LA664 有利的情况。在包括 L1 在内的每一缓存它都较慢。这解释了为什么 LA664 在拥有更多乱序能力和更高 IPC 的情况下，仍然稳定地输给 Zen2。</p>



<h3 class="wp-block-heading">带宽</h3>



<p>带宽对于向量化、多线程应用程序尤其重要。3A6000 在很大程度上继承了它前身的内存层次结构，但龙芯再次在各个地方进行了改进。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="639" height="186" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-19.png" alt="" class="wp-image-1697" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-19.png 639w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-19-300x87.png 300w" sizes="(max-width: 639px) 100vw, 639px" /></figure>



<p>3A5000 已经拥有与 Intel 的 Skylake 或 AMD 的 Zen2 相似的每周期 L1d 带宽。3A6000 通过加倍写入带宽进行了改善。基本上 3A6000 的 L1d 可以每周期完成两次 256 位访问，无论是读取还是写入。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="877" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-20-1024x877.png" alt="" class="wp-image-1698" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-20-1024x877.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-20-300x257.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-20-768x657.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-20.png 1063w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>因此，尽管时钟频率较低，3A6000 拥有令人印象深刻的 L1d 写入带宽。LA664 因此成为了和 Golden Cove 一样唯二的两个具有每周期 512 字节存储带宽的消费级 CPU。</p>



<p>LA664 的 256KB L2 表现与其前身基本类似，每周期读带宽为 21-22 字节，写带宽相同。因此，3A6000 的 L2 带宽仍然低于 AMD 或 Intel 最近的任何 CPU。与 Intel 的 CPU 相比差距特别大，后者有每周期 64字节的 L2 带宽。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="447" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-21-1024x447.png" alt="" class="wp-image-1700" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-21-1024x447.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-21-300x131.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-21-768x336.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-21.png 1213w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>在 L3 中，LA664 比其前代增加了 33％ 的带宽。每周期从 L3 获取 18.7 字节的带宽让龙芯可以对抗较老的 Intel CPU，但 AMD 特别强大的 L3 仍然遥遥领先。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="533" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-22-1024x533.png" alt="" class="wp-image-1701" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-22-1024x533.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-22-300x156.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-22-768x400.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-22.png 1134w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>设计共享缓存引入了额外的挑战，因为缓存带宽在服务多个客户时还要增加。当所有硬件线程都活跃时，3A6000 可以给每个核心每周期提供 16.55 字节。这比单个核心在没有其他核心竞争的情况下只少了一点点，是非常好的表现。旧的 3A5000 在所有四个核心加载时只能为每个核心每周期提供 10 字节多一点，与单一核心的 13.7 字节相比。这表明 3A5000 的 L3 结构存在竞争，而 3A6000 在很大程度上解决了这个问题。AMD 在多个核心一起冲击缓存时再次提供了出色的每核心 L3 带宽，每核心每周期超过 24 字节。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="688" height="472" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-24.png" alt="" class="wp-image-1706" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-24.png 688w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-24-300x206.png 300w" sizes="(max-width: 688px) 100vw, 688px" /></figure>



<p>龙芯的 3A5000 有一个极其糟糕的 DDR4 控制器。幸运的是，3A6000 有一个更好的控制器。技术上它支持 DDR4-3200，但我们在使用这个速度运行双通道内存时无法稳定启动。当装配双通道 DDR4-2666 时，3A6000 实现的 DRAM 读带宽大致与 Core i5-6600K 相当。这个酷睿芯片的第一代 DDR4 控制器只能在完全稳定的情况下处理 DDR4-2133 的速度（至少在我的样本上是这样），但仍然比 3A6000 用更快的内存实现更好的 DRAM 读带宽。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="573" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-1024x573.jpg" alt="" class="wp-image-1707" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-1024x573.jpg 1024w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-300x168.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-768x430.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-25.jpg 1149w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>尽管 3A6000 的 DRAM 读取性能一般，但它也有一个小 trick：当检测到缓存行被完全覆写而且没有对其先前内容的依赖时，可能会避免获取这个缓存行的所有权。这可能有助于某些访问模式，但好处可能会受限，因为程序通常有更多的读取而不是写入操作。</p>



<h2 class="wp-block-heading">核心到核心延迟</h2>



<p>这个测试使用原子比较和交换操作在核心之间传递值。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="356" height="198" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-23.png" alt="" class="wp-image-1702" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-23.png 356w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-23-300x167.png 300w" sizes="(max-width: 356px) 100vw, 356px" /></figure>



<p>龙芯的性能没有带来任何惊喜（惊吓），这是一件好事。</p>



<h2 class="wp-block-heading">结语</h2>



<p>龙芯的工程师有许多值得骄傲的地方。设计与 Zen2 相当的分支预测器并不容易，考虑到龙芯在 3A5000 中的表现，这一成就更显卓越。同样地，SMT 非常难以实现正确。龙芯在大幅扩展 3A5000 的乱序引擎和修复其 DDR4 控制器的同时，设法完成了这两件事。这些巨大的性能提升使 LA664 与 Zen1 在单核性能上相当。</p>



<p>3A6000 是中国为使其经济减少对外国 CPU 依赖所做努力的一部分。在这方面，3A6000 是向前迈出的一步。Zen1 在今天仍然非常可用，所以中国消费者可能会发现 3A6000 的性能对于轻量级日常任务已经是可以接受的了。龙芯的软件生态系统比性能更影响芯片的可用性。</p>



<p>但龙芯还有一个成为世界级 CPU 制造商的次级目标，与西方公司如 Intel 和 AMD 并肩。在这方面，他们还有很长的路要走。Zen1 级别的单线程性能值得赞扬。但我们必须记住，Zen1 之所以能够从 Intel 那里夺取市场份额，是因为它将便宜的的 6 核和 8 核产品带入了消费者平台，而不是因为它能够以核心对核心的方式赢得 Skylake。3A6000 只是一个四核产品，因此缺少了 Zen1 最大的优势。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="779" height="518" src="https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-1.jpg" alt="" class="wp-image-1711" srcset="https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-1.jpg 779w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-1-300x199.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2024/03/image-25-1-768x511.jpg 768w" sizes="(max-width: 779px) 100vw, 779px" /><figcaption class="wp-element-caption">来自&nbsp;<a href="https://mp.weixin.qq.com/s/dMXDPrsCS4rOj7AOPyYOcg">https://mp.weixin.qq.com/s/dMXDPrsCS4rOj7AOPyYOcg</a></figcaption></figure>



<p>龙芯还将 3A6000 与 Intel 的 Core i3-10100 相比较——一个带有 6MB 缓存和 4.3 GHz 睿频时钟的四核 Skylake 产品。虽然从名义上看是第 10 代产品，i3-10100 更类似于 2015 年的 Core i7-6700K。Intel 的第 10 代更为人所知的是将 10 核 CPU 带入消费者阵容，而 6 核和 8 核构成中端产品。除了更多核心，像 i5-10600K 和 i7-10700K 这样的部件还享有更高的睿频频率。3A6000 将无法与这些产品竞争。针对同一时代的 Zen2 产品，龙芯也将遇到挑战。我们已经看到，3950X 在相同核心数量的测试中轻松超过 3A6000。当 Zen2 的更多核心开始发挥作用时，这一差距将只会变得更大。</p>



<p>今天，Intel 的 Golden Cove 衍生产品和 AMD 的 Zen4 在 3A6000 之上还有更大的领先优势。四核产品在 AMD 和 Intel 的消费者产品阵容中已经几乎消失。龙芯的 3A6000 可能是我们从中国看到的最有前途的 CPU，远比围绕 A72 进行的笨拙尝试更加令人兴奋。但龙芯的工程师们仍有大量工作要做。我们期待看到他们接下来能够实现什么。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文翻译自 <a href="https://chipsandcheese.com/" target="_blank" rel="noopener" title="">ChipsAndCheese</a>，原文为英文，原文链接：<a href="https://chipsandcheese.com/2024/03/13/loongson-3a6000-a-star-among-chinese-cpus/" target="_blank" rel="noopener" title="">https://chipsandcheese.com/2024/03/13/loongson-3a6000-a-star-among-chinese-cpus/</a> 原作者：clamchowder</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文中文翻译首发自我的博客 <a href="https://blog.eastonman.com/blog/2024/03/oongson-3a6000-a-star-among-chinese-cpus/" target="_blank" rel="noopener" title=""></a><a href="https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/" target="_blank" rel="noopener" title="">https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/</a> ，翻译已取得 ChipsAndCheese 编辑/原作者授权。因英文原文无公开的授权协议，本译文也禁止转载，如需转载请先联系我或 ChipsAndCheese。</p>
</blockquote>The post <a href="https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/">龙芯3A6000：国产CPU中的一颗明星</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2024/03/loongson-3a6000-a-star-among-chinese-cpus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HotChips 2023: Ventana 不寻常的 Veyron V1</title>
		<link>https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/</link>
					<comments>https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/#comments</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Sat, 10 Feb 2024 15:25:09 +0000</pubDate>
				<category><![CDATA[ChipsAndCheese 翻译]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[RISC-V]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/?p=1454</guid>

					<description><![CDATA[<p>近年来 RISC-V 正在变得越来越火热。CPU IP 设计商中 SiFive 已经进入到高性能的范围中了。阿里巴巴的平头哥一直在开发 RISC-V 芯片，以期发展成为一条可行的本土服务器 CPU 产品线。现在，Ventana 也加入了这场派对，带来了他们的 Veyron V1 核心。这篇文章将分析 Veyron V1 的设计，并特别关注一些 Veyron V1 的不寻常特性。</p>
The post <a href="https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/">HotChips 2023: Ventana 不寻常的 Veyron V1</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 24 分钟</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文大部分翻译自 <a href="https://chipsandcheese.com/" target="_blank" rel="noopener" title="">ChipsAndCheese</a>，添加有个人理解和资料补充 ，原文为英文，原文链接：<a href="https://chipsandcheese.com/2023/09/01/hot-chips-2023-ventanas-unconventional-veyron-v1/" target="_blank" rel="noopener" title="">https://chipsandcheese.com/2023/09/01/hot-chips-2023-ventanas-unconventional-veyron-v1/</a> 原作者：<a href="http://chlamchowder" target="_blank" rel="noopener" title="">chlamchowder</a></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文中文翻译首发自我的博客 <a href="https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/" target="_blank" rel="noopener" title="">https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/</a> ，翻译已取得 ChipsAndCheese 编辑/原作者授权。因英文原文无公开的授权协议，本译文也禁止转载，如需转载请先联系我或 ChipsAndCheese。</p>
</blockquote>



<h2 class="wp-block-heading">总体设计</h2>



<p>Veyron V1 是一个八发射的乱序核心（这里一般指重命名/分派宽度）。分支误预测惩罚是 15 周期，乱序调度队列容量十分可观。与 ARM 和 SiFive 的设计类似，Veyron V1 以适中的时钟频率换取较低的面积和功率，这使它能扩展到非常多的核心。Ventana 给 Veyron V1 的目标频率是 3.6GHz，但 Veyron V1 还可以降频以减少功耗，例如在 2.4GHz 时，核心的功耗少于 0.9W。</p>



<p>译者：总体来说 8 宽度的重命名可以做到 3.6GHz 的最高频率，2.4GHz 下功耗小于 0.9W，这个设计能力并不算最好，但鉴于 RISC-V 各家都没有太多的基础，在较短时间内能迭代到这样的效果也属于不错了。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="761" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-1024x761.png" alt="" class="wp-image-1463" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-1024x761.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-300x223.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-768x571.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image.png 1130w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">根据 Vetana 演讲中信息绘制的 Veyron V1 的框图</figcaption></figure>



<h2 class="wp-block-heading">流水线设计</h2>



<p>乍一看，Veyron V1 的流水线深度可能会显得比较深（15 周期的分支误预测惩罚）。作为比较，AMD Zen4 的最小分支误预测惩罚是 11 周期，ARM 的 Neoverse N2 的流水线深度是 10 周期（我们假设 ARM 在之前的 HotChips 演讲中提到的流水线深度就是指最小分支误预测惩罚）。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="575" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-1-1024x575.png" alt="" class="wp-image-1465" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-1-1024x575.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-1-300x169.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-1-768x431.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-1.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Ventana 在 HotChips 2023 中的演示，此处是 V1 的流水线</figcaption></figure>



<p>Ventana 表示他们新版的 V2 架构改善了分支误预测惩罚，在他们的演示中也提到了一点。在整数执行阶段1（IX1）检测到的误预测会触发在RPS（Restart Pipe Start）阶段的流水，和 IX1 重叠。这个周期离标记为 PNI 的预测流水有两个周期的距离。PNI大概率表示 Predict Next IP，意思是生成 Next Instruction Pointer 的地方。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="121" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-2-1024x121.png" alt="" class="wp-image-1466" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-2-1024x121.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-2-300x36.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-2-768x91.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-2.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">添加了分支误预测重定向通路的流水线</figcaption></figure>



<p>通过比较实际的分支方向与预测的方向或比较跳转的目标，可以检测出分支误预测。如果直接将真实的目标地址或正确方向反馈到分支预测器中，应该能让流水线在 PNI 之后立即重新启动，将误预测惩罚减少两个周期（降至13个周期）。</p>



<h2 class="wp-block-heading">分支预测器：单级 BTB</h2>



<p>像其他一些现代 CPU 一样，Veyron V1 使用了解耦前端（分离式前端）。同时，解耦前端的分支预测结果也充当了准确的指令预取器。为了最大限度地利用这种技术，预测器必须能够同时且准确地跟踪多个分支目标。因此大的分支目标缓冲（BTB）对于分支预测器而言至关重要，这可以让分支预测器无需从指令缓存中获取指令后才能解码出跳转的目标，降低了延迟。</p>



<p>但是无论是存储分支目标还是直接存储指令数据，大而快的缓存都难以制造。因此现代 CPU 一般选择多级 BTB。通常快速的一级 BTB 能够背靠背地预测跳转的分支，而较慢的下级 BTB 则有助于保持在较大分支足迹下的良好性能。像 Intel 就有 3-4 级的 BTB 结构。</p>



<p>尽管在速度、容量和复杂性之间通常需要权衡，Ventana 说“我全都要”。V1 有一个 12K 项的巨大单级 BTB，和一个“单周期 next-line 预测器”。与 Berkerly 的 BOOM 相似，“next-line 预测器”包括有 BTB 查询，因此如果按照 Ventana 演示的说法，12K 项的 BTB 是可以做到背靠背地预测跳转分支的。这是相当了不起的成就，这让 V1 能够以最小的吞吐量损失处理非常大的分支足迹。对比之下，以 Intel 的 Golden Cove 为例，它也有一个 12K 条目的 Last-level BTB，但是延迟为三个周期。</p>



<p>译者：这可能和 Intel 的目标频率较高有关系，但是 Ventana 的单级 BTB 设计还是不太寻常，也许和尚未完全挖掘工艺制程的潜力有关。我猜测 Ventana 使用这样的设计仅是因为没有做更好的设计，巨大的单级 BTB 还会带来比较大的功耗开销，毕竟每周期都需要开启。结合 Ventana 提供的功耗数据，我觉得他们的低功耗设计还有很大的空间。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="556" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-3-1024x556.png" alt="" class="wp-image-1484" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-3-1024x556.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-3-300x163.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-3-768x417.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-3.png 1279w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Ventana 在 HotChips 2023 上的演示文稿</figcaption></figure>



<p>如果 BTB 未提供正确的目标，V1 声称能做到“three-cycle redirect on mispredict”。这可能意味着静态预测器（预译码）距离指令取指有三个周期，或者在解码的第一周期，因为 V1 的指令缓存延迟为两个周期。在有这么大的 12K 项 BTB 的情况下，这样的静态预测器（预译码）重定向应该会比较罕见。</p>



<h2 class="wp-block-heading">前端：512KB L1/L2指令缓存</h2>



<p>除了 BTB 的层级，Ventana 也减少了指令缓存层级。Veyron V1 有一个大的 512KB 指令缓存，充当 L1/L2 指令缓存的角色。一个小型循环缓冲区位于指令缓存的上方，但这主要是对密集循环的 Power 优化。V1 预计大部分时间都会从 512KB 的 L1/L2 缓存中获取指令。</p>



<p>Veyron V1 的前端设计适合于大指令足迹的软件，这些足迹溢出了我们通常看到的 32KB 或 64KB 的指令缓存。在这种情况下，其他 CPU 会浪费功耗和时间在检查 L1i 上，并需要在两级缓存之间交换指令数据。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="330" height="311" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-4.png" alt="" class="wp-image-1492" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-4.png 330w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-4-300x283.png 300w" sizes="(max-width: 330px) 100vw, 330px" /><figcaption class="wp-element-caption">Veyron V1 的 floorplan，红框是指令和数据 L2 缓存</figcaption></figure>



<p>V1 的设计使用强制性的 L2 分区，牺牲了我们在其他 CPU 上看到的缓存容量灵活性。如果程序是少量代码在大量数据上循环，一个统一的 1MB L2 可以几乎使用其所有容量来存储数据。或者，如果一个应用的数据足迹很小，但代码足迹很大，则可以为指令缓存分配更多容量。</p>



<p>如果 Ventana 尝试使用一个统一的 L2 缓存，取指的流量可能会与数据侧的 L2 访问引起冲突。CPU 的前端是缓存带宽的重要消费者，因为每条指令都必须经由前端访问下级缓存系统来获得，但不是每条指令都会有数据侧的内存访问。此外，不完美的分支预测会导致在一个误预测分支之后的指令有多于一个的前端内存访问（因为第一次尝试取错了东西）。假设一个统一的 1MB 缓存充当 L1/L2 指令缓存和 L2 数据缓存，可能会遇到指令和数据访问之间的冲突。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="518" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-5-1024x518.png" alt="" class="wp-image-1497" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-5-1024x518.png 1024w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-5-300x152.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-5-768x388.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-5.png 1313w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">即使是一个不怎么高性能的 CPU 也需要大量的供指带宽</figcaption></figure>



<p>因此，Veyron V1 的 L2i 和 L2d 缓存各自需要足够的容量，以便在广泛的工作负载中都能充当有效的中层缓存。一个 512+512KB 的 L2 设置无疑会提供比统一的 512KB L2（如 AMD 的 Zen1 到 Zen3 中的）更好的缓存容量，但与 AMD 的 Zen4（以及一堆 ARM 的设计）上的统一 1MB L2 相比，可能会比较差。</p>



<p>译者：这样的设计也比较激进，这种设计的思路来源是依靠 BTB 存储信息的密度优势，减少靠近流水线部分的 memory 数量，然后依靠预取来掩盖较远的 L2 的延迟。但是这样设计也有很多不好解决的问题，例如下面提到的非对齐取指。</p>



<h2 class="wp-block-heading">非对齐取指支持</h2>



<p>如果你仔细看 Ventana 的演示文稿，他们宣称支持&#8221;每周期最多完整 64B 的的非对齐取指&#8221;。通常来说前端缓存访问是对齐的，也就是说向指令缓存发送的地址中最低的几位是零。例如，一个 32B 对齐的取指会隐式地将五个最低地址位归零。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="1025" height="279" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-6.png" alt="" class="wp-image-1500" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-6.png 1025w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-6-300x82.png 300w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-6-768x209.png 768w" sizes="(max-width: 1025px) 100vw, 1025px" /><figcaption class="wp-element-caption">非对齐的前端取指是什么，为什么可以提高供指带宽</figcaption></figure>



<p>支持非对齐的取指是挺不错的，因为即使分支跳转到一个缓存行的中间，也可以维持高取指带宽。但不知道 Ventana 是如何实现这一点的。通常，非对齐访问是通过在底层进行两次访问并合并输出的数据来处理的。数据缓存通常有足够的 SRAM 带宽，可以每个周期这样做。但是一个指令缓存能够做到，尤其是一个512KB的缓存，感觉有点过分。</p>



<p>译者：这里就发现 Ventana 这种设计的问题了，目前各家 CPU 支持非对齐的取指都是通过较细粒度的分 bank 来实现，比如 Apple 和 AMD。然而 L2 通常需要追求高密度，做太细粒度的分 bank 不太合适。观察 Ventana 放出的 floorplan，他们 L2 的分 bank 粒度也较粗，猜测可能就是 64B 或者更大。这样会带来新的功耗问题，因为每周期都需要访问两个这么大的 SRAM，还需要在前端处理 128B 的裁切，这个开销可不小。这个其实也和 Ventana 给出的功耗数据相印证，说明他们的功耗还有很大的优化空间。</p>



<h2 class="wp-block-heading">巨大的单级 TLB </h2>



<p>接着减少缓存层级的主题，Ventana 选择了单级指令和数据 TLB。每个都有 3K 项，与其他家的大 L2 TLB 容量相匹配。作为比较，AMD 的 Zen4 有一个3072 项的 L2 dTLB，而英特尔的 Golden Cove 有一个 2048 项的 L2 TLB。 TLB（地址翻译缓冲器）是虚拟地址到物理地址转换的缓存。在你的电脑上运行的程序通过虚拟地址访问内存，这些地址通过操作系统管理的页表映射到物理地址。通常，每个内存访问都需要一个地址转换，因此 CPU 有一个小但高度优化的L1 dTLB，它记住了最常访问页面的转换。</p>



<p>在指令方面，512KB 的 L1/L2 指令缓存的访问需要同时访问 L1 iTLB。这意味着大多数指令访问将会引起大 iTLB 的查找。因为代码通常顺序执行直到遇到分支，所以一个单读口的 TLB 应该足以满足多条指令。</p>



<p>在数据方面，Ventana 删除了L1 dTLB，并且采用了虚拟地址 L1 DCache。主 TLB 在通向 L2 的路上被访问，使其不需要像传统L1 dTLB那样对延迟和功耗敏感。</p>



<p>译者：这个其实也很不利于功耗的控制，Ventana 看起来就和香山的开发团队一样，首先追求性能，然后才是功耗面积等。这也不难理解，毕竟现在在 PPT 上性能最吸引人。</p>



<h2 class="wp-block-heading">VIVT 的 L1 数据缓存</h2>



<p>Veyron V1 有一个 64KB 的数据缓存。它是虚拟地址索引和虚拟地址标记的（VIVT），与其他CPU中使用的虚拟索引、物理标记的（VIPT）缓存不太一样。VIPT 缓存的重要之处在于它的行为和纯粹的物理地址缓存是一样的。传统上，虚拟地址的缓存有很多缺点：它们会在上下文切换或 TLB 维护操作时被刷新，因为更改虚拟地址到物理地址的映射意味着一个虚拟地址的缓存的内容不再是最新的。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="431" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-7.png" alt="" class="wp-image-1503" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-7.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-7-300x168.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>然而，Ventana 尝试通过在 L1d 标签中跟踪 ASID 来避免这些缺点。这让他们可以避免在上下文切换时刷新 L1 数据缓存。此外，L1d 可以处理多个虚拟地址映射到同一个物理地址的情况。也许 V1 在 L2 TLB 中记录一定数量的 VA 到 PA 别名，并在 snoop 请求出现时一次性使这些别名失效。</p>



<p>V1 的 L1d 仍然有四个周期的延迟，与 AMD 和 ARM 近期的 CPU 非常相似。他们没有从使用虚拟地址的 L1d 中获得任何延迟优势，但他们避免了维护 L1 dTLB 的功耗和面积开销。Ventana 在使用 VIVT 缓存上面临不少质疑，但我认为他们会没问题的。他们显然已经努力避免了虚拟地址缓存带来的最大问题。即使这种做法最终的缺失率高于同等大小的 VIPT L1d，那么他们 L2 的命中延迟其实也相对较低，只有 11-12 个周期，不会有太大的问题。</p>



<p>译者：这个 VIVT 缓存肯定是引起很多质疑的，因为历史上使用 VIVT 缓存的设计好像都活得不久。现在的操作系统似乎也很少认为修改页表会引起数据缓存上的开销。更别说这种设计还需要新的一致性处理机制，我猜测他们的验证成本会比较高。</p>



<p>译者：我还是很难理解 Ventana 这个减少各种 memory 的层级的设计，感觉并没有给他们带来什么可观的好处。如果他们的 L1d 延迟能进一步降低（降低一周期），我觉得用 VIVT 缓存 + 单级 TLB 就可以说是值得的。但是他们大费周章最终并没有体现在性能上，这就让我感觉不太值得。也许他们这个结构还有降低一拍的潜力，只是还未解决工程上的问题。 </p>



<h2 class="wp-block-heading">乱序执行引擎</h2>



<p>通常 CPU 会有多种执行端口。这是因为不同的执行单元专门用于不同的操作，而且足够的执行端口必须为 CPU 可能遇到的不同指令组合提供服务。Ventana 选择使用更少、更灵活（功能更多）的端口。尽管重命名宽度是8，Veyron V1 只有四个整数和访存共用的执行端口。直觉上，核心的吞吐量会受到缺乏执行资源的限制。</p>



<p>然而，即使前端的宽度很宽，执行资源很少被持续完全利用，因为在今天的高性能 CPU 中，吞吐量通常受到内存延迟的限制。Sandy Bridge 是一个 Intel 的例子，它的端口数量也相对较少。即便有时会遇到端口争用，也是因为某些工作负载压迫了特定端口后面的执行单元，而不是CPU整体的执行端口数量不足。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="688" height="355" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-8.png" alt="" class="wp-image-1518" style="width:850px;height:auto" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-8.png 688w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-8-300x155.png 300w" sizes="(max-width: 688px) 100vw, 688px" /></figure>



<p>因此，Veyron 出于减少功耗和面积的考虑，选择使用四个被充分利用的整数执行端口，而不是更多利用率较低的执行端口。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="768" height="113" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-9.png" alt="" class="wp-image-1519" style="width:1020px;height:auto" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-9.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-9-300x44.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>虽然 Veyron 的执行端口布局在 HotChips 上肯定引起了一些关注，但我不认为它有什么不寻常的。其他 CPU 通过让端口服务不同的指令类别也减少了执行端口的数量。英特尔长期以来将浮点和整数执行单元放在同一个端口后面。富士通的 A64FX 也有两个端口同时服务 AGU 和 ALU。</p>



<p>这种方法的好处也很明显。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>（Zen4 的向量寄存器堆）自寄存器堆的面积主要受读写端口的宽度和数量限制，而不是存储的限制以来，仅有很小的增长。 </p>
<cite>Kai Troester 在 HotChips 2023 上，关于 Zen4 的 AVX-512 实现</cite></blockquote>



<p>更多的端口意味着要么有更多的调度队列，要么使用更复杂的调度器，可以每周期选择多个操作。寄存器堆的面积是另一个考虑因素，更多的执行单元/发射端口就需要更多的寄存器堆端口来满足它们。避免这种面积增大是一个明智的举动。</p>



<h2 class="wp-block-heading">面积</h2>



<p>面积对 Ventana 来说也是重要的，因为他们的目标是高核心数量，减少面积有助于降低成本。Veyron V1 的面积小于 AMD 的 Zen4c 和 ARM 的 Neoverse V2。Ventana 平衡面积的设计决策在此起了作用，但 Veyron V1 为了减少面积使用也牺牲了性能：它不支持向量扩展，仅有一个标量浮点流水。相比之下，AMD 的 Zen4c 具有非常高的向量和标量浮点吞吐量。与 Neoverse V2 相比，Veyron V1 的 L2缓存容量较小。Ventana 无疑实现了良好的核心面积效率，但其非传统的设计决策使它至少在面积方面不是 Game Changer。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="768" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-10.jpg" alt="" class="wp-image-1521" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-10.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-10-300x300.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-10-150x150.jpg 150w" sizes="(max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption">与其他在 HotChips 2023 上展示的 CPU 核的对比</figcaption></figure>



<p>ARM 的 Neoverse N2 是另一个有趣的比较。它不如 Veyron V1 宽，具有较小的 BTB 和 TLB。V1 可能在整数应用上表现得更好，特别是如果那些代码具有较大的指令侧内存占用。但 N2 也有优势，比如一个非常基础的 2×128b 向量流水配置。</p>



<h2 class="wp-block-heading">Cluster 面积</h2>



<p>核心面积只是一部分，最近的手机和服务器 CPU 在互连和缓存这样的外围逻辑上花费了大量的面积。AMD 的 Bergamo 可以作为一个有趣的比较，因为 Ventana 计划使用类似 AMD 的 hub-spoke chiplet 配置来扩展到大量的核心。也就是说，Veyron V1 和 Zen4c 都使用计算模块连接到中心 IO 模块的这种封装形式。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="431" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-10.png" alt="" class="wp-image-1527" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-10.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-10-300x168.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>Ventana 在他们的 HotChips 演讲中提供了一个 16 核心 Veyron V1 Cluster 的图片，以及在 TSMC 5nm 工艺上的面积数据。AMD 也在他们的演讲中提供了一个 Zen4c 16 核心 CCD 的照片。在这里使用了 Fritzchens Fritz 的 69.49 平方毫米的数据作为 Zen4 CCD 的大小用于面积比较，并假设 Zen4c 的 CCD 占用类似的面积。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="431" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-11.jpg" alt="" class="wp-image-1528" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-11.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-11-300x168.jpg 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>乍一看，具有缓存和支持互连逻辑的 16 个 Veyron V1 核心相对于 AMD 的 Bergamo 有轻微的面积优势。然而，仔细查看 die shot 显示，Ventana 没有在他们的图片中包含芯片到芯片的接口。这种接口将占用大量的面积。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="438" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-11-1.jpg" alt="" class="wp-image-1530" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-11-1.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-11-1-300x171.jpg 300w" sizes="(max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption">通过 GIMP 将 CPU 核，L3 slice 和互联部分合并到一起</figcaption></figure>



<p>因此，Veyron V1 的计算模块大小可能与 AMD Bergamo 的不相上下。Veyron V1 每核享有更多的 L3 缓存容量：每核3MB，相比之下 AMD 是每核2MB。Ventana 的 Cluster 内互连还覆盖了 16 个核心及其关联的 L3 Slice，为任意核心提供 48MB 的 L3 容量。对 AMD 来说，他们的 Zen4c 核心拥有更灵活的统一 L2 缓存和更强大的浮点和向量执行能力。</p>



<h2 class="wp-block-heading">Cluster 内互连</h2>



<p>Ventana 使用类环形的互连。他们在演示上说有两个环，但在 2.5GHz 频率下 160GB/s 的对分带宽意味着每周期 64B。如果环每周期可以传32B，那么可能就只有一个环，然后环两侧都在传输。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="432" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-11.png" alt="" class="wp-image-1532" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-11.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-11-300x169.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>也许它是双环配置，然后每周期只能移动 16B。我不完全确定 Ventana 的互连在这里是什么样子，但基于环的互联往往能提供相当好的 L3 性能。希望Ventana 在这里做得很好，因为他们的分离的 512+512KB 的 L2 设计可能意味着 L3 看到的流量比具有 1MB 统一 L2 的设计更多。</p>



<h2 class="wp-block-heading">写在最后</h2>



<p>Veyron V1 有一套非常独特的设计决策。偏离常规是有风险的，因为历史上工程师已经弄清楚了在 CPU 设计上什么有效以及什么无效。这就是为什么成功的 CPU 有很多共同的设计特点。Ventana 似乎做得相当不错，他们没有落入任何明显的漏洞。他们通过硬件别名处理和 ASID 过滤缓解了 VIVT 缓存带来的问题。他们的分离 L2 设计在指令和数据两侧都有足够的缓存容量。他们大型的单级 BTB 和 TLB 要么具有足够低的延迟不会阻碍性能，要么不在性能关键路径上。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="432" src="https://blog.eastonman.com/wp-content/uploads/2024/02/image-12.png" alt="" class="wp-image-1533" srcset="https://blog.eastonman.com/wp-content/uploads/2024/02/image-12.png 768w, https://blog.eastonman.com/wp-content/uploads/2024/02/image-12-300x169.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></figure>



<p>尽管 Veyron V1 是 Ventana 的首款设计，它有望成为在标量整数应用领域的强力竞争对手。但 Ventana 在处理吞吐量密集型应用时将遇到更大的挑战。由于 V1 缺乏向量单元，即便 V2 搭载了向量单元，RISC-V 生态系统的成熟程度仍旧落后于 ARM，这就需要软件来支持 RISC-V 的向量扩展功能。许多吞吐量受限的软件如视频编码器、渲染器和图像处理应用是由社区维护的，而不同社区的对支持新指令集的优先程度不同，这使得对新指令集扩展的支持通常进展缓慢。ARM在努力成为x86可行替代品的过程中已经遇到了软件支持的难题，而RISC-V在这方面面临的挑战则更为严峻。</p>



<p>译者：Ventana 这个核心从开发的角度上来说感觉与香山处在类似的阶段，但是商业化上比香山做得更早更好。但是不知道是不是因为不寻常的设计决策拉长了验证周期，感觉 Ventana 的 IP 在进入硅的速度上比 SiFive 慢一点。</p>



<p>我们要感谢 Ventana 为他们的 Veyron V1 核心整理了非常好的演讲，并期待看到该公司在即将推出的 V2 设计上做了些什么。</p>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文大部分翻译自 <a href="https://chipsandcheese.com/" target="_blank" rel="noopener" title="">ChipsAndCheese</a>，添加有个人理解和资料补充 ，原文为英文，原文链接：<a href="https://chipsandcheese.com/2023/09/01/hot-chips-2023-ventanas-unconventional-veyron-v1/" target="_blank" rel="noopener" title="">https://chipsandcheese.com/2023/09/01/hot-chips-2023-ventanas-unconventional-veyron-v1/</a> 原作者：<a href="http://chlamchowder" target="_blank" rel="noopener" title="">chlamchowder</a></p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>本文中文翻译首发自我的博客 <a href="https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/" target="_blank" rel="noopener" title="">https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/</a> ，翻译已取得 ChipsAndCheese 编辑/原作者授权。因英文原文无公开的授权协议，本译文也禁止转载，如需转载请先联系我或 ChipsAndCheese。</p>
</blockquote>The post <a href="https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/">HotChips 2023: Ventana 不寻常的 Veyron V1</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2024/02/hot-chips-2023-ventanas-unconventional-veyron-v1/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
