windows 11今年的重要版本24H2即将公布。
本来是个好消息,但是会让很多人开始莫名的惊恐,原因就在于有消息说这次的24H2版本对CPU的一个叫做POPCNT的指令提出了要求。
具体说就是——如果你的CPU不包含POPCNT指令的话,是无法升级到24H2版本的。
不过,担心归担心,POPCNT指令最早出现在intel Nehalem微架构中,从2008年末期开始出现到现在已经将近15年时间了。带有同等指令的AMD K10的出现也是2007年的事情了。
所以,在大部分情况下Windows 11 24H2所不能支持的CPU大部分是2010年之前生产的,至今也都有十三、四年的历史了。所以,在当下,我们并不需要太担心自己的CPU对24H2的支持度的问题。并且,十几年前的老电脑再来跑最新发布的操作系统本身处理性能的羸弱带来的酸爽也是让人难以忍受的。
微软敢冒天下之大不韪强推24H2本身也就掀不起什么波澜。
那么问题来了,究竟POPCNT指令是什么?为什么POPCNT会被强制加入到最新操作系统的必须支持之列?未来会给我们带来什么影响?这些问题才是现在我们要关注的要点。
POPCNT指令是一种计算机处理器指令,用于计算寄存器或内存中位值为1的位数。它的名称是"Population Count"的缩写,意为"人口统计",也被称为"位计数"指令。在2010年,intel 将POPCNT指令加入了SSE4.2指令集中,SSE(Streaming SIMD Extensions,流式SIMD扩展),在更早的2007年,AMD在3D now指令集中也加入了POPCNT指令。这两家公司所生产的带有POPCNT指令的CPU依靠各自的指令集完成向量运算和多媒体解码等计算繁重的任务。
而POPCNT这个指令并非最早早2007年出现,如果追溯更早的运用案例,早在1960年代,IBM的7030机中就已经包含了这一个指令,这里要说明的一点是虽然年代久远,但IBM 7030是一台不折不扣的64位机。
虽然这种机器只有2兆内存,连现在的一张图片都未必装得下,但这东西是64位的。
后面的一些高端计算机产品,例如克雷的大型机、CDC Cyber 70、Sun的SPARC小型机都相继在64bit指令中包含了这个指令。
只不过是intel和AMD在2010年代初期将这个指令集引入了个人电脑领域而已。
POPCNT的指令运算其实很简单,例如一个二进制数字“011001001100”,经过POPCNT运算后会返回结果5,一个二进制数“001100110001”经过POPCNT运算也会返回5,再例如二进制数“0111”经过运算会返回3,再再例如一个十进制数字1000056经过运算会返回10……
实际上POPCNT的作用就是用来统计一个二进制数中1的个数。一个二进制数字中1的数量,在密码学中有一个概念叫做汉明权重——Hamming weight,它的定义是指一个二进制数中非零位的个数量。二进制嘛不是0就是1,实际上,最早POPCNT这个指令就是为了取得汉明权重来建立起来的。
现在的新操作系统利用汉明权重主要会应用在三个方面:密码学中密钥生成、密码哈希等功能汉明权重有着至关重要的作用,最简单的应用上大家常说的ECC内存本身的校验功能实际上也是基于汉明权重的,只不过ECC的校验是在内存芯片中自主完成;大数据处理,机器学习、人工智能、大数据的领域中,需要对大规模数据进行快速、高效的处理和分析。而汉明权重的计算在这些数据处理任务中经常会被用到;性能优化,对越来越复杂的应用场景和用户需求。汉明权重的计算是一种常见的计算任务,对其进行优化可以提高整体系统的性能。
实际上,汉明权重并不是一个特别复杂的操作过程,如果写成C语言的话就是这样的:
#include <stdio.h>// 计算一个无符号整数的汉明权重int popcnt(unsigned int n) {int count = 0;while (n != 0) { count += n & 1; // 判断最低位是否为1 n >>= 1; // 右移一位,将最低位舍弃 }return count;}int main() { unsigned int num = 0b10101011; // 二进制表示的数 printf("汉明权重为:%d\n", popcnt(num)); return 0;}从程序中我们可以看到调用popcnt函数后,函数中有一个循环进行计数,输入的内容n有多少位,这个函数中的循环就要运行多少遍。
在CPU中固定的电路其指令只需要一步就可以得到输入数的汉明权重
类似于intel的SIMD电路(上图B)不仅仅简化了电路处理,而且也提高了数据流的处理效率,整体的运算速度也就更快了。
这也就是为什么POPCNT被强制加入到系统支持功能中能给系统带来的优势。
对于现在的ARM用户,例如苹果M系列的电脑,本身ARM指令VCNT就是等价于POPCNT的,早在ARM CPU被设计之初就包含在CPU的功能之内了这个指令叫做VCNT,和POPCNT完成相同的操作。
实际上,Windows 11 24H2选择强制使用POPCNT本来就是慢了一步的节奏,只不过因为windows的应用广泛,导致大家一听到CPU不带POPCNT就不能用24H2出现了不必要的恐慌。但这种几经上热搜的消息,你如果深入的了解一下你就会发现,事情本身没什么大不了的。