x86 microarchitecture/SIMD 市场份额

x86 microarchitecture/SIMD market share

在哪里可以找到有关 "market share" x86 微体系结构的数据? x86 系列 CPU 的用户中有多少 CPU 支持 SSE4.2、AVX、AVX2 等?

我正在为我的程序分发预编译的二进制文件,我想知道什么是最佳优化目标,以及哪些 SIMD 扩展可以在没有运行时检查的情况下合理使用。

我可以找到英特尔与 AMD 的总体市场份额数据,但无法找到英特尔和 AMD CPU 各代的细分数据。理想情况下,我还希望按 OS 和按国家/地区进行细分,但即使是微体系结构的一般全球统计数据也总比没有好。

如果没有回退或安装时检测,任何比 SSE2(x86-64 的基准)更新的东西都没有 运行时间检查是有风险的。

遗憾的是,

AVX 和 BMI1/2 离基线还很远,因为英特尔仍在销售禁用 VEX 前缀解码的 Celeron/Pentium 芯片(大概是为了利用在 256 位执行中有缺陷的芯片单位),但 SSE4.2 越来越近,并且 SSSE3 是可能的。参见 , and

has a link to the Valve Hardware Survey for Steam clients (currently showing SSE3 as ~100% installed base, but SSSE3 only at 97%), so if you're shipping a PC game that should correlate pretty well with your target audience. The breakdowns are a bit weird, though, for some entries. Like fcmov(x87 无分支条件移动)被报告为已完成 down 到 97.5%,但每个 P6 兼容的 CPU 都有它。你找不到带有 SSE2 但没有 FCMOV 的 CPU。也许较新版本的 Steam 并未对其进行测试。也许旧版本的 Steam 没有测试 CMPXCHG16B?所以对它们持保留态度,但它们可能对 SSE2/3/SSSE3/SSE4.x 和 AVX 相当敏感。

对于服务器内容,您可以轻松地设置最低 SSE4.2。 Atom/Silvermont 支持它,AMD 和威盛的低功耗架构也是如此,所以节能服务器可以 运行 它。古代主流 CPU 往往不会在个人家庭服务器之外的服务器上得到太多使用,因为它们通常比 运行 更酷的更便宜的现代机器慢。

(Silvermont 不太可能很快支持 AVX,更不用说 AVX2 或 FMA。)


不必将自己限制在单个二进制文件。您甚至可以让人们选择何时下载,或者您的安装程序可以在安装时 select。

或者你可以有一个 运行-time 包装器来选择一个可执行文件和动态库,这样你就可以有效地获得 运行time 调度,同时仍然能够使用 gcc -O3 -march=haswell 或任何让编译器在所有地方使用新指令集的东西(特别有利于 BMI1/BMI2 有效的单 uop 变量计数移位)。

另一种选择是动态链接器技巧,在整个库的基础上或在每个函数的基础上,就像 glibc 用来将 memcpy 解析为 __memset_avx2_unaligned_erms

所有这些(每个函数的动态链接器技巧除外)比让您的代码在 运行 时间知道指令集扩展更容易,并且性能开销为零。 (除非你把东西放在一个动态库中,否则你不会有,所以它不能内联。)

解决这个问题的简单方法(作为一名前游戏程序员),就是为您希望支持的每个 CPU 级别(例如 SSE2、SSE4、AVX2)简单地编译二进制文件。游戏的 'executable' 只是一个 cpuid 检查,然后根据检测到的 CPU 运行正确的 exe。