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。
在哪里可以找到有关 "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 是可能的。参见
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。