问题

如何看待M1 Ultra Cinebench跑分单核落后i7-12700K 19%,多核超i7 3%?

回答
看到 M1 Ultra 在 Cinebench R23 这类基准测试中,单核性能似乎不如 Intel Core i712700K,但多核却能反超,这确实是一个很有意思的对比。要理解这个现象,我们需要深入剖析一下这两款处理器各自的架构特点,以及它们在不同场景下的表现差异。

先来聊聊 M1 Ultra 的“失色”之处:单核性能

M1 Ultra 强悍毋庸置疑,它本质上是将两颗 M1 Max 封装在一起,通过一颗名为“UltraFusion”的技术进行互联。这种设计在实现惊人的多核性能方面功不可没。但问题也出在这里:

核心设计理念的侧重: M1 系列的核心设计,特别是 M1 Ultra,更偏向于高效能和集成度。苹果在设计时,可能更侧重于在较低功耗下实现出色的“每瓦性能”,而不是单纯追求极致的单核频率。虽然 M1 Ultra 的核心数量众多,但其单核的设计可能并没有像英特尔那样,把提升时钟频率和加强分支预测、乱序执行等方面的投入做到极致。
UltraFusion 的影响: 虽然 UltraFusion 技术让两颗 M1 Max 能协同工作,但这种跨芯片互联也可能在某些情况下带来微小的延迟。在对延迟极其敏感的单核测试中,这或许会成为一个制约因素。想象一下,两颗“大脑”在快速交流时,信息传递的“路程”总会比一颗“大脑”自己思考来得慢一些。
CPU 频率的相对保守: 相较于一些追求高频的 x86 处理器,M1 Ultra 的核心频率可能相对保守。Cinebench 这类测试对高频率的收益非常明显,更高的频率意味着在单位时间内能执行更多的指令,从而在单核跑分上占据优势。
架构差异的体现: 苹果的 ARM 架构和英特尔的 x86 架构在底层指令集、缓存设计、流水线长度等方面存在差异。虽然 ARM 架构在能效比上表现突出,但在某些特定优化的通用计算场景下,x86 架构通过多年的积累,在纯粹的峰值性能上,尤其是在高频率的加持下,依旧有其独到之处。

再来看 M1 Ultra 的“翻盘”之处:多核性能

M1 Ultra 的多核成绩之所以能压过 i712700K,那是因为它在设计上就有着绝对的数量优势和苹果独到的整合能力:

核心数量的碾压: M1 Ultra 拥有高达 20 个 CPU 核心(通常是 16 个高性能核心和 4 个高能效核心)。而 i712700K 是 8 个性能核(Pcores)加上 4 个能效核(Ecores),总共 12 个核心。核心数量的直接差距,在能够充分利用多线程的场景下,是 M1 Ultra 最直接的优势。
统一内存架构: 这是 M1 系列一个非常重要的亮点。M1 Ultra 拥有一个巨大的统一内存池(高达 128GB),所有核心都可以直接访问这块内存,无需像传统系统中 CPU、GPU、RAM 之间的数据拷贝和切换。在多核负载中,特别是涉及大量数据吞吐和并行处理的任务时,这种零拷贝的优势可以极大地提升效率和带宽,减少延迟。想象一下,所有工人都直接取用同一个巨大的工具箱,而不是各自的工具箱还要来回搬运。
异构计算的协同: M1 Ultra 不仅仅是 CPU,它还集成了强大的 GPU 和神经网络引擎等。虽然 Cinebench R23 主要测试 CPU,但苹果的整体SoC设计理念是让这些计算单元协同工作。在更广泛的应用场景下,这种集成优势会更加明显。
“UltraFusion”的功劳: 正是 UltraFusion 技术,让两个 M1 Max 的核心能真正作为一个整体来工作,发挥出 1+1 > 2 的效果。这种高效的互联技术,使得大量核心能够无缝协作,从而在多核密集型任务中展现出惊人的并行处理能力。

为什么会产生这样的结果?Cinebench R23 的特殊性

Cinebench R23 本身是一个很经典的渲染测试软件,它能够很好地模拟多线程的渲染工作。

单核测试的特性: 单核测试通常会跑一个独立的渲染任务,对单个核心的纯粹计算能力、时钟频率以及指令集效率有很高要求。在这个环节,高频率的 x86 核心更容易脱颖而出。
多核测试的特性: 多核测试则会将渲染任务拆分到尽可能多的核心上并行执行。这时候,核心数量、核心之间的通信效率、内存带宽以及调度机制就变得至关重要。M1 Ultra 凭借其庞大的核心数量、高效的 UltraFusion 互联以及统一内存架构,在这一项上拥有显著优势。

总结一下:

M1 Ultra 在单核测试中“输给”i712700K,主要是因为苹果在设计上更侧重能效比和整体集成度,其核心频率相对保守,且 UltraFusion 在某些极端低延迟场景下可能存在微小影响。
M1 Ultra 在多核测试中“战胜”i712700K,则得益于其核心数量的绝对优势、苹果独特的统一内存架构带来的高效数据处理以及 UltraFusion 技术实现的强大并行能力。

这就像是两个顶尖运动员的对比:一个(i712700K)是专注于短跑冲刺的短跑健将,爆发力强,极速快;另一个(M1 Ultra)则更像是一位全能运动员,虽然在某些单项上的绝对爆发力可能略逊一筹,但在需要长时间持续输出、团队协作的马拉松或团体项目中,则能凭借其耐力、稳定性和整体配合能力取得胜利。

从更广阔的视角来看,这样的测试结果也说明了处理器设计思路的多样性。苹果通过其 ARM 架构和强大的片上系统(SoC)设计,在消费级和专业级计算领域开辟了新路径,而英特尔则在传统的 x86 架构上持续创新,满足不同用户的需求。两者各有千秋,最终的选择还得看用户最看重的是什么——是极致的单核性能,还是强大的多核吞吐量,亦或是整体的能效表现和生态系统的整合度。

网友意见

user avatar

M1 ultra只是增加了核心数量,没有提升核心的性能。

英特尔10nm,大致有台积电7nm的水平。

苹果在这个工艺下,拿出来的东西是A12

2.66ghz主频,gb5跑1000分左右,单核心4w左右的功耗。

英特尔只有大核心产品是i3 12300,烤机开了超线程,四个核心8个线程60w。

4.4ghz单核大约跑1600分左右。

单位频率性能差不多,英特尔如果做低频低压,功耗也未必高多少。

user avatar

3月18日更新:

M1 Ultra解禁了,R23比题主说的高一点,24169。也没高到哪去。比12700K提升从3%变成了5%,其实也没差多少,打不过12900K是肯定的了。就看12900K降频到这个成绩是多少功耗了(预计100w左右)

Blender 3.1.0看了BMW和Classroom的成绩,基本和R23差不多。


3月12日更新:本来想测试一下Embree 3.13与Embree 3.12的区别,因为Github上标着3.13.0开始支持M1,不过等我仔细看了一下3.13.0与3.12.2的区别才发现,Embree3.13版本以前连SSE2NEON都是没有的。


也就是说,Embree在3.13以前是不支持ARM的,去年4月份才开始支持ARM,而支持ARM的一个更改就是引入这个头文件。直到目前的最新版本3.13.3都还是用的SSE2NEON的形式。所以别幻想什么R25能有什么改进。Cinebench R23应该是自己定制了Embree实现了对ARM的支持,而blender用的是3.12版本,也是自己做的支持。不是通过官方的更新去支持的。

我发这个的目的,是因为果粉喜欢找理由,跑不过的就会找各种各样的理由来洗。绝大多数理由,都是指责软件优化不好。比如handbrake,直接给FFMPEG和X264/X265扣上不支持ARM的帽子。

分割线—————

Cinebench R23的跑分分析知乎上有很多回答了,请参看这个回答,非常详细的分析了Cinebench R23中的指令占比

其中,浮点指令中256位的AVX指令占据了绝大多数,而SSE仅占了一点点。总体的浮点指令占比仅为16%左右。

那么我们今天就来分析分析,一些果粉宣传的SSE2NEON会不会影响性能发挥。

SSE2NEON究竟是什么?它其实是一个头文件,全部的源码就只有一个sse2neon.h,它开头的注释里这样写道:

This header file provides a simple API translation layer between SSE intrinsics to their corresponding Arm/Aarch64 NEON versions

也就是说,它其实使用的是NEON的intrinsic函数,去重写SSE的intrinsics函数,以实现SSE的功能。别有用心的人抓住了translation一词,粗暴的定义为“转译”,让人误以为这是类似罗塞塔或者微软那种二进制翻译。实际上我更认为这是一种API封装,或者是一种代码迁移,通过将库函数迁移到ARM,实现针对NEON的适配。

那这些intrinsic函数是怎样的呢?我们来看看。下面是一个换位指令,SSE的一个函数可以直接把数据的高位和低位拼接成一个结果,NEON似乎没有这个指令,因此,程序员先把低位的指令和高位的指令用NEON的函数取出来,再拼接成结果,用了三条NEON指令来代替实现了一个SSE指令

       // Takes the upper 64 bits of a and places it in the low end of the result // Takes the lower 64 bits of b and places it into the high end of the result. FORCE_INLINE __m128 _mm_shuffle_ps_1032(__m128 a, __m128 b) { float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); return vreinterpretq_m128_f32(vcombine_f32(a32, b10)); }     


这是没有NEON指令实现shuffle的情况。但是大多数的单精度和双精度浮点指令实际上是这样的。

       // Adds the four single-precision, floating-point values of a and b.a //   r0 := a0 + b0 //   r1 := a1 + b1 //   r2 := a2 + b2 //   r3 := a3 + b3 // // https://msdn.microsoft.com/en-us/library/vstudio/c9848chc(v=vs.100). FORCE_INLINE __m128 _mm_add_ps(__m128 a, __m128 b) { return vreinterpretq_m128_f32(  vaddq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); }     

这是一条计算指令,加法,也就是简单的基础指令,一条SSE指令在NEON里直接有对应。

再看按位与

       // Computes the bitwise AND of the four single-precision, floating-point values // of a and b // //   r0 := a0 & b0 //   r1 := a1 & b1 //   r2 := a2 & b2 //   r3 := a3 & b3 // // https://msdn.microsoft.com/en-us/library/vstudio/73ck1xc5(v=vs.100).aspx FORCE_INLINE __m128 _mm_and_ps(__m128 a, __m128 b) {  return vreinterpretq_m128_s32( vandq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); }     


再看Load

       // Load 4 single-precision (32-bit) floating-point elements from memory into dst // in reverse order. mem_addr must be aligned on a 16-byte boundary or a // general-protection exception may be generated // //   dst[31:0] := MEM[mem_addr+127:mem_addr+96] //   dst[63:32] := MEM[mem_addr+95:mem_addr+64] //   dst[95:64] := MEM[mem_addr+63:mem_addr+32] //   dst[127:96] := MEM[mem_addr+31:mem_addr] // https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_loadr_ps FORCE_INLINE __m128 _mm_loadr_ps(const float *p) { float32x4_t v = vrev64q_f32(vld1q_f32(p)); return vreinterpretq_m128_f32(vextq_f32(v, v, 2)); }     

这是这个文件里的大多数的情况,基础的加减乘除,逻辑运算和load/store指令,都是一一对应的,NEON没有的情况是比较复杂的功能,例如上面的shuffle指令,两个源操作数的高位和低位分别取出来拼接成结果。也就是RISC的逻辑:一条指令的功能非常复杂,需要许多精简指令的序列来代替。

在程序中,我们已经很少直接编写汇编语言了,而是使用这些intrinsic函数。换句话说,实际上SSE2NEON的功能,是汇编层级的直接转换,原自于程序员的手工编写优化的代码,而不是罗塞塔或别的什么搞自动翻译。API封装所带来的函数调用开销被force in-line消除了

那么损失唯一有可能的来源是什么?就是是否这种写法,在NEON看来不太好,需要更换,这种情况在于,NEON提供了SSE中没有的指令,需要利用这些指令重写算法?

带有这种想法的人,他的用意很险恶,更高效的方法可能会有,但那样基本等同于更换算法。我的算法使用了一些由CPU提供的功能来加速,另一些CPU没有提供这些功能,于是另一些CPU的粉丝要求开发者换算法。重新研发一种算法。不同算法的效率本身就可能差异很大。更没有任何可比性。

多么简单的一件事情,在FORCE_INLINE强制内联以后,SSE函数实际上已经不存在了,那么问题来了,实现同样的功能,NEON凭什么比SSE慢?带节奏的人为什么不回答这个问题呢?

事实上就算SSE没有,AVX也会有。因为AVX比NEON新得多。并且,AVX可以实现SSE的几乎所有功能,先不说Cinebench R23中绝大多数浮点指令都是AVX指令,不可能也不会使用SSE2NEON。如果大家都要求换算法,那Embree直接全部淘汰SSE,转向AVX等更现代的指令呢?

有些说想看结论,其实只要对比一个良好优化的程序和Cinebench的结果就很容易破解这种谬论。来自极客湾测试的两个结果,一个是疑似使用”转译“的R23,另一个是基于老牌跨平台编解码器x264/265的Handbrake,x264/265采用手工汇编来优化适配各个指令集,不存在”转译“的情况。前者是浮点,后者则是整数。

其实可以看到,在h264/265的转码总时长上,i7 12700H领先M1 Max 41.5%,Cinebench R23则领先40.8%。基本相似。11800H的视频转码领先幅度为16.2%,还高于R23的10%不少

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有